查看全课大纲(第 93 / 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.实战:通过移动设备行为数据预测性别和年龄

使用scikit-learn的流程

约 12 分钟

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

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

在掌握了机器学习的基本概念和任务类型后,我们终于要动手实践了。本节将带你走完一个完整的机器学习项目流程,使用Python最流行的机器学习库——scikit-learn,以经典的鸢尾花数据集为例,完成从数据加载、模型选择、训练到预测的全过程。学完本节,你将能够独立使用scikit-learn搭建一个基础的分类模型。

💡 核心导读

  • 数据理解:学习如何从机器学习的视角看待数据,区分特征(Feature)与标签(Label)。
  • 标准流程:掌握使用scikit-learn进行机器学习的四步法:准备数据、选择模型、训练模型、预测评估。
  • 代码实践:通过K近邻(KNN)算法,亲手完成一个分类模型的训练与预测。
  • 流程反思:思考在训练集上训练并测试的潜在问题,为后续的模型评估与泛化能力学习做铺垫。

数据准备与理解

在开始建模之前,我们首先要理解数据。在机器学习中,数据通常被组织成表格形式。

  • 样本(Sample):表格中的每一行代表一个独立的个体或观测值,称为一个样本。在鸢尾花数据集中,每一行就是一朵花的测量记录。
  • 特征(Feature):表格中的每一列(除了标签列)是用来描述样本的属性或度量,称为特征。特征越多,对样本的描述就越全面。例如,鸢尾花数据集中的“花萼长度”、“花萼宽度”、“花瓣长度”、“花瓣宽度”就是四个特征。
  • 标签(Label):在监督学习中,我们想要预测的那一列称为标签或目标。在分类任务中,标签就是样本的类别。鸢尾花数据集中,“species”(种类)就是标签,在scikit-learn加载的版本中被编码为数字0、1、2(0=setosa、1=versicolor、2=virginica)。

我们的目标就是建立一个模型,让它学习特征(X)与标签(y)之间的映射关系,从而能够根据新的、未见过的花的特征来预测其种类。

四步法实战:K近邻分类

scikit-learn的使用遵循一个清晰、一致的流程。我们以K近邻(KNN)分类器为例,演示这四步。

第一步:准备数据

这一步包括加载数据,并明确划分出特征矩阵X和标签向量y。注意:为了代码的自包含性,我们直接在代码块内构造一个微型的鸢尾花数据样例。

import pandas as pd
import numpy as np

# 构造一个微型鸢尾花数据集样例(代替从文件读取)
data = {
    'sepal_length': [5.1, 4.9, 4.7, 5.4, 5.0, 5.9],
    'sepal_width': [3.5, 3.0, 3.2, 3.9, 3.6, 3.0],
    'petal_length': [1.4, 1.4, 1.3, 1.7, 1.4, 5.1],
    'petal_width': [0.2, 0.2, 0.2, 0.4, 0.2, 1.8],
    'label': [1, 1, 1, 1, 1, 3]
}
iris_df = pd.DataFrame(data)

print("数据集预览:")
print(iris_df)

# 提取特征(前4列)
X = iris_df[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].values
print("\n特征矩阵X的形状:", X.shape)
print("特征矩阵X:")
print(X)

# 提取标签(最后一列)
y = iris_df['label'].values
print("\n标签向量y的形状:", y.shape)
print("标签向量y:", y)
数据集预览:
   sepal_length  sepal_width  petal_length  petal_width  label
0           5.1          3.5           1.4          0.2      1
1           4.9          3.0           1.4          0.2      1
2           4.7          3.2           1.3          0.2      1
3           5.4          3.9           1.7          0.4      1
4           5.0          3.6           1.4          0.2      1
5           5.9          3.0           5.1          1.8      3

特征矩阵X的形状: (6, 4)
特征矩阵X:
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [5.4 3.9 1.7 0.4]
 [5.  3.6 1.4 0.2]
 [5.9 3.  5.1 1.8]]

标签向量y的形状: (6,)
标签向量y: [1 1 1 1 1 3]

第二步:选择与构建模型

根据任务类型(这里是分类)选择一个合适的算法。我们从sklearn.neighbors模块中导入KNeighborsClassifier。

