查看全课大纲(第 95 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

模型选择

约 9 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在机器学习实践中,面对众多算法模型,初学者常常感到困惑:我的问题应该选择哪个模型?本节将为你介绍 scikit-learn 官方提供的模型选择路线图,并通过一个实战案例,演示如何根据数据特点选择并对比不同模型的性能。学完本节,你将掌握一个系统化的模型选择思路,并能通过代码验证不同模型在具体数据集上的表现。

💡 核心导读

  • 模型选择的挑战:机器学习算法众多,选择合适模型是实践中的关键一步。
  • scikit-learn 路线图:官方提供了一个基于数据量、问题类型(分类/回归/聚类)和特征性质的模型选择参考指南。
  • 实战对比:在鸢尾花数据集上,我们将对比 K 近邻(KNN)和线性支持向量机(Linear SVM)两种分类模型的性能。
  • 重要原则:模型性能与数据特性强相关,没有“永远最好”的模型,需要通过实验验证。

为什么需要模型选择?

机器学习领域算法模型繁多,如线性回归、决策树、支持向量机、神经网络等。对于初学者,面对一个具体的数据分析或预测任务时,往往会陷入“选择困难症”。盲目尝试所有模型不仅效率低下,也可能因为模型与数据不匹配而得不到好结果。

因此,我们需要一个系统化的思路来缩小选择范围。scikit-learn 作为 Python 主流的机器学习库,其官方文档提供了一张非常实用的“机器学习路线图”(Machine Learning Map),为我们提供了一个基于数据驱动的问题诊断和模型选择框架。

scikit-learn 模型选择路线图解读

该路线图是一个决策树形式的流程图,你可以通过访问 https://scikit-learn.org/stable/machine_learning_map.html 查看交互式版本。其核心逻辑是通过回答一系列关于你的数据和任务的问题,逐步引导你到可能合适的算法。请注意,这只是一个参考指南,并非唯一标准,实际应用中可根据需求调整。

我们来梳理一下这张图的主要分支逻辑:

  1. 起点:样本量

    • 首先询问:样本数量是否大于 50?
    • 如果 不大于 50,建议是“获取更多数据”。因为数据量太小,模型难以学习到有效的规律。这里的“50”是一个经验参考值,意在强调小样本学习的局限性。
  2. 第一层分支:预测目标类型

    • 如果数据量足够,接下来问:你是否在预测一个类别(Category)?
    • 如果是,那么你面临的是一个 分类(Classification) 问题。路线图会引导你进入分类算法区域。
    • 如果不是,则继续问:你是否在预测一个数量(Quantity)?
      • 如果是,那么你面临的是一个 回归(Regression) 问题,如预测房价、销售额等连续值。
      • 如果也不是,那么你可能是在做 聚类(Clustering) 分析,即对无标签数据进行分组。
  3. 分类问题下的深入选择 进入分类区域后,路线图会进一步根据数据特征进行细分:

    • 数据是否有标签? 分类属于有监督学习,通常需要标签数据。
    • 样本量是否小于 10 万? 这是一个区分轻量级和重量级算法的分界线。
    • 数据是否是文本数据(Text Data)? 如果是,可能会推荐使用朴素贝叶斯(Naive Bayes)等适合文本特征的算法。
    • 对于非文本、样本量小于 10 万的数据,路线图建议先尝试 线性支持向量机(Linear SVC);若效果不佳,再尝试 K 近邻(KNN);若仍不理想,则可升级到 SVC(默认 RBF 核,能刻画非线性边界) 或 集成学习方法(Ensemble Classifiers,如随机森林)。
  4. 回归与聚类

    • 回归区域:会根据数据特征推荐线性回归、Lasso、岭回归、SVR(支持向量回归)等算法。
    • 聚类区域:会介绍 K-Means、谱聚类、高斯混合模型(GMM)等经典无监督学习算法。

这张路线图的每个算法节点都是可点击的,链接到该算法的官方文档、API 说明和示例代码,非常便于学习和直接应用。

实战对比:KNN vs Linear SVM

理解了选择思路后,我们通过一个实战来体会。我们使用经典的鸢尾花(Iris)数据集,这是一个三分类问题。我们将遵循路线图的提示,对非文本、有标签、中等规模的数据,尝试 KNN 和 Linear SVM 两种算法,并对比它们的性能。

首先,我们构造一个可独立运行的最小示例数据集,模拟鸢尾花数据的核心特征。

# 导入必要库并构造示例数据
import numpy as np
from sklearn.model_selection import train_test_split

# 构造一个简单的分类数据集模拟鸢尾花(4个特征,3个类别)
# 特征数据
np.random.seed(10) # 固定随机种子,确保结果可复现
n_samples = 150
X = np.random.randn(n_samples, 4) * 1.5 + np.array([5.0, 3.0, 1.5, 0.2]) # 围绕中心点生成数据

# 标签数据 (0, 1, 2 对应三个类别)
y = np.zeros(n_samples, dtype=int)
y[50:100] = 1
y[100:] = 2
# 为模拟分类的区分度,对后两个特征做偏移
X[50:100, 2:] += 1.5
X[100:, 2:] += 3.0

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)

print("训练集样本数:", X_train.shape[0], "测试集样本数:", X_test.shape[0])
print("特征维度:", X_train.shape[1])
print("类别标签:", np.unique(y))
训练集样本数: 100 测试集样本数: 50
特征维度: 4
类别标签: [0 1 2]

接下来,我们导入 K 近邻分类器和线性支持向量机分类器,在训练集上进行训练。

# 导入模型类(每个代码块自包含:重建数据与训练集)
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import LinearSVC

