ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

十大机器学习算法入门路线:从回归到聚类一次讲透

十大机器学习算法入门路线:从回归到聚类一次讲透 机器学习入门最先遇到的门槛往往不是某一个算法有多难而是十大算法、课程名称和数据科学名词堆在一起不知道先学哪一个、它们之间的关系是什么也不知道自己学到什么程度才算真正掌握。这篇文章把回归算法、聚类算法、决策树、随机森林、神经网络、贝叶斯算法、支持向量机、KNN、DBSCAN 和层次聚类这十大机器学习算法按“概念 - 环境 - 代码 - 验证 - 排错 - 练习”的顺序整理成一条完整路线。没有深奥的数学铺开重点是让新手先建立全局认识再一步步跑通最小案例最后知道怎么检查结果、解决报错。读者不需要高数基础但最好已经会一点 Python 语法。如果之前只听说过 sklearn、pandas、Jupyter还没有动手配置过环境也可以从下面的环境准备部分开始。1. 机器学习到底在解决什么问题十大算法怎么分类1.1 从数据到模型的三个步骤机器学习大部分任务可以压缩成一句话给计算机一批数据让它从数据中找到规律再用这个规律去预测新数据。这个过程中有三个关键环节数据采集和处理原始数据通常有缺失值、重复值、格式不统一等问题入门阶段至少要会查看数据规模、处理空值和数值化文本。特征构造和选择不是所有列都适合直接进入模型。例如做收入预测时年龄、学历、职业可以作为特征用户 ID 通常不能作为特征。模型训练和评估把数据切分为训练集与测试集让算法在训练集上学习在测试集上验证效果再根据准确率、均方误差等指标判断模型是否合格。很多新手把注意力全放在算法公式上忽略了前两步。实际项目中数据清洗和特征处理往往占去大部分时间。1.2 十大算法的三条主线十大算法可以按学习方式分成三类这张表建议先保存下来后面章节会反复用到学习方式解决什么问题典型算法常见应用监督学习根据带标签的数据学习映射关系线性回归、决策树、随机森林、朴素贝叶斯、SVM、神经网络、KNN房价预测、收入预测、鸢尾花分类、手写数字识别无监督学习从没有标签的数据中发现结构K-Means、DBSCAN、层次聚类客户分群、异常点检测、图像压缩强化学习通过与环境交互获得奖励来学习策略一般作为独立方向学习游戏 AI、机器人控制从学习顺序上看推荐先把监督学习主线走通因为回归和分类的概念最容易理解评估指标也直观然后把聚类作为没有标签也能分群的典型代表学一遍最后再按兴趣深入学习神经网络或 SVM 的数学细节。2. 环境准备先跑起来再谈原理2.1 最小依赖清单建议在个人电脑上使用 Anaconda 安装 Python 环境因为它同时提供 Jupyter Notebook 和常用的科学计算包能省去很多手动配置依赖的问题。入门阶段不需要一次装很多东西下面这份清单就够工具/库作用说明Python 3.10 或 3.11解释器与最新课程兼容性较好Anaconda环境管理自带 Jupyter、condascikit-learn机器学习算法库覆盖回归、聚类、决策树、SVM、KNN 等pandas表格数据处理读取 CSV、查看统计、清洗数据matplotlib / seaborn可视化画散点图、混淆矩阵、聚类结果numpy数值计算几乎所有算法库都依赖它创建独立环境可以避免多个项目共用依赖造成的冲突conda create -n ml-learning python3.11 conda activate ml-learning pip install scikit-learn pandas matplotlib seaborn jupyter写代码前先验证环境python -c import sklearn, pandas, matplotlib; print(sklearn.__version__)注意如果输出版本号正常说明环境可用。不要跳过这一行检查很多后续报错都源于某个库没有真正装进当前环境。2.2 新手从哪里找数据集公开数据集不需要一开始就去找很大很复杂的scikit-learn 自带的数据集足够跑通全部流程数据集任务类型适合演示的算法鸢尾花数据集 iris多分类KNN、决策树、SVM、朴素贝叶斯手写数字数据集 digits多分类神经网络、SVM加州房价数据集回归线性回归、随机森林回归自定义聚类模拟数据聚类K-Means、DBSCAN、层次聚类校外练习时也可以使用 Kaggle、UCI Machine Learning Repository、OpenML 等平台上的开源数据集。选择标准很直接数据规模不要太大行数控制在几千行以内字段数量不要太多标签含义要能看懂。3. 十大算法一条线走一遍思路、公式、代码这一章内容的安排方式是每个算法都先说明它解决什么场景再给出核心思路最后给一段可以直接运行的最小代码。先照跑再改动参数观察效果。3.1 回归算法预测连续值回归算法解决的是预测一个数值的问题例如房价、温度、销售额。最简单的线性回归假设目标值y与特征x之间存在线性关系y w * x b训练过程就是在找一组w和b让预测值与真实值的误差尽量小。常见误差指标是均方误差sklearn 中可以直接调用模型。下面用加州房价数据做了一个最小回归示例from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score data fetch_california_housing() X_train, X_test, y_train, y_test train_test_split( data.data, data.target, test_size0.2, random_state42 ) model LinearRegression() model.fit(X_train, y_train) y_pred model.predict(X_test) print(MSE:, mean_squared_error(y_test, y_pred)) print(R2:, r2_score(y_test, y_pred))如果测试集上的R2接近 0.5 到 0.7说明线性模型捕捉到了大部分趋势如果接近 0 或负数说明当前特征和模型形式不合适需要换模型或做特征工程。3.2 决策树与随机森林从单棵规则树到集成决策树像一套如果……就……的规则系统。它每次选择一个特征把一个数据集分成更纯的子集重复这个过程直到满足停止条件。选择哪个特征做划分通常用信息增益或基尼系数衡量划分后纯度提升多少。信息熵的计算公式如下Entropy - sum(p_i * log2(p_i))决策树的优点是解释性强缺点是单棵树容易过拟合训练集得分很高、测试集得分却偏低。随机森林通过训练多棵不同的树并投票来决定结果能明显缓解单棵树的波动。用收入预测场景给一个对比示例from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score data load_iris() X_train, X_test, y_train, y_test train_test_split( data.data, data.target, test_size0.3, random_state42 ) dt DecisionTreeClassifier(max_depth3, random_state42) dt.fit(X_train, y_train) rf RandomForestClassifier(n_estimators100, max_depth3, random_state42) rf.fit(X_train, y_train) print(决策树准确率:, accuracy_score(y_test, dt.predict(X_test))) print(随机森林准确率:, accuracy_score(y_test, rf.predict(X_test)))max_depth3在决策树里属于限制树深度的预剪枝手段。不设置这个参数时单棵树往往会一直分下去直到叶子节点非常纯净结果是严重过拟合。3.3 神经网络从感知机到 CNN 与 RNN神经网络可以理解成多层可学习的开关组合。每一层把输入做加权求和再通过激活函数引入非线性多层级联之后就能拟合很复杂的函数。入门阶段不需要手写全部反向传播公式但要知道三个关键部件输入层接收特征。隐藏层负责特征组合和变换。激活函数例如 ReLU、sigmoid负责让网络有非线性表达能力。在图像任务中卷积神经网络 CNN 通过卷积核提取局部特征适合处理手写数字、图片分类这类任务。循环神经网络 RNN 则按时间步处理序列文本、语音这类前后顺序重要的数据更适合它。RNN 在时间步t的隐藏状态更新公式经常出现在课程里h_t f(U * x_t W * h_{t-1} b)其中x_t是当前时刻输入h_{t-1}是前一时刻隐藏状态U、W、b是需要学习的参数。3.4 贝叶斯算法用先验概率做判断贝叶斯算法的核心是用已有知识来修正判断。其基本公式为P(Y|X) P(Y) * P(X|Y) / P(X)P(Y)是先验概率P(Y|X)是看到特征X后的后验概率。朴素贝叶斯的朴素体现在一个强假设各特征之间相互独立。虽然这个假设在真实数据里很难完全成立但在文本分类等场景中效果依然不错。下面是用朴素贝叶斯做鸢尾花分类的示例from sklearn.naive_bayes import GaussianNB from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score data load_iris() X_train, X_test, y_train, y_test train_test_split( data.data, data.target, test_size0.3, random_state42 ) nb GaussianNB() nb.fit(X_train, y_train) y_pred nb.predict(X_test) print(朴素贝叶斯准确率:, accuracy_score(y_test, y_pred))3.5 支持向量机用间隔找边界支持向量机 SVM 的目标是找到一个分类边界让两类样本之间的距离间隔最大。离边界最近的样本点称为支持向量它们决定了最终边界的位置。当数据不是线性可分时SVM 通过核函数把数据映射到更高维空间在高维空间中找到线性边界。常见核函数包括线性核、多项式核和 RBF 核。SVM 在小规模、中等维度数据上通常表现很好但数据量很大或特征很多时训练时间会明显上升。from sklearn.svm import SVC svm SVC(kernelrbf, C1.0, gammascale, random_state42) svm.fit(X_train, y_train) print(SVM 准确率:, accuracy_score(y_test, svm.predict(X_test)))参数C控制误分类的惩罚程度C太大容易过拟合C太小则可能欠拟合。gamma影响 RBF 核的作用范围同样需要谨慎调整。3.6 聚类算法K-Means、DBSCAN、层次聚类当数据没有标签时聚类算法可以把相似样本归到同一组。K-Means 是最常用的原型聚类算法。它先指定k个聚类中心反复把样本划到最近的中心并把中心更新为组内均值直到中心不再明显变化。需要提前确定k值这是新手最容易纠结的问题。DBSCAN 是密度聚类算法它不需要指定簇数量而是通过eps和min_samples两个参数寻找密度连通的区域还能把稀疏区域标为噪声点。层次聚类则把每个样本先看作一个簇再根据距离不断合并直到形成一棵层次树。教材里的 AGNES 就是这类自底向上的算法。from sklearn.datasets import make_blobs from sklearn.cluster import KMeans, DBSCAN import matplotlib.pyplot as plt X, _ make_blobs(n_samples300, centers4, random_state42) kmeans KMeans(n_clusters4, random_state42) kmeans.fit(X) dbscan DBSCAN(eps0.5, min_samples5) dbscan.fit(X) plt.figure(figsize(8, 4)) plt.subplot(1, 2, 1) plt.scatter(X[:, 0], X[:, 1], ckmeans.labels_, cmapviridis) plt.title(K-Means) plt.subplot(1, 2, 2) plt.scatter(X[:, 0], X[:, 1], cdbscan.labels_, cmapviridis) plt.title(DBSCAN) plt.show()如果数据中包含不规则形状的簇K-Means 会因为假设簇是球形的而分错DBSCAN 能处理任意形状的簇但eps的选择对结果影响很大。3.7 KNN用最近邻居投票KNN 属于懒惰学习它不是训练一个复杂模型而是把训练数据保存在那里预测新样本时找出离它最近的k个样本让它们投票决定类别。KNN 的核心超参数是k和距离度量方式。k太小容易受噪声影响k太大则可能把远处的其他类别样本一起算进来。因为 KNN 需要计算两两距离数据量很大时预测速度会明显变慢建议先对特征做标准化。from sklearn.neighbors import KNeighborsClassifier knn KNeighborsClassifier(n_neighbors5) knn.fit(X_train, y_train) print(KNN 准确率:, accuracy_score(y_test, knn.predict(X_test)))4. 评估一个模型好不好不只是看准确率模型的训练过程只是开始真正重要的是如何验证模型是否可用。入门阶段至少要学会三个评估工具训练集测试集划分、回归指标、分类指标。表分类和回归任务各自的常用评估指标任务类型指标含义分类accuracy预测正确的样本比例分类precision预测为正类且实际为正类的比例分类recall实际为正类且被找出来的比例分类F1-scoreprecision 与 recall 的调和平均回归MSE预测值与真实值差的平方平均回归RMSEMSE 开根号单位与原始目标一致回归R2模型解释目标变量方差的比例在使用这些指标时要注意只报告准确率远远不够。如果正负样本比例严重失衡比如 99% 都是负样本一个全预测为负的模型准确率也有 99%但它没有任何实用价值。此时要同时看混淆矩阵、precision、recall 和 F1-score。5. 十个算法最容易踩的坑5.1 聚类前没有标准化如果特征量纲差异很大例如年龄取值 0 到 100收入取值 0 到 100000K-Means 计算距离时会完全被收入主导年龄这个特征几乎不起作用。解决方式是在聚类之前先做标准化from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_scaled scaler.fit_transform(X)K-Means、KNN、SVM 这类基于距离的算法都要尤其在意的特征标准化。5.2 决策树不剪枝训练集得分高得离谱单棵决策树如果不限制深度会不断细分直到每个叶子只包含一类样本。这在训练集上表现完美但在新数据上往往很差。处理方式有两个方向预剪枝在训练时通过max_depth、min_samples_split等参数限制树生长。后剪枝先生成一棵完整的树再剪掉对验证集提升不大的分支。入门阶段建议优先设置max_depth和min_samples_leaf不要直接放一棵无限生长的决策树。5.3 sklearn 报错Expected 2D array这个报错非常常见原因是模型期望输入是二维数组但传入的是一维向量。错误代码示例# 错误 model.fit(X_train[:, 0], y_train)正确写法是把单列特征转换成二维model.fit(X_train[:, 0].reshape(-1, 1), y_train)也可以用 DataFrame 选择多个列来保证形状为二维。5.4 常见坑速查表问题现象常见原因检查方式处理建议聚类结果按属性值分层特征量纲差异大查看各列 min/max 或标准差聚类和距离类模型前先标准化决策树训练集 100% 测试集很低树过深、过拟合比较 train_score 与 test_score设置 max_depth、min_samples_leaf模型 fit 报 Expected 2D array输入是一维数组打印 X.shape使用 reshape(-1, 1) 或传入多列K-Means 结果不稳定初始中心随机多次运行比较簇中心设置 random_state并观察多次结果导入包失败或版本报错不在同一 conda 环境conda env list先 activate 对应环境再 pip installKNN 预测特别慢数据量大或 k 设置不合理查看数据集行数考虑换树模型或减少样本量6. 从入门到能动手做小项目6.1 掌握程度自检清单完成上面的教程后可以用下面的清单自查能不能说出每个算法解决什么问题适用数据是表格、图像还是文本。能不能不查文档写出一个 sklearn 训练流程使用 train_test_split、fit、predict。能不能解释准确率、MSE、R2 的含义。能不能在聚类或 KNN 之前主动标准化数据。能不能处理特征数量大于样本数量、文本特征没有数值化等常见问题。能不能通过调整max_depth或n_estimators观察过拟合变化。如果以上都能独立完成说明已经具备独立学习更复杂模型的基础。6.2 三道推荐练习建议按照难度顺序完成下面三个练习鸢尾花分类用 KNN、决策树、朴素贝叶斯、SVM 分别建模比较准确率尝试标准化后再比较一次。收入预测使用 sklearn 自带的成人收入或同类公开数据把收入是否超过 5 万作为标签做二分类预测并查看混淆矩阵。客户聚类模拟或下载一份包含消费金额、消费次数、会员时长的数据用 K-Means 分群对每一群做特征画像。练习时不要只关心最终数字要记录每次修改参数后结果发生了什么变化。这份记录就是最好的复习材料。6.3 进阶学习备选资料周志华《机器学习》适合在掌握基本流程后系统理解算法原理。李航《统计学习方法》偏数学推导更适合计算机专业同学或准备面试时精读。scikit-learn 官方文档查参数和 API 最权威示例代码也完整。Kaggle 入门竞赛和公开数据集通过真实数据练习数据处理、模型比较和结果提交。学习机器学习不要追求一口气背下所有公式。更稳妥的路径是每个算法先有一个形象理解再跑一段最小代码观察结果最后回头补数学原理。这样做的效率比直接啃公式要高得多也更容易坚持到做出第一个完整小项目。
返回列表