搜 索

机器学习从入门到放弃

  • 249阅读
  • 2023年04月15日
  • 0评论
首页 / AI/大数据 / 正文
本文属于《从入门到放弃》系列,但这次我希望你能坚持到最后再放弃,至少也要放弃在一个体面的位置。

前言:为什么我又开始学机器学习了

在B站偶尔刷到三个月从零入门深度学习,保姆级学习路线图,看完之后深受启发。

说"深受启发"是客气的,实际上是深受刺激

因为我发现,我之前学的那些零零散散的机器学习知识,就像是:

  • 会用sklearn调个API,但不知道底层原理
  • 看过吴恩达的课,但看完就忘
  • 知道什么是过拟合,但不知道怎么解决
  • 能跑通一个Demo,但换个数据集就懵逼

这种状态,就像是学了三年英语,只会说"How are you"和"Fine, thank you, and you?"

所以,我决定系统地重新学一遍。

这篇文章,记录我的学习路线、资料整理、踩坑经验,以及(可能的)放弃时刻。如果你也在学机器学习,希望这篇文章能帮你少走一些弯路。

graph LR A["我以为的学习曲线"] --> B["稳步上升📈"] C["实际的学习曲线"] --> D["入门"] D --> E["感觉良好"] E --> F["遇到公式"] F --> G["开始怀疑人生"] G --> H["想放弃"] H --> I["咬牙坚持"] I --> J["突然开窍"] J --> K["又遇到新概念"] K --> G style B fill:#1dd1a1,color:#fff style G fill:#ff6b6b,color:#fff style H fill:#ff6b6b,color:#fff style J fill:#1dd1a1,color:#fff

一、学习路线总览

1.1 整体时间规划

作者在视频中将学习路线分为6个阶段,总计约3个月:

gantt title 机器学习三个月学习计划 dateFormat YYYY-MM-DD section 基础知识 数学基础(线代/概率/统计) :a1, 2024-01-01, 14d Python数据分析 :a2, after a1, 7d section 机器学习 ML理论入门 :b1, after a2, 21d ML实战 :b2, after b1, 7d section 深度学习 DL理论入门 :c1, after b2, 21d DL实战 :c2, after c1, 14d section 面试准备 刷题+面试 :d1, after c2, 7d
阶段内容时长难度
1️⃣ 基础知识线代、概率统计、Python3周⭐⭐
2️⃣ ML理论经典算法原理、公式推导3周⭐⭐⭐⭐⭐
3️⃣ ML实战Sklearn、Kaggle比赛1周⭐⭐⭐
4️⃣ DL理论神经网络、CNN、RNN等3周⭐⭐⭐⭐
5️⃣ DL实战PyTorch、项目实战2周⭐⭐⭐
6️⃣ 面试八股文、项目复盘1周⭐⭐⭐

注意:这个时间是作者给出的"理想时间"。根据我的经验,实际时间 = 理想时间 × 2(如果你还要上班的话,再 × 2)。

1.2 学习路线图

