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

机器学习建模介绍 (1) -- 分类

约 10 分钟

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

机器学习建模介绍:分类算法

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

在上一节,我们了解了机器学习的基本概念和流程。本节我们将深入机器学习建模的第一类核心算法:分类算法。你将理解分类算法的核心思想、典型应用场景,并通过一个经典的鸢尾花分类案例,直观地看到模型是如何在数据空间中“画出”分类边界,从而对新数据进行预测的。

💡 核心导读

  • 分类算法是什么:将数据样本映射到预先定义的类别标签的算法。
  • 典型应用场景:人脸识别、垃圾邮件检测、信用风险评估等。
  • 核心原理:基于历史数据(带标签)学习一个分类边界或区域。
  • 可视化理解:通过二维空间的分类边界图,直观理解高维分类问题。
  • 思维训练:学会将高维复杂问题简化为低维直观问题来理解。

分类算法概述

机器学习算法种类繁多,根据任务目标,主要可以分为以下几类:

  1. 分类:预测数据样本所属的离散类别。
  2. 回归:预测数据样本的连续数值。
  3. 聚类:将数据样本自动分组,无需预先定义类别。
  4. 时序分析:分析与时间序列相关的模式和预测。

其中,分类、回归和聚类是应用最广泛的三大类算法。本节我们聚焦于分类算法。

什么是分类算法?

分类算法的核心任务是:将具有某些特征的数据项,映射到一个预先定义好的类别标签上。

这个过程可以理解为建立一个从“特征空间”到“类别空间”的映射函数。要完成这个映射,我们需要两类信息:

  1. 数据:即样本的特征。例如,一张人脸的像素矩阵、一封邮件的文本内容、一个信用卡申请人的年收入和贷款记录等。
  2. 标签:即数据对应的类别。例如,人脸对应的姓名ID、邮件是否为垃圾邮件、申请人的信用风险等级(高/中/低)。

在模型训练阶段,我们提供大量“数据-标签”对,让算法去学习它们之间的关联规律。训练完成后,当一个新的、未知类别的数据到来时,模型就能根据其特征,预测出它最可能属于哪个类别。

分类算法的应用场景

分类算法在实际生活中应用极其广泛:

  • 人脸识别:系统通过训练阶段录入的多角度人脸图片(数据)及其对应身份(标签),学习如何将新的人脸图像正确归类到某个身份。
  • 垃圾邮件检测:模型通过学习大量已标记为“垃圾邮件”和“正常邮件”的邮件内容(数据),识别出垃圾邮件的关键词或模式特征,从而对新邮件进行分类。
  • 信用卡申请风险评估:银行根据历史申请人的信息(如收入、负债、信用记录等作为数据)和其后续的还款表现(如“低风险”、“高风险”作为标签),训练模型来预测新申请人的风险等级。

这些应用都遵循同一个模式:基于历史经验(带标签数据)学习规律,并对新情况做出判断(预测类别)。

分类原理的可视化理解

为了直观理解分类,我们通常将其放在一个坐标空间中进行思考。假设我们只有两个特征,那么每个样本就可以用这个二维空间中的一个点来表示。

import matplotlib.pyplot as plt
import numpy as np

# 设置无界面后端,保证代码在任何环境可运行
plt.switch_backend('Agg')

# 模拟两类数据:圆圈和叉叉
np.random.seed(42) # 固定随机种子,保证每次运行结果一致
# 生成第一类数据(圆圈类,标签为0)
class0_x = np.random.normal(2, 0.8, 30)
class0_y = np.random.normal(3, 0.8, 30)
# 生成第二类数据(叉叉类,标签为1)
class1_x = np.random.normal(5, 0.8, 30)
class1_y = np.random.normal(5, 0.8, 30)

fig, ax = plt.subplots(figsize=(8, 6))
# 绘制第一类数据点,用圆圈表示
ax.scatter(class0_x, class0_y, c='blue', marker='o', label='类别 A (圆圈)', alpha=0.7)
# 绘制第二类数据点,用叉叉表示
ax.scatter(class1_x, class1_y, c='red', marker='x', label='类别 B (叉叉)', alpha=0.7)

