又到新年,朋友圈里多了一批“2026年学会机器学习”的flag。标题里那串算法名单很有吸引力:回归、决策树、随机森林、神经网络、贝叶斯、SVM、聚类……十个名字整整齐齐,看起来只要逐个学会,就能从入门到上岗。但真正打开Python环境,加载一个数据集之后,很多人才发现真正的问题不是“算法难”,而是不知道先跑哪一个,跑完也不知道怎么判断好坏。
这个卡住大多数人的瞬间,和智力关系不大,和数学基础关系也不大。它缺的是一套“问题—数据—模型—评估”的决策框架。十大算法看起来是十个孤立知识点,实际上可以按解决的任务类型分到三张桌上:有标准答案的监督学习、没有标准答案的无监督学习,以及后来发展出来的神经网络家族。入门的正确方式,不是按名字一个个背,而是先建立这张地图,然后选一条最短路径跑通最小闭环,再逐步扩展。
1. 先别急着背公式,十大算法要先分到三张桌子上
1.1 第一张桌:监督学习,用带答案的数据教模型
监督学习意味着每条样本都有标签。机器学习里最常见的就是这类问题。标签如果是连续数值,就是回归任务,比如预测明天温度、预测一个月后的销售额;标签如果是离散类别,就是分类任务,比如判断一封邮件是垃圾邮件还是正常邮件。
十大算法中,线性回归负责连续值预测;而逻辑回归名字里带“回归”,但它是分类算法,用来输出类别概率。决策树、随机森林、SVM、朴素贝叶斯、KNN这几位,通常出现在分类场景里,只是它们的决策思路完全不同。
1.2 第二张桌:无监督学习,在没有标签的数据里找结构
无监督学习没有“正确答案”。算法要做的是发现数据内部的规律。最典型的是K-Means聚类:给一批用户行为数据,让算法自动把它们分成几个群;给一批商品图片,让算法自动把相似的归到一类。聚类结果往往用来做用户分群、异常检测,或者作为探索性分析的第一步。
1.3 第三张桌:神经网络家族,把特征工程交给机器
严格来说,神经网络也分监督和无监督,但之所以单独放一张桌,是因为它改变了一个关键环节:传统算法往往需要人工构造特征,而神经网络尤其是深度学习可以从原始数据中自动提取特征。多层感知机(MLP)可以处理一般表格问题,卷积神经网络(CNN)适合图像这样有空间结构的数据,循环神经网络(RNN)适合文本、语音这类有时序关系的数据。
初学者的第一个动作,不是急着安装深度学习框架,而是把这十来个算法放进上面三张桌子里,搞清楚每个算法是为哪类问题准备的。这一步能帮你避开后面 80% 的盲目尝试。
2. 从线性回归开始,跑通第一次完整的模型训练
2.1 特征、标签、损失函数:最小闭环的四个动作
线性回归是入门最友好的一站。它做的事情很直观:找到一条直线(更高维是超平面),让所有样本点到这条线的距离尽量短。输入叫特征,输出叫标签,衡量预测和真实值差异的函数叫损失函数。回归任务里最常用的损失函数是均方误差。
训练模型不是解一元二次方程那样一步搞定,而是用梯度下降不断微调权重。第一次跑通线性回归的价值在于:你会看到“模型训练”其实就是一个循环——计算预测、计算损失、调整参数、再来一轮。后面所有复杂的模型,本质都是这个循环的变体。
2.2 一个最小可运行的回归示例
这里以 scikit-learn 自带的糖尿病数据集为例,用很短一段代码跑通线性回归。
from sklearn.datasets import load_diabetes from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score X, y = load_diabetes(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) reg = LinearRegression() reg.fit(X_train, y_train) y_pred = reg.predict(X_test) print("MSE:", mean_squared_error(y_test, y_pred)) print("R2:", r2_score(y_test, y_pred))跑通之后重点关注两个数:MSE 越小越好,R² 越接近 1 越好。但刚入门时,更重要的是不要只盯着指标。可以改一改 random_state,看看结果波动有多大;可以比较一下不同特征组合下的表现。这个过程会让你更早建立起对“数据质量决定模型上限”的体感。
2.3 线性回归为什么只是起点
线性回归不是万能的。它假设特征和目标之间存在线性关系,真实问题里这种假设往往不成立。如果画出预测值和真实值的散点图,发现分布完全乱掉,就要考虑加非线性项、换更灵活的模型,或者做特征变换。这也是为什么光会一个线性回归远远不够,你还需要决策树和它的进阶版本。
3. 决策树、随机森林、SVM、贝叶斯:四种分类武器怎么选
3.1 决策树:把“二十问”写成规则
决策树的思路很像玩“二十问”游戏:根据特征一步步判断,最后落到一个结论上。每选择一个特征划分数据,都希望划分之后得到的子集比划分前更“纯”。衡量纯度的指标常见有信息增益和基尼系数。
入门用 sklearn 写一棵决策树非常快:
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report iris = load_iris() X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.3, random_state=42 ) clf = DecisionTreeClassifier(max_depth=3, random_state=42) clf.fit(X_train, y_train) y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred))这里 max_depth=3 就是剪枝的第一个入口。树的深度越深,训练集上往往越准,但测试集上可能不升反降。原因很简单:树把训练集里的噪声也背下来了。这种问题叫过拟合。面试里常问的决策树剪枝,本质上就是在“学得够细”和“不要死记硬背”之间找平衡。
3.2 随机森林:让一群树开会投票
单棵决策树不稳定:训练数据只要改一点点,树的结构可能完全变样。随机森林的核心想法是用多棵树来降低这种不确定性。它从训练集里有放回地抽样,每棵树只用一部分样本,每棵树分裂时也只看一部分特征,最后让所有树投票。这就是 Bagging(自助采样加聚合)的思路。
实际使用中,随机森林往往比单棵决策树更稳,还能直接给出特征重要性,帮你了解哪些特征对预测影响大。它适合表格数据,对缺失值和量纲的容忍度也比较高,是很多入门项目里“先跑一个效果还不错”的默认模型。
3.3 支持向量机:在两类数据之间找最宽马路
支持向量机(SVM)的目标很直观:在两类样本之间找一条分界线,并且让这条线离两侧最近的样本尽量远。它更像在马路中间画一条线,线的两边还要留出最宽的安全距离。那些紧贴分界线的样本点,就是“支持向量”。
遇到线性分不开的数据时,SVM通过核函数把数据映射到更高维空间,在高维空间里再找分界。径向基核是常用选项。训练代码也很简洁:
from sklearn.svm import SVC model = SVC(kernel='rbf', C=1.0, gamma='scale') model.fit(X_train, y_train)SVM对中小规模数据集效果好,但一旦数据量很大,训练时间会明显上升,也没有随机森林那样直接给出特征重要性。它更适合特征维度中等、样本量不大的场景。
3.4 朴素贝叶斯:条件概率加上一个大胆假设
朴素贝叶斯用到贝叶斯公式,核心是根据特征出现的情况推断类别概率。它有一个“朴素”假设:所有特征在给定类别下互相独立。现实数据里很少完全满足这个假设,但事实证明,在文本分类这类场景里,它仍然轻量且有效。
sklearn 里文本分类常用 MultinomialNB,连续特征常用 GaussianNB。它训练快、需要的数据少、可解释性也不错,缺点是特征之间确实存在强相关时,效果会打折扣。
到这里,你会发现四种分类算法其实代表了四种不同的“判断逻辑”:决策树看规则,随机森林靠投票,SVM找几何边界,贝叶斯算概率。还有一个常被当成基准线的简单算法是KNN,它的思路是近朱者赤——看离新样本最近的K个样本是什么类别,少数服从多数。它没有显式训练过程,但每次预测都要计算距离,所以数据量大时预测开销很高。选哪个都不重要,重要的是你清楚当前数据的结构和业务上要什么。
4. 神经网络和深度学习,到底多学了什么
4.1 从单个神经元到多层感知机
神经网络的基本单元像一个小型线性回归:把输入加权求和,再经过一个非线性激活函数输出结果。单个神经元能做的事情有限,但当很多个神经元分层组合在一起,模型就能表达非常复杂的非线性关系。多层感知机(MLP)就是这样一个基础结构。
训练过程和线性回归一样,也是前向计算、计算损失、反向传播更新权重。只不过因为层数多、参数多,对数据和算力的要求也更高。入门阶段,如果你只是处理一张几百行几千行的表格,用 MLP 不一定比随机森林强,但理解它在做什么,是理解深度学习的第一级台阶。
4.2 CNN:用“窗口扫描”处理图像
卷积神经网络(CNN)专门为图像这类有空间结构的数据设计。它不是把整张图片展平成一行,而是用一个个小卷积核在图片上滑动,提取局部特征,比如边缘、纹理,再经过多层组合得到更高层语义。手写数字识别是它最经典的入门案例。几个卷积层加上池化层,就能达到相当高的准确率。
但要注意,CNN 的威力来自大量数据和计算资源。小数据集上用简单模型往往更实际。
4.3 RNN:逐字阅读时,记忆从哪来
循环神经网络(RNN)处理的是序列数据。标准RNN的核心公式可以写成:
h_t = tanh(W_h h_{t-1} + W_x x_t + b)t 时刻的隐藏状态,由上一时刻的隐藏状态和当前时刻的输入共同决定。你可以把它想象成一个人逐字阅读文本:读到第 t 个字时,脑子里带着前面读过的记忆 h_{t-1},再结合当前这个字,形成新记忆 h_t。
这个循环结构让网络可以处理变长文本、语音等序列。但它有一个明显问题:句子太长时,早期的信息会在传递过程中逐渐消失,也就是所谓的梯度消失。后来出现的 LSTM、GRU 就是为了缓解这个问题。入门阶段可以先理解 RNN 的“记忆机制”,不必急着手推所有公式。
4.4 什么时候不需要神经网络
盲目上神经网络不是明智的选择。如果你面对的是结构化表格数据,样本量几千到几万,随机森林或者梯度提升模型往往更快、更稳、可解释性也更好。只有当你面对图像、语音、长文本这类原始数据,或者数据量足够大、复杂度明显超出传统模型表达范围时,深度学习才真正不可替代。像近年讨论较多的物理信息神经网络这类方向,把物理方程嵌入到训练过程中,很有前景,但同时对领域知识要求也高,不建议刚入门就碰。
5. 聚类算法:在没有标准答案时找结构
5.1 K-Means 的原理一句话版本
K-Means 做的事情是:给定一个 K,把样本分成 K 个簇,让每个样本到它所属簇中心的距离之和尽量小。训练过程反复迭代:先随机初始化簇中心,再分配样本,再更新中心,直到结果基本稳定。
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=3, random_state=42) kmeans.fit(X) print(kmeans.labels_)这段代码看起来很简单,真正花时间的地方往往在动手聚类之前的准备。比如特征是否做了标准化。K-Means 依赖欧氏距离,如果某个特征的量级特别大,比如收入从 0 到百万,而年龄只是 0 到 100,年龄在距离计算里就会被“淹没”。常见处理是用 StandardScaler 把特征统一到差不多的尺度,然后再聚类。
5.2 怎么选 K
K-Means 最麻烦的地方不是算法本身,而是 K 怎么选。常用办法是肘部法则:画出不同 K 下簇内平方和(SSE)的曲线,看曲线在哪个点之后下降明显变缓,那个点就像“肘部”,选它作为 K。还可以用轮廓系数评估聚类效果,取值越接近 1 说明簇越紧凑、簇间越分离。
需要提醒的是,肘部法则只是一个参考。实际业务里,K 的选择还要看可解释性。选一个统计指标很好但业务上完全说不通的分法,往往没法落地。做用户分群时,K=5 可能正好对应五类可解释的客群,即使它比 K=8 的轮廓系数低一些,也值得优先考虑。
5.3 聚类和分类不能混用
分类有标签,聚类没有标签。聚类得到的簇编号只是算法给数据的临时分组,不代表业务含义。做完聚类后,还要结合业务解释每个簇代表什么,甚至需要人工再看一遍样本。如果发现聚类结果跟直觉差很远,可能不是算法问题,而是特征没选对、数据没做标准化,或者 K 本身选得不对。
还有一类常见误用,是把聚类结果当成监督学习的标签去训练分类器。这样做不是完全不行,但你要清楚,这些标签是算法根据自己的标准生成的,不等于真实业务类别。用它做探索分析可以,直接上线做决策要格外谨慎。
6. 一份可以直接复用的入门工作流
6.1 五步完成一个机器学习小项目
与其零散地试算法,不如固定一套流程:
- 定义问题:标签是什么,是回归还是分类,成功标准是什么。
- 准备数据:清洗缺失值,处理类别特征,划分训练集和测试集。
- 选定基准模型:先用线性回归或决策树之类简单模型跑通。
- 迭代优化:尝试随机森林、SVM等模型,比较指标。
- 验证和记录:保持随机种子一致,记录每次实验的配置和结果。
这套看起来简单的流程,恰恰是很多入门者忽略的。有人一上来就调深度学习框架,结果数据清洗没做干净,最终拿到的指标并没有说服力。
6.2 环境准备和一组对比脚本
入门阶段用 Anaconda 装 Python、Jupyter Notebook,再安装 scikit-learn、pandas、matplotlib 就足够了。训练深度学习再考虑 PyTorch 或 TensorFlow。可以先把不同模型的对比脚本固定下来,所有实验都用同一个数据划分和同一个评估函数,这样比较才有意义。
from sklearn.model_selection import train_test_split, cross_val_score models = { "dt": DecisionTreeClassifier(random_state=42), "rf": RandomForestClassifier(random_state=42), "svm": SVC(kernel="rbf", random_state=42), } for name, model in models.items(): scores = cross_val_score(model, X_train, y_train, cv=5) print(name, scores.mean())不要把测试集当调参工具。用测试集反复挑选模型,最后得到的分数会偏乐观,到了新数据上会打回原形。数据量够时,可以再切出一块验证集。
6.3 指标背后的人话解释
准确率最直观,但类不平衡时它会有欺骗性。比如 99% 样本是“正常”,模型什么都不做也能拿到 99% 准确率。所以分类问题还要看精确率、召回率和 F1。回归问题除了 R²,残差分布也要看。指标不是越高越好,而是要和业务目标对齐。这一点越早建立,越不容易被表面分数带偏。
7. 入门最容易踩的坑和完整排查链路
7.1 现象、原因、先查什么
| 现象 | 常见原因 | 第一步排查 |
|---|---|---|
| 模型训练不收敛 | 学习率过大或过小 | 看损失曲线趋势 |
| 训练集极好、测试集很差 | 过拟合 | 降低模型复杂度,增加正则 |
| 多次运行结果不稳定 | 随机种子、数据划分不一致 | 固定 random_state |
| 指标忽好忽坏 | 测试集太小 | 用交叉验证 |
| 换模型效果没变化 | 数据质量或特征构造是瓶颈 | 先做数据清洗与可视化 |
7.2 一次标准的排查顺序
遇到问题时,我会按这个顺序排查,而不是直接换一个更大的模型:
- 先看数据和特征:有没有缺失值、异常值、泄漏,训练测试集划分是否正常。
- 再看评估方式:指标是否适合当前业务,测试集是否过小,是否做了分层抽样。
- 再看模型复杂度:是不是用了太深的树,把训练集背下来了。
- 再看超参数:学习率、树的深度、K 的取值,是否只凭默认值硬跑。
- 最后才考虑工具和环境:版本兼容性、依赖缺失、内存或显存不足。
这个顺序背后的逻辑是:数据决定上限,模型和参数只是在逼近这个上限。如果数据本身有问题,换再强的模型也只是在放大错误。
7.3 早点养成的三个工程习惯
第一,实验结果要记录。用表格写下每次实验的数据版本、模型、参数、指标。第二,随机种子要固定。否则你很难判断指标提升到底是模型带来的,还是运气带来的。第三,小步迭代。先把一条最小流程跑通,再不断增加复杂度。不要在一个还没验证成功的项目上堆各种高级技巧。
回到最开始的问题:十大算法到底怎么学?我的答案不是按顺序背下来,而是先画出那张“三张桌子”的地图,然后从线性回归这个最小闭环出发,让第一次训练、第一次评估、第一次调参真正发生。决策树、随机森林、SVM、贝叶斯、神经网络、聚类这些名字,会随着你动手做项目逐渐变成工具箱里的常备选项。
如果你今天只能做一件事,那就先把环境搭好,用 sklearn 的糖尿病数据集跑通线性回归,再给自己提三个问题:我的数据长什么样?模型输出是什么?指标到底在衡量什么?这三个问题想清楚,可能比多背十个公式更重要。