flowchart TB subgraph 基础["🧱 基础知识 (3周)"] MATH["数学基础
线代 + 概率 + 统计"] PYTHON["Python基础
NumPy + Pandas + Matplotlib"] end subgraph ML["🤖 机器学习 (4周)"] ML_THEORY["理论入门
《统计学习方法》"] ML_PRACTICE["实战入门
Sklearn + Kaggle"] end subgraph DL["🧠 深度学习 (5周)"] DL_THEORY["理论入门
神经网络 + CNN + RNN"] DL_PRACTICE["实战入门
PyTorch + 项目"] end subgraph JOB["💼 求职 (1周)"] INTERVIEW["面试准备
八股文 + 项目"] end MATH --> PYTHON PYTHON --> ML_THEORY ML_THEORY --> ML_PRACTICE ML_PRACTICE --> DL_THEORY DL_THEORY --> DL_PRACTICE DL_PRACTICE --> INTERVIEW style MATH fill:#74b9ff,color:#000 style ML_THEORY fill:#55efc4,color:#000 style DL_THEORY fill:#a29bfe,color:#000 style INTERVIEW fill:#fd79a8,color:#000

二、基础知识篇

很多人一上来就想学模型、调参数,结果看到公式就懵逼。数学基础不牢,地动山摇

Basic Knowledge

2.1 线性代数

为什么要学:机器学习的本质就是矩阵运算。神经网络的前向传播、反向传播,全是矩阵乘法。

需要掌握的内容

mindmap root((线性代数)) 向量 向量加法 点积/内积 向量范数 矩阵 矩阵乘法 转置 逆矩阵 行列式 特征分解 特征值 特征向量 SVD分解 应用 PCA降维 最小二乘法
概念重要程度在ML中的应用
矩阵乘法⭐⭐⭐⭐⭐神经网络的所有计算
转置⭐⭐⭐⭐⭐到处都是
逆矩阵⭐⭐⭐⭐线性回归的解析解
特征值/向量⭐⭐⭐⭐PCA、矩阵分解
SVD⭐⭐⭐⭐推荐系统、降维
范数⭐⭐⭐⭐正则化(L1、L2)

学习资源

2.2 概率论与统计

为什么要学:机器学习的另一个本质是概率。贝叶斯、最大似然、交叉熵,全是概率的概念。

需要掌握的内容

mindmap root((概率统计)) 基础概念 随机变量 概率分布 期望/方差 常见分布 正态分布 伯努利分布 多项分布 贝叶斯 条件概率 贝叶斯公式 先验/后验 统计推断 最大似然估计MLE 最大后验估计MAP 假设检验

核心公式(必须记住)

贝叶斯公式:P(A|B) = P(B|A) * P(A) / P(B)

极大似然估计:θ_MLE = argmax P(X|θ)

交叉熵损失:H(p,q) = -Σ p(x) log q(x)

学习资源

2.3 Python数据分析

为什么要学:工具不熟练,就像厨师不会用刀。NumPy和Pandas是机器学习的基础设施。

需要掌握的库

用途重要程度
NumPy数值计算、矩阵运算⭐⭐⭐⭐⭐
Pandas数据处理、清洗⭐⭐⭐⭐⭐
Matplotlib数据可视化⭐⭐⭐⭐
Seaborn统计可视化⭐⭐⭐
Scikit-learn机器学习库⭐⭐⭐⭐⭐

学习资源

2.4 我的踩坑经验

graph TB subgraph 错误做法 W1["跳过数学直接学模型"] --> R1["看论文看不懂"] W2["只看视频不动手"] --> R2["看完就忘"] W3["追求大而全"] --> R3["什么都会一点,什么都不精"] end subgraph 正确做法 C1["先打好数学基础"] --> G1["理解模型本质"] C2["边学边敲代码"] --> G2["记得牢"] C3["深入一个方向"] --> G3["建立知识体系"] end style W1 fill:#ff6b6b,color:#fff style W2 fill:#ff6b6b,color:#fff style W3 fill:#ff6b6b,color:#fff style C1 fill:#1dd1a1,color:#fff style C2 fill:#1dd1a1,color:#fff style C3 fill:#1dd1a1,color:#fff

我的建议

  1. 数学不用学得太深,但核心概念必须理解
  2. 推荐先看速成视频,再根据需要深入
  3. 边学边用Jupyter Notebook敲代码验证

三、机器学习理论篇

这是最硬核的部分,也是最容易放弃的部分。但如果你能挺过去,后面就是坦途。

ML Theory

3.1 学习路径

flowchart LR subgraph 入门算法 LR["线性回归"] LOG["逻辑回归"] NB["朴素贝叶斯"] end subgraph 进阶算法 DT["决策树"] RF["随机森林"] SVM["支持向量机"] end subgraph 集成方法 BAG["Bagging"] BOOST["Boosting"] XGB["XGBoost"] end subgraph 降维聚类 PCA["PCA"] KMEANS["K-Means"] DBSCAN["DBSCAN"] end LR --> LOG --> NB NB --> DT --> RF --> SVM SVM --> BAG --> BOOST --> XGB XGB --> PCA --> KMEANS --> DBSCAN

3.2 核心算法详解

必学算法清单

算法类型难度是否需要手推
线性回归回归⭐⭐
逻辑回归分类⭐⭐⭐✅✅✅
朴素贝叶斯分类⭐⭐⭐✅✅
决策树分类/回归⭐⭐⭐
随机森林集成⭐⭐⭐
SVM分类⭐⭐⭐⭐⭐选学
AdaBoost集成⭐⭐⭐⭐✅✅
GBDT集成⭐⭐⭐⭐✅✅
XGBoost集成⭐⭐⭐⭐⭐✅✅✅
K-Means聚类⭐⭐
PCA降维⭐⭐⭐

3.3 需要手推公式的算法

这是原视频作者特别强调的,也是面试高频考点:

1. 逻辑回归与最大熵

Sigmoid函数:σ(z) = 1 / (1 + e^(-z))

损失函数(交叉熵):
L(w) = -Σ[y_i * log(p_i) + (1-y_i) * log(1-p_i)]

梯度:
∂L/∂w = Σ(p_i - y_i) * x_i

面试必问

  • 为什么用交叉熵而不是MSE?
  • 逻辑回归如何处理多分类?
  • 正则化如何加入?

2. 朴素贝叶斯

贝叶斯公式:P(Y|X) = P(X|Y) * P(Y) / P(X)

朴素假设:P(X|Y) = Π P(x_i|Y)

预测:y = argmax P(Y) * Π P(x_i|Y)

面试必问

  • "朴素"是什么意思?
  • 如何处理连续特征?
  • 拉普拉斯平滑是什么?

3. 提升树(GBDT与AdaBoost)

AdaBoost:
- 初始化权重 w_i = 1/N
- 训练弱分类器 h_t
- 计算误差率 ε_t
- 计算分类器权重 α_t = 0.5 * ln((1-ε_t)/ε_t)
- 更新样本权重

GBDT:
- 初始化 f_0(x) = 0
- 计算残差 r_i = y_i - f_{m-1}(x_i)
- 拟合残差,得到新树 h_m
- f_m(x) = f_{m-1}(x) + h_m(x)

4. XGBoost

目标函数:
Obj = Σ L(y_i, ŷ_i) + Σ Ω(f_k)

其中正则项:
Ω(f) = γT + 0.5λΣw_j²

二阶泰勒展开:
Obj ≈ Σ[g_i * f(x_i) + 0.5 * h_i * f²(x_i)] + Ω(f)

其中:
g_i = ∂L/∂ŷ (一阶梯度)
h_i = ∂²L/∂ŷ² (二阶梯度)

面试必问

  • XGBoost和GBDT的区别?
  • 为什么要用二阶泰勒展开?
  • XGBoost如何处理缺失值?
  • XGBoost如何并行?

学习资源

3.4 学习方法建议

graph TB subgraph 学习一个算法的正确姿势 A["1. 先了解算法解决什么问题"] --> B["2. 理解算法的直觉/思想"] B --> C["3. 学习数学推导"] C --> D["4. 手推一遍公式"] D --> E["5. 用代码实现一遍"] E --> F["6. 用sklearn调API"] F --> G["7. 在Kaggle上实战"] end style A fill:#74b9ff,color:#000 style D fill:#fd79a8,color:#000 style G fill:#55efc4,color:#000

我的经验

  1. 不要死记公式,要理解为什么是这个公式
  2. 手推公式时,用纸笔而不是只看
  3. 推完公式后,自己写一遍Python实现
  4. 然后再用sklearn,感受两者的差异

四、机器学习实战篇

理论学完了,是时候动手了。实战才是检验学习效果的唯一标准。

ML Practice

4.1 Scikit-learn速查

# 机器学习通用流程
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report

# 1. 数据准备
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 2. 特征工程
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 3. 模型训练
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)