# 假设模型学习到了一个分类边界(这里用一条直线简单模拟)
# 边界线方程: y = -x + 7
boundary_x = np.array([0, 7])
boundary_y = -boundary_x + 7
ax.plot(boundary_x, boundary_y, 'k--', linewidth=2, label='分类边界')

# 模拟一个新样本点
new_point_x, new_point_y = 1.5, 2.8
ax.scatter(new_point_x, new_point_y, c='green', marker='s', s=150, label='新样本', edgecolors='black', linewidth=1.5)

ax.set_xlabel('特征 X1')
ax.set_ylabel('特征 X2')
ax.set_title('分类算法原理示意图')
ax.legend()
ax.grid(True, linestyle='--', alpha=0.5)
# 在实际讲义中,这里不会执行savefig,仅作演示说明
# plt.savefig('classification_boundary.png')
plt.close(fig)
print("分类示意图已生成。新样本点位于分类边界的左侧区域。")
分类示意图已生成。新样本点位于分类边界的左侧区域。

在上面的示意图中:

  • 蓝色圆圈和红色叉叉代表两类已知的训练数据。
  • 黑色虚线是模型学习到的分类边界,它试图将两类数据尽可能分开。
  • 绿色方块代表一个新来的样本,我们不知道它属于哪一类。
  • 根据其位置(落在边界左侧),模型会将其预测为蓝色圆圈类(类别 A)。

模型训练的本质:就是寻找最优的分类边界(在二维是线或曲线,在三维是面,在高维是超平面),使得训练数据尽可能被正确划分。

模型预测的本质:将新样本点放入这个训练好的空间,看它落在哪个类别区域内,就将其归为哪一类。

案例:鸢尾花分类

我们用一个更真实的例子——经典的鸢尾花(Iris)数据集来加深理解。该数据集包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和1个标签(鸢尾花品种:Setosa, Versicolor, Virginica)。

为了可视化,我们选取其中两个特征(花瓣长度和花瓣宽度)来绘制。

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets

plt.switch_backend('Agg')

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data[:, 2:4]  # 只取花瓣长度(第3列)和花瓣宽度(第4列)两个特征
y = iris.target        # 标签
target_names = iris.target_names

# 为每个类别指定颜色和标记
colors = ['red', 'green', 'blue']
markers = ['o', '^', 's']

fig, ax = plt.subplots(figsize=(10, 7))

# 绘制每个类别的散点图
for i, (color, marker, name) in enumerate(zip(colors, markers, target_names)):
    ax.scatter(X[y == i, 0], X[y == i, 1],
               c=color, marker=marker, label=name, alpha=0.7, edgecolors='w', linewidth=0.5)

ax.set_xlabel('花瓣长度 (cm)')
ax.set_ylabel('花瓣宽度 (cm)')
ax.set_title('鸢尾花数据集散点图(按品种分类)')
ax.legend(title='品种')
ax.grid(True, linestyle='--', alpha=0.3)

# 为了演示,我们手动绘制一些示意性的分类区域边界(非真实模型生成)
# 这仅用于帮助理解“区域”的概念
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

# 简单模拟一个分类区域(实际模型边界会更复杂)
from matplotlib.patches import Polygon
# 模拟Setosa的大致区域
setosa_zone = Polygon([(1, 0.1), (1.8, 0.1), (1.8, 0.6), (1, 0.6)],
                      closed=True, alpha=0.1, color='red', label='Setosa区域示意')
ax.add_patch(setosa_zone)
# 模拟Versicolor和Virginica的大致分界
ax.plot([3, 7], [0.8, 2.5], 'k--', linewidth=1, alpha=0.5, label='分类边界示意')

ax.set_xlim(x_min, x_max)
ax.set_ylim(y_min, y_max)
ax.legend(loc='upper left')
plt.close(fig)
print("鸢尾花数据可视化完成。图中红色半透明区域示意Setosa品种的分布范围,黑色虚线示意Versicolor和Virginica的大致分界。")
鸢尾花数据可视化完成。图中红色半透明区域示意Setosa品种的分布范围,黑色虚线示意Versicolor和Virginica的大致分界。