# 导入K近邻分类器
from sklearn.neighbors import KNeighborsClassifier

# 创建KNN模型实例(使用默认参数:n_neighbors=5)
knn_model = KNeighborsClassifier()
print("KNN模型创建成功。模型类型:", type(knn_model).__name__)
KNN模型创建成功。模型类型: KNeighborsClassifier

第三步:训练模型

将准备好的特征X和标签y传递给模型的fit方法,模型就会从数据中学习规律。

# 使用上一步定义的KNN模型和构造的数据进行训练
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

# 重新构造数据,确保本代码块自包含
X_train = np.array([[5.1, 3.5, 1.4, 0.2],
                    [4.9, 3.0, 1.4, 0.2],
                    [4.7, 3.2, 1.3, 0.2],
                    [5.4, 3.9, 1.7, 0.4],
                    [5.0, 3.6, 1.4, 0.2],
                    [5.9, 3.0, 5.1, 1.8]])
y_train = np.array([1, 1, 1, 1, 1, 3])

knn_model = KNeighborsClassifier()
knn_model.fit(X_train, y_train)
print("模型训练完成!")
模型训练完成!

第四步:预测与评估

模型训练好后,就可以用它来预测新数据的标签。预测时只需要输入特征,不需要标签。

# 使用上一步训练好的模型进行预测
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

# 重新构造训练数据和模型,确保自包含
X_train = np.array([[5.1, 3.5, 1.4, 0.2],
                    [4.9, 3.0, 1.4, 0.2],
                    [4.7, 3.2, 1.3, 0.2],
                    [5.4, 3.9, 1.7, 0.4],
                    [5.0, 3.6, 1.4, 0.2],
                    [5.9, 3.0, 5.1, 1.8]])
y_train = np.array([1, 1, 1, 1, 1, 3])

knn_model = KNeighborsClassifier()
knn_model.fit(X_train, y_train)

# 预测单个样本(注意输入必须是二维数组)
sample_1 = [[5.1, 3.5, 1.4, 0.2]]  # 第一个样本的特征
prediction_1 = knn_model.predict(sample_1)
print(f"样本1的预测标签:{prediction_1[0]},真实标签:{y_train[0]}")

# 预测另一个样本
sample_2 = [[5.9, 3.0, 5.1, 1.8]]  # 最后一个样本的特征
prediction_2 = knn_model.predict(sample_2)
print(f"样本2的预测标签:{prediction_2[0]},真实标签:{y_train[5]}")

# 预测所有训练样本
all_predictions = knn_model.predict(X_train)
print(f"\n对所有训练样本的预测结果:{all_predictions}")
print(f"真实标签:{y_train}")
print(f"预测是否全部正确?{np.array_equal(all_predictions, y_train)}")
样本1的预测标签:1,真实标签:1
样本2的预测标签:1,真实标签:3

对所有训练样本的预测结果:[1 1 1 1 1 1]
真实标签:[1 1 1 1 1 3]
预测是否全部正确?False

从运行结果可以看到一个有趣的现象:KNN模型对样本1预测正确(预测标签1,真实标签1),但对样本2预测错了——它预测为1(versicolor),而真实标签是3。对所有训练样本的预测结果[1 1 1 1 1 1]与真实标签[1 1 1 1 1 3]并不一致,预测是否全部正确?False。这提醒我们:即使在训练集上,模型也未必能全部预测对——这个微型样例中唯一一个花瓣明显更长的样本(virginica)孤悬于多数派之外,k=3 的投票把它“淹没”了。这也正说明了后面要用独立测试集、科学指标来评估模型的必要性。需要注意的是,scikit-learn中几乎所有模型的接口都是这样一致的:model.fit(X_train, y_train)用于训练,model.predict(X_new)用于预测。

完整的机器学习流程

上面的四步是核心操作,但一个完整的、严谨的机器学习项目流程通常包含更多环节,如下图所示:

准备数据集 → 选择模型 → 训练模型 → 调整参数 → 测试模型
    ↓              ↓           ↓           ↓         ↓