# 4. 预测评估
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

# 5. 调参优化
from sklearn.model_selection import GridSearchCV
param_grid = {'n_estimators': [50, 100, 200], 'max_depth': [5, 10, 15]}
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X_train, y_train)
print(f"Best params: {grid_search.best_params_}")

4.2 Kaggle入门比赛推荐

比赛难度学习点
Titanic入门必做,分类问题
House Prices⭐⭐回归问题,特征工程
Digit Recognizer⭐⭐图像分类入门
Santander⭐⭐⭐大规模数据处理

4.3 实战学习资源

  • 📖 《阿里云天池大赛赛题解析(机器学习篇)》 - 真实比赛案例
  • 📺 Kaggle官方教程
  • 📂 各种Kaggle Notebook(多看高分方案)

五、深度学习理论篇

如果说机器学习是手工打造特征,那深度学习就是让机器自己学特征。

Deep Learn Theory

5.1 学习路径

flowchart TB subgraph 基础 NN["神经网络基础
前向传播/反向传播"] ACT["激活函数
ReLU/Sigmoid/Tanh"] OPT["优化器
SGD/Adam/AdaGrad"] REG["正则化
Dropout/BN"] end subgraph 架构 CNN["CNN卷积神经网络
图像处理"] RNN["RNN循环神经网络
序列处理"] LSTM["LSTM/GRU
长序列记忆"] TRANS["Transformer
注意力机制"] end subgraph 应用 CV["计算机视觉
分类/检测/分割"] NLP["自然语言处理
文本分类/生成"] REC["推荐系统
协同过滤/深度学习"] end NN --> ACT --> OPT --> REG REG --> CNN --> RNN --> LSTM --> TRANS TRANS --> CV TRANS --> NLP TRANS --> REC

5.2 核心概念

反向传播(最重要!)

前向传播:z = Wx + b, a = σ(z)

损失函数:L = loss(y, a)

反向传播(链式法则):
∂L/∂W = ∂L/∂a * ∂a/∂z * ∂z/∂W

必须理解

  • 为什么需要反向传播?
  • 梯度消失/爆炸是什么?
  • 如何解决梯度消失?

常见网络结构

结构特点应用场景
MLP全连接表格数据
CNN局部连接、权值共享图像
RNN时序依赖序列数据
LSTM长期记忆长序列
Transformer自注意力NLP、CV

5.3 学习资源

六、深度学习实战篇

理论再好,不如动手跑一个模型。

Deep Learn Practice

6.1 PyTorch快速入门

import torch
import torch.nn as nn
import torch.optim as optim

# 定义网络
class SimpleNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 64)
        self.fc3 = nn.Linear(64, 10)
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.2)
    
    def forward(self, x):
        x = x.view(-1, 784)
        x = self.dropout(self.relu(self.fc1(x)))
        x = self.dropout(self.relu(self.fc2(x)))
        x = self.fc3(x)
        return x