通过这个二维视图,我们可以清晰地看到:

  1. 数据分布:Setosa(红色圆圈)的花瓣尺寸明显较小,与其他两类区分度很高。Versicolor(绿色三角)和Virginica(蓝色方块)则有部分重叠。
  2. 分类任务:机器学习模型的任务就是学习出能区分这三类花的“边界”。对于Setosa,很容易找到一个区域将其圈出。对于Versicolor和Virginica,则需要一条更复杂的曲线(图中虚线示意)来划分。
  3. 预测过程:如果新来一朵花,我们测量其花瓣长和宽,并在图中标出这个点。它落在哪个区域,我们就预测它属于哪个品种。
  4. 不完美性:注意到蓝色方块(Virginica)有些点落在了绿色区域(Versicolor示意区域),这意味着即使是最好的模型,也可能无法做到100%准确分类,因为数据本身存在重叠。模型需要在“拟合训练数据”和“泛化到新数据”之间取得平衡。

从低维理解到高维抽象

你可能会问:上面只是两个特征(二维),如果鸢尾花有四个特征(四维),或者人脸识别有上千个特征(上千维)怎么办?我们无法想象高维空间。

这正是机器学习中重要的思维方式:

  1. 低维理解:先在二维或三维这种可直观想象的空间里,把分类的核心思想(学习边界、根据区域判断)理解透彻。
  2. 数学抽象:用数学语言(向量、矩阵、距离、概率等)将低维空间中的“点”、“线”、“面”、“区域”等概念,严格地推广到高维空间,定义出“高维空间中的点”、“超平面”、“决策区域”等。
  3. 算法实现:计算机不依赖视觉,它直接处理高维向量和矩阵运算。只要数学定义是清晰的,算法就能在高维空间执行分类任务。

所以,当你面对一个高维分类问题感到困惑时,不妨尝试将其降维思考。例如,一个100维的数据点分类,可以想象成在100个特征中,找到最关键的几个特征,在二维投影图上观察其分布规律。理解低维的原理,是掌握高维算法的基础。

📝 动手练一练

  1. 概念辨析:分类算法和聚类算法最主要的区别是什么?

    👉 点击查看参考答案

    最主要的区别在于是否需要预先知道数据的类别标签。

    • 分类算法是有监督学习,训练数据必须包含特征和对应的已知类别标签。模型学习从特征到标签的映射关系,用于预测新数据的类别。
    • 聚类算法是无监督学习,训练数据只有特征,没有标签。模型的任务是自行发现数据中的内在分组结构,将相似的数据聚在一起。
  2. 动手实践:假设我们有一个更简单的数据集,只有1个特征(X)和2个类别(0和1)。部分数据如下:(X=1, 标签=0), (X=2, 标签=0), (X=4, 标签=1), (X=5, 标签=1)。请思考,如果用一个最简单的“阈值”作为分类边界(例如,X < 3 则为类别0,否则为类别1),这个边界能完美分开数据吗?如果新来一个样本 X=3.5,模型会如何预测?

    👉 点击查看参考答案
    • 评估边界:阈值设为3时,数据点 (1,0), (2,0) 的 X<3,被划为类别0,正确。(4,1), (5,1) 的 X>3,被划为类别1,正确。因此,这个简单的阈值边界能完美分开给定的训练数据。
    • 预测新样本:对于新样本 X=3.5,因为 3.5 > 3,所以模型会将其预测为类别1。 注意:这是一个极度简化的例子。现实中数据更复杂,很难用一个阈值完美分开,且需要更多数据来验证边界是否合理。

本章小结

本节我们开启了机器学习建模的第一扇门——分类算法。我们不仅了解了它的定义和广泛应用,更重要的是,通过可视化的方式,直观理解了分类模型“学习边界、划分区域”的核心思想,并学会了用从低维到高维的抽象思维来理解复杂问题。

📋 行动清单

  • 理解核心:能用自己的话复述分类算法的原理(数据+标签 -> 学习映射 -> 预测新数据类别)。
  • 可视化思维:面对一个分类问题,尝试思考如果只取两个最重要的特征,数据点在二维图上可能会如何分布,边界可能是什么形状。
  • 准备工具:确保你的Python环境中已安装好scikit-learn库(pip install scikit-learn),我们将在接下来的实战中用它来构建真正的分类模型。

—— 小象教研组

配套资料 · 直接下载

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

  • 本节课件:机器学习建模介绍 (1) -- 分类
    PDF · 364KB
    下载
  • 全套课件打包(第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 数据库
    下载