# 重建与上一块相同的示例数据
np.random.seed(10)
n_samples = 150
X = np.random.randn(n_samples, 4) * 1.5 + np.array([5.0, 3.0, 1.5, 0.2])
y = np.zeros(n_samples, dtype=int)
y[50:100] = 1
y[100:] = 2
X[50:100, 2:] += 1.5
X[100:, 2:] += 3.0
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)

# 初始化两个模型(使用默认参数)
knn_model = KNeighborsClassifier()  # K近邻分类器,默认n_neighbors=5
svc_model = LinearSVC(random_state=10, max_iter=10000)  # 线性支持向量机分类器,设置random_state使结果可复现,增加迭代次数确保收敛

# 在训练集上训练模型
knn_model.fit(X_train, y_train)
svc_model.fit(X_train, y_train)

print("KNN 模型训练完成。")
print("Linear SVM 模型训练完成。")
KNN 模型训练完成。
Linear SVM 模型训练完成。

模型训练好后,我们在测试集上评估它们的性能。scikit-learn 的模型通常提供 .score(X, y) 方法,对于分类器,它默认返回预测的准确率(Accuracy)。

# 在测试集上评估模型(每个代码块自包含:重建数据、重新训练、再评估)
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import LinearSVC

np.random.seed(10)
n_samples = 150
X = np.random.randn(n_samples, 4) * 1.5 + np.array([5.0, 3.0, 1.5, 0.2])
y = np.zeros(n_samples, dtype=int)
y[50:100] = 1
y[100:] = 2
X[50:100, 2:] += 1.5
X[100:, 2:] += 3.0
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)

knn_model = KNeighborsClassifier()
svc_model = LinearSVC(random_state=10, max_iter=10000)
knn_model.fit(X_train, y_train)
svc_model.fit(X_train, y_train)

acc_knn = knn_model.score(X_test, y_test)
acc_svc = svc_model.score(X_test, y_test)

print('KNN 模型在测试集上的准确率:', acc_knn)
print('线性SVM 模型在测试集上的准确率:', acc_svc)
KNN 模型在测试集上的准确率: 0.52
线性SVM 模型在测试集上的准确率: 0.62

从结果可以看出,在这个构造的数据集上,线性 SVM 模型的准确率(0.62)要高于 KNN 模型(0.52),且两者都谈不上理想——因为这份用随机数模拟的数据类间重叠较大,本身就不是一个“容易分”的问题。这个简单的对比揭示了一个重要的机器学习原则:模型的性能与数据特性高度相关,并非模型越简单或越复杂,效果就一定更好。

  • KNN 是一种基于实例的简单算法,它通过查找最近邻的样本来进行预测,在数据分布相对清晰、边界非线性的问题上可能表现良好。
  • Linear SVM 试图找到一个最优的线性超平面来分隔不同类别,对于线性可分或近似线性可分的数据很有效。

在某些数据集上,SVM 可能远超 KNN;而在另一些数据集上,简单的 KNN 可能就足够了。因此,实践中的黄金法则是在你的具体数据上进行实验和验证。scikit-learn 的路线图为我们提供了起点,而真正的模型选择与调优,是一个需要结合业务理解、数据探索和反复实验的过程。

📝 动手练一练

  1. 概念辨析:scikit-learn 官方路线图建议在“样本量小于 10 万”时优先尝试轻量级算法(如 KNN、线性 SVM)。请思考:为什么样本量很大时,反而要慎用 K 近邻这类基于实例的算法?(提示:从 KNN 在预测阶段需要做什么计算来考虑。)
👉 点击查看参考答案

KNN 在预测阶段需要计算新样本与全部训练样本的距离。当训练集达到百万级样本时,每次预测都要做百万次距离计算,预测开销随训练集规模线性增长,变得非常昂贵;而线性 SVM 训练完成后只保留一个线性决策边界(权重向量),预测只需一次向量点积,开销与训练集规模无关。因此大样本场景下通常选择“模型本身有参数、预测开销与训练集规模无关”的算法,或借助近似最近邻等工程手段加速 KNN。

  1. 代码实践:在本节的示例代码中,把 test_size 从 1/3 改为 0.2(即训练集占比更大),重新运行训练与评估。两个模型的准确率发生了什么变化?为什么此时对评估结果要更谨慎地看待?
👉 点击查看参考答案

训练集变大后,模型可学习的数据更多,准确率通常会略有上升或小幅波动。但要注意:测试集相应变小了(从 50 个样本变成 30 个),此时准确率是对更少样本求平均,单个样本的对错对结果影响更大(每个样本占 1/30 ≈ 3.3%),评估结果的方差变大、可靠性下降。这提醒我们:评估指标的稳定性取决于测试集规模,小测试集上的微小差异不宜过度解读。

本章小结

本节我们探讨了机器学习中模型选择的核心问题。我们学习了如何利用 scikit-learn 官方路线图,根据数据量、问题类型和特征性质来初步筛选合适的算法。并通过一个实战示例,对比了 KNN 和 Linear SVM 在分类任务上的性能,强调了“没有免费午餐定理”——不存在适用于所有问题的最佳模型,必须基于具体数据做评估。

📋 行动清单

  • 访问 scikit-learn 官网,查看并熟悉交互式的机器学习路线图。
  • 为你当前正在处理或设想的一个分析任务,根据路线图判断其可能属于哪类问题(分类/回归/聚类)。
  • 选择一个简单的数据集(如本节构造的示例),尝试换用路线图中推荐的其他算法(如朴素贝叶斯),观察性能变化。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:模型选择
    PDF · 425KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载