# 训练流程
model = SimpleNet()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

for epoch in range(10):
    for batch_x, batch_y in dataloader:
        optimizer.zero_grad()
        outputs = model(batch_x)
        loss = criterion(outputs, batch_y)
        loss.backward()
        optimizer.step()

6.2 实战项目建议

项目难度学习点
MNIST手写数字入门必做
CIFAR-10图像分类⭐⭐CNN实践
情感分析⭐⭐NLP入门
图像风格迁移⭐⭐⭐GAN理解
YOLO目标检测⭐⭐⭐⭐实际应用

七、面试准备篇

学了这么多,最终还是要找工作的。面试是最后一道坎。

Interview

7.1 高频面试题

mindmap root((ML面试)) 基础理论 偏差方差权衡 过拟合欠拟合 交叉验证 评估指标 经典算法 LR原理及推导 SVM原理 树模型对比 XGBoost细节 深度学习 反向传播 梯度消失 BN原理 注意力机制 项目经验 数据处理 特征工程 模型选择 调参经验

7.2 必看资料

  • 📖 《百面机器学习》 - 面试圣经,必看
  • 📖 《统计学习方法》 - 理论基础
  • 📺 各种面经(牛客、知乎)

7.3 面试Tips

  1. 理解 > 背诵:面试官能看出来你是背的还是理解的
  2. 准备项目:至少准备2-3个能深入讲的项目
  3. 诚实:不会就说不会,别瞎编
  4. 沟通:技术面也是沟通能力的体现

八、我的学习记录

这部分记录我自己的学习进度,持续更新。

8.1 Milestone

日期内容状态心得
2024-01-01开始学习万事开头难
2024-01-07线性代数复习完成3B1B的视频太棒了
2024-01-14概率统计复习完成贝叶斯公式终于搞懂了
2024-01-21Python数据分析Pandas真香
2024-02-01逻辑回归推导手推了3遍才懂
2024-02-10树模型学习GBDT和XGBoost的区别搞清楚了
2024-02-20Kaggle Titanic第一次提交,激动
2024-03-01神经网络基础🔄反向传播推导中...
......持续更新

8.2 学习心得

第一周:数学基础

重新学线性代数,发现以前学的都是假的。3Blue1Brown的可视化视频让我第一次真正理解了"线性变换"是什么意思。

第二周:概率统计

贝叶斯公式以前只会背,现在终于理解了"先验"和"后验"的含义。最大似然估计的本质就是"让观测数据出现概率最大的参数"。

第三周:机器学习理论

逻辑回归的公式推了3遍才完全理解。关键是要理解为什么用交叉熵损失,以及梯度为什么是那个形式。

(持续更新中...)

九、总结

9.1 学习路线图总结

graph LR A["数学基础
2-3周"] --> B["ML理论
3周"] B --> C["ML实战
1周"] C --> D["DL理论
3周"] D --> E["DL实战
2周"] E --> F["面试
1周"] F --> G["Offer! 🎉"] style A fill:#74b9ff,color:#000 style B fill:#55efc4,color:#000 style C fill:#ffeaa7,color:#000 style D fill:#a29bfe,color:#000 style E fill:#fd79a8,color:#000 style F fill:#ff7675,color:#fff style G fill:#00b894,color:#fff

9.2 给初学者的建议

  1. 不要急:3个月是理想时间,实际可能需要更久
  2. 动手做:看10遍不如写1遍
  3. 坚持记录:写博客、做笔记,输出是最好的学习
  4. 加入社区:找人一起学,互相监督
  5. 允许放弃:如果实在学不下去,休息一下再继续

9.3 最后的话

机器学习的学习之路确实不容易,公式多、概念多、工具多。

但是,每当你真正理解一个算法的原理,每当你的模型在Kaggle上排名上升,每当你解决一个实际问题——那种成就感,是无法言喻的。

所以,坚持下去。

如果实在坚持不下去了,那就...

先放弃一下,休息休息,然后再继续。

毕竟,这是《从入门到放弃》系列嘛。😄


参考资料

路线图说明

学习资料

评论区
暂无评论
avatar