数据处理       根据任务      在训练集上  交叉验证    在测试集上
特征工程      选择模型      拟合模型    调优参数    评估性能
训练/测试集分割 (分类/回归/聚类...)            选择评价指标
  1. 准备数据集:这是最基础也最耗时的一步。包括数据清洗、处理缺失值、特征工程(构造、选择、转换特征)以及将数据划分为训练集和测试集。训练集用于模型学习,测试集用于最终评估模型在未知数据上的表现。
  2. 选择模型:根据你要解决的问题类型(分类、回归、聚类等),从算法库中选择一个或多个候选模型。
  3. 训练与调参:在训练集上训练模型。许多模型有超参数(如KNN中的K值),需要通过交叉验证等技术在验证集上调整,以找到最优配置,避免过拟合。
  4. 测试与评估:使用从未参与训练和调参的测试集,对最终模型进行公平的评估。使用准确率、精确率、召回率、F1分数等指标量化模型性能。

📝 动手练一练

  1. 流程思考:在本节的例子中,我们使用全部数据(微型样例)进行训练,然后又用同样的数据来测试并计算准确率。你认为这种做法在真实的机器学习项目中是否合理?可能会存在什么问题?
👉 点击查看参考答案

这种做法通常不合理,它会导致对模型性能的过于乐观的估计。主要问题是:

  • 过拟合风险:模型可能只是“死记硬背”了训练数据中的细节和噪声,而不是学习到通用的规律。这会导致它在训练集上表现极好,但在新的、未见过的数据(测试集)上表现很差。
  • 缺乏泛化能力评估:机器学习的核心目标是让模型在新数据上表现好。用训练数据测试,无法评估模型的泛化能力。

在真实项目中,我们必须将数据划分为训练集和测试集(有时还有验证集)。只用训练集来训练和调参,最后用完全独立的测试集做一次最终评估,这个分数才更能代表模型上线的真实表现。我们将在后续课程中详细学习数据划分的方法。

  1. 模型替换:尝试将示例中的KNeighborsClassifier替换为sklearn.linear_model中的LogisticRegression(逻辑回归)。观察并比较两个模型在同一个微型数据集上的预测结果(是否全部正确)。你只需要修改模型初始化和训练预测的代码,数据部分保持不变。
👉 点击查看参考答案
from sklearn.linear_model import LogisticRegression
import numpy as np

# 构造数据
X = np.array([[5.1, 3.5, 1.4, 0.2],
              [4.9, 3.0, 1.4, 0.2],
              [4.7, 3.2, 1.3, 0.2],
              [5.4, 3.9, 1.7, 0.4],
              [5.0, 3.6, 1.4, 0.2],
              [5.9, 3.0, 5.1, 1.8]])
y = np.array([1, 1, 1, 1, 1, 3])

# 使用逻辑回归模型
logreg_model = LogisticRegression()
logreg_model.fit(X, y)

# 预测
predictions = logreg_model.predict(X)
print("逻辑回归预测结果:", predictions)
print("真实标签:", y)
print("预测是否全部正确?", np.array_equal(predictions, y))
逻辑回归预测结果: [1 1 1 1 1 3]
真实标签: [1 1 1 1 1 3]
预测是否全部正确? True

运行后你会发现,在这个简单的微型样例上,逻辑回归模型也能正确预测所有样本。这说明了scikit-learn API的一致性,也提示我们对于简单、线性可分的数据,不同的分类器可能都能取得好效果。但在复杂数据上,不同模型的表现会差异显著。

本章小结

本节我们迈出了使用scikit-learn进行机器学习实践的第一步。你不仅学会了如何用几行代码完成一个分类模型的训练和预测,更重要的是理解了其背后标准化的流程和“特征-标签”的数据思维。

📋 行动清单

  • 亲手运行本节的所有代码示例,确保理解每一行的作用。
  • 尝试替换:将KNN模型换成sklearn.svm中的SVC(支持向量机分类器),感受API的一致性。
  • 深入思考:回顾“动手练一练”中的第一个问题,并预习下一节关于“训练集与测试集划分”的内容,理解为何数据划分如此重要。

—— 小象教研组

配套资料 · 直接下载

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

  • 本节课件:使用scikit-learn的流程
    PDF · 607KB
    下载
  • 全套课件打包(第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 数据库
    下载