在这里插入图片描述


课前导读

欢迎来到第3课!前两课我们搭建好了环境并了解了sklearn的整体架构,但有一个根本问题还没回答:机器学习到底有多少种“学习方式”? 很多新手一上来就学线性回归、KNN,却不知道这些算法属于监督学习,而KMeans聚类属于无监督学习——连门类都分不清,调参时自然会乱套。

本课将为你建立机器学习的最顶层分类体系:监督学习、无监督学习、半监督学习、强化学习。我们将用最通俗的比喻解释它们的区别,并结合scikit-learn的实际代码,让你不仅能说出来,还能动手区分“哪种问题该用哪类算法”。

学完本课后,你看到任何一个机器学习任务,都能快速判断它属于哪一类、应该从sklearn的哪个模块寻找解决方案。这是从“调包侠”走向“算法设计师”的关键一步。

学习目标

完成本课学习后,你将能够:

  1. 准确说出 监督学习、无监督学习、半监督学习、强化学习的定义和典型应用场景
  2. 区分 分类与回归、聚类与降维的概念边界
  3. 理解 标签、特征、样本、模型等基础术语
  4. 使用 sklearn生成模拟数据并分别用分类、回归、聚类算法演示
  5. 判断 一个实际问题(如垃圾邮件识别、客户分群)应该用哪类学习范式
  6. 避免 混淆无监督学习中的“没有标签”和强化学习中的“奖励信号”

知识点理论讲解

一、机器学习的本质

机器学习 = 从数据中自动发现规律,并用规律对未知数据进行预测或描述。

形式化定义:给定一个任务T和性能度量P,一个计算机程序被经验E改进,如果它在任务T上的性能P随着经验E的增加而提升。(Tom Mitchell,1997)

通俗地说:给算法喂大量“例题”(经验E),它学会了解题方法,然后在新题上表现更好(性能P提升)。

二、四大学习范式的核心差异

范式数据特点目标典型算法(sklearn模块)生活类比
监督学习有标签(输入+正确答案)预测新输入的答案linear_model, tree, svm, neighbors老师给带答案的习题集,学会后做考试卷
无监督学习无标签(只有输入)发现数据内在结构cluster, decomposition给一堆没分类的照片,自己分成“风景”“人像”
半监督学习少量标签+大量无标签利用无标签数据提升监督效果sklearn无直接模块,可用self-training老师只改了几道例题,其余自己悟
强化学习交互数据(状态、动作、奖励)学习最大化累积奖励的策略sklearn无专项(需gym等库)训练狗:做对了给零食,做错了没奖励

重要:scikit-learn主要覆盖监督学习和无监督学习;半监督学习有一些工具(如LabelSpreading),但非核心;强化学习基本不在sklearn范围内,需用OpenAI Gym等专门库。本课会简要介绍强化学习概念,但实战部分聚焦sklearn擅长的前两类。

三、监督学习详解

监督学习是应用最广的范式。它的数据像一张表:

特征1特征2特征n标签(目标)
面积100m²2个卧室距地铁500m房价300万

任务类型

  1. 分类(Classification):标签是离散类别(猫/狗、垃圾邮件/正常邮件、0-9数字)
    • 二分类:是/否、正/负
    • 多分类:猫/狗/鸟
    • 多标签分类:一张图同时包含“猫”和“狗”(sklearn支持,但较少用)
  2. 回归(Regression):标签是连续数值(房价、温度、销售额)

sklearn中的典型分类算法

  • 逻辑回归(LogisticRegression
  • K近邻(KNeighborsClassifier
  • 决策树(DecisionTreeClassifier
  • 随机森林(RandomForestClassifier
  • 支持向量机(SVC

典型回归算法

  • 线性回归(LinearRegression
  • 岭回归(Ridge
  • Lasso(Lasso
  • 决策树回归(DecisionTreeRegressor

四、无监督学习详解

数据没有标签,算法需要自己发现结构。主要分为:

  1. 聚类(Clustering):将相似的样本自动分组。不知道每组叫什么名字(不像分类有“猫”“狗”标签),但组内相似度高、组间差异大。

    • 应用:客户分群、新闻主题聚类、图像压缩
    • sklearn算法:KMeansDBSCANAgglomerativeClustering
  2. 降维(Dimensionality Reduction):将高维数据压缩到低维,同时尽量保留信息。便于可视化和加速后续算法。

    • 应用:数据可视化(降到2D/3D)、特征压缩、去噪
    • sklearn算法:PCAt-SNETruncatedSVD
  3. 关联规则(Association Rule):发现物品之间的共现关系(“啤酒与尿布”)。sklearn中无专门模块,常用mlxtend

五、半监督学习

现实场景中打标签很昂贵(如医疗影像需要专家标注),但无标签数据很容易获取。半监督学习利用少量标签数据+大量无标签数据,往往比只用少量标签数据的监督学习效果好。

常见方法:

  • 自训练(Self-training):先用有标签数据训练模型,然后用模型预测无标签数据,把置信度高的加入训练集,迭代。
  • 标签传播(Label Propagation):基于图结构,将标签沿着相似样本传播。

sklearn提供:LabelPropagationLabelSpreading

六、强化学习

不同于前三种,强化学习没有“静态数据集”,而是让智能体与环境交互,通过试错获得奖励信号,学习最优策略。

核心要素:

  • 状态(State):当前环境描述
  • 动作(Action):智能体可采取的操作
  • 奖励(Reward):执行动作后的即时反馈
  • 策略(Policy):从状态到动作的映射

应用:AlphaGo、自动驾驶、游戏AI、推荐系统。

与监督学习的区别

  • 监督学习有“正确答案”,强化学习只有“奖励分数”
  • 监督学习的数据独立同分布,强化学习的数据有时间相关性
  • 监督学习的错误可以立即指出,强化学习的错误可能延迟

sklearn不提供强化学习算法,但本课会让你理解这个概念,避免日后混淆。

核心原理通俗拆解

监督学习:老师带答案的习题

想象你是高中生,老师发了一套数学题(特征X)和标准答案(标签y)。你一道一道对照答案,总结出解题规律(训练模型)。期末考试时,老师发了新题(测试X),你用总结的规律写出答案(预测y)。如果考试分数高(准确率高),说明你学得好。

关键点:必须要有标准答案(标签),否则无法“校对”。

无监督学习:没人教,自己分类

给你一堆黑白照片,没有说哪些是猫、哪些是狗。你发现有些照片里有尖耳朵、长胡须,另一些有圆耳朵、短鼻子,于是你把它们分成两类。虽然不知道这两类叫什么,但分完后发现每类内部很相似。这就是聚类。

关键点:没有标签,只有特征,目标发现结构。

半监督学习:老师只改了几道题

老师发了100道题,只给了前10道题的答案。你先用这10道题学会一点规律,然后自己尝试做剩下的90道,把有把握的题当作“伪标签”加入训练,再重复。结果虽然没拿到全部答案,但比只用10道题效果更好。

关键点:少量标签 + 大量无标签,自我迭代提升。

强化学习:训小狗

你教小狗坐下。小狗做对了给零食(正奖励),做错了不给零食甚至轻拍(负奖励)。它不知道“坐下”这个动作的正确答案是什么,但通过多次尝试发现,做了某个动作后获得零食的概率高,就越来越倾向于做那个动作。

关键点:没有正确答案,只有奖励信号;学习是通过试错进行的。

底层数学逻辑

监督学习的数学框架

给定训练集 D = {(x₁, y₁), (x₂, y₂), …, (xₙ, yₙ)},其中 x ∈ ℝᵈ 是特征向量,y ∈ ℝ(回归)或{1,…,K}(分类)。

目标是找到函数 f: ℝᵈ → ℝ(或类别),使得期望风险最小化:

R(f) = ∫ L(f(x), y) dP(x, y)

实践中无法获知真实分布P,所以用经验风险最小化(ERM):

R_emp(f) = (1/n) Σ L(f(x_i), y_i)

L是损失函数:

  • 回归:平方损失 L = (y - f(x))²
  • 分类:0-1损失(不可导)或交叉熵(用于逻辑回归)、合页损失(用于SVM)

无监督学习:聚类中的KMeans数学

KMeans目标:将n个样本划分到K个簇,使得每个样本到其簇中心距离平方和最小。

J = Σ_{i=1}^{n} Σ_{k=1}^{K} r_{ik} ||x_i - μ_k||²

其中 r_{ik} = 1 如果样本i属于簇k,否则0;μ_k是簇k的中心。

优化采用EM风格的迭代:

  1. 固定μ,分配样本到最近的中心(E步)
  2. 固定分配,更新μ为簇内均值(M步)

半监督学习:标签传播算法的图拉普拉斯

构建图G=(V,E),节点是样本(有标签+无标签),边权重w_{ij} = exp(-||x_i - x_j||²/σ²)。标签传播通过最小化图上的能量函数:

E = Σ_{i,j} w_{ij} (Y_i - Y_j)²

使得相邻节点标签尽可能一致,同时保持有标签节点的标签不变。解为拉普拉斯矩阵的广义逆。

强化学习:贝尔曼方程

状态价值函数 V(s) = E[G_t | S_t = s],其中G_t是累积折扣奖励:G_t = R_{t+1} + γR_{t+2} + γ²R_{t+3} + …

贝尔曼方程:

V(s) = E[R_{t+1} + γ V(S_{t+1}) | S_t = s]

Q-learning等算法通过迭代近似求解。

本课不要求数学推导,只需理解:监督和无监督有明确的优化目标函数,强化学习引入了时序差分。

scikit-learn API详解

本课重点不是具体算法参数,而是认识sklearn中哪些模块对应哪种学习范式。

监督学习模块

# 分类
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

# 回归
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR

无监督学习模块

# 聚类
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering

# 降维
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE

半监督学习模块(有限支持)

from sklearn.semi_supervised import LabelPropagation, LabelSpreading

数据集生成API

为了演示不同学习范式,sklearn提供了数据生成器:

# 分类数据集
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=100, n_features=2, n_redundant=0, n_clusters_per_class=1)

# 回归数据集
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=100, n_features=1, noise=0.1)

# 聚类数据集(无标签)
from sklearn.datasets import make_blobs
X, y_true = make_blobs(n_samples=100, centers=3, n_features=2)
# 注意y_true是真实的簇归属,但在无监督学习中不会提供给算法

环境配置与依赖安装

本课直接复用第2课创建的sklearn_tutorial环境。如果你还没有该环境,请按照第2课教程完成搭建。

验证当前环境

conda activate sklearn_tutorial
python -c "import sklearn; print(sklearn.__version__)"
# 应输出 1.3.0 或更高

无需额外安装任何包。

完整代码实战(带详细注释)

实战1:监督学习——分类与回归对比

# -*- coding: utf-8 -*-
"""
演示监督学习的两种任务:分类和回归
生成模拟数据,分别训练模型并可视化
"""

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification, make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression, LinearRegression
from sklearn.metrics import accuracy_score, mean_squared_error

# 设置随机种子
np.random.seed(42)

# ========== 1. 分类任务 ==========
print("=== 分类任务演示 ===")
# 生成二分类数据集(2个特征,便于可视化)
X_clf, y_clf = make_classification(
    n_samples=200,
    n_features=2,        # 2个特征,可以在平面上画点
    n_redundant=0,       # 无冗余特征
    n_clusters_per_class=1,
    random_state=42
)

# 划分训练集和测试集
X_train_c, X_test_c, y_train_c, y_test_c = train_test_split(
    X_clf, y_clf, test_size=0.2, random_state=42, stratify=y_clf
)

# 训练逻辑回归模型
clf = LogisticRegression()
clf.fit(X_train_c, y_train_c)

# 预测和评估
y_pred_c = clf.predict(X_test_c)
acc = accuracy_score(y_test_c, y_pred_c)
print(f"逻辑回归分类准确率: {acc:.4f}")

# 可视化决策边界
def plot_decision_boundary(X, y, model, title):
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                         np.arange(y_min, y_max, 0.02))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.RdYlBu)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.RdYlBu, edgecolors='k')
    plt.title(title)
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")

plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plot_decision_boundary(X_train_c, y_train_c, clf, "训练集分类边界")
plt.subplot(1, 2, 2)
plot_decision_boundary(X_test_c, y_test_c, clf, "测试集分类边界")
plt.tight_layout()
plt.show()

# ========== 2. 回归任务 ==========
print("\n=== 回归任务演示 ===")
# 生成一元回归数据集
X_reg, y_reg = make_regression(
    n_samples=100,
    n_features=1,        # 单特征,便于画曲线
    noise=10,            # 添加噪声
    random_state=42
)

# 划分数据
X_train_r, X_test_r, y_train_r, y_test_r = train_test_split(
    X_reg, y_reg, test_size=0.2, random_state=42
)

# 训练线性回归模型
reg = LinearRegression()
reg.fit(X_train_r, y_train_r)

# 预测和评估
y_pred_r = reg.predict(X_test_r)
mse = mean_squared_error(y_test_r, y_pred_r)
print(f"线性回归均方误差: {mse:.2f}")

# 可视化回归线
plt.figure(figsize=(8, 6))
plt.scatter(X_train_r, y_train_r, color='blue', alpha=0.6, label='训练集')
plt.scatter(X_test_r, y_test_r, color='green', alpha=0.6, label='测试集')
# 绘制回归线(在整个X范围)
X_line = np.linspace(X_reg.min(), X_reg.max(), 100).reshape(-1, 1)
y_line = reg.predict(X_line)
plt.plot(X_line, y_line, color='red', linewidth=2, label='回归直线')
plt.xlabel("特征 X")
plt.ylabel("目标 y")
plt.title("线性回归拟合")
plt.legend()
plt.show()

print(f"模型系数: {reg.coef_[0]:.2f}, 截距: {reg.intercept_:.2f}")

实战2:无监督学习——KMeans聚类与PCA降维

# -*- coding: utf-8 -*-
"""
演示无监督学习的两种典型任务:聚类和降维
使用鸢尾花数据集(但聚类时不使用标签,降维后可视化)
"""

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 加载数据
iris = load_iris()
X = iris.data          # 特征 (150, 4)
y_true = iris.target   # 真实标签(仅用于评估,不用于训练)
feature_names = iris.feature_names

print("=== 无监督学习演示 ===")
print(f"数据集形状: {X.shape}, 真实类别: {np.unique(y_true)}")

# 标准化(聚类和PCA都依赖于尺度)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# ========== 1. KMeans 聚类 ==========
# 指定聚成3类(已知鸢尾花有3个品种)
kmeans = KMeans(n_clusters=3, random_state=42, n_init='auto')
y_kmeans = kmeans.fit_predict(X_scaled)

# 评估聚类效果(使用调整兰德指数,无需标签但这里用于演示)
from sklearn.metrics import adjusted_rand_score
ari = adjusted_rand_score(y_true, y_kmeans)
print(f"\nKMeans聚类与真实标签的ARI分数: {ari:.3f} (越接近1越好)")

# 可视化聚类结果(取前两个特征)
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_kmeans, cmap='viridis', edgecolors='k')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], 
            marker='x', s=200, linewidths=3, color='red', label='聚类中心')
plt.xlabel('标准化后的花萼长度')
plt.ylabel('标准化后的花萼宽度')
plt.title('KMeans聚类结果(颜色表示簇)')
plt.legend()

plt.subplot(1, 2, 2)
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_true, cmap='viridis', edgecolors='k')
plt.xlabel('标准化后的花萼长度')
plt.ylabel('标准化后的花萼宽度')
plt.title('真实标签(对比用)')
plt.tight_layout()
plt.show()

# ========== 2. PCA 降维(2D可视化) ==========
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

print(f"\nPCA降维:从4维降到2维,保留方差比例: {pca.explained_variance_ratio_}")
print(f"累计方差比例: {sum(pca.explained_variance_ratio_):.3f}")

plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y_true, cmap='plasma', edgecolors='k')
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维后的鸢尾花数据分布(颜色为真实类别)')
plt.colorbar(label='类别')
plt.show()

# 查看主成分载荷(每个特征对主成分的贡献)
print("\n主成分载荷矩阵(特征重要性):")
for i, name in enumerate(feature_names):
    print(f"{name:12s}: PC1={pca.components_[0, i]:.3f}, PC2={pca.components_[1, i]:.3f}")

实战3:半监督学习——标签传播示例

# -*- coding: utf-8 -*-
"""
演示半监督学习:标签传播算法
使用鸢尾花数据,只给20%的样本打标签,其余无标签,看能否利用无标签数据提升效果
对比:只用20%标签的监督学习 vs 半监督学习
"""

import numpy as np
from sklearn.datasets import load_iris
from sklearn.semi_supervised import LabelSpreading
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 为了模拟半监督场景,随机选择80%的样本移除标签(设为-1)
np.random.seed(42)
n_labeled = int(0.2 * len(X))  # 只有20%有标签
indices = np.random.permutation(len(X))
labeled_idx = indices[:n_labeled]
unlabeled_idx = indices[n_labeled:]

# 创建半监督数据集:有标签样本保持原标签,无标签样本标记为-1
y_semi = np.copy(y)
y_semi[unlabeled_idx] = -1  # -1 表示无标签

print("=== 半监督学习演示 ===")
print(f"总样本数: {len(X)}")
print(f"有标签样本数: {n_labeled} ({100*n_labeled/len(X):.0f}%)")
print(f"无标签样本数: {len(unlabeled_idx)}")

# 1. 只使用有标签样本的监督学习(基准)
X_labeled = X[labeled_idx]
y_labeled = y[labeled_idx]
svm_sup = SVC(kernel='linear', random_state=42)
svm_sup.fit(X_labeled, y_labeled)
y_pred_sup = svm_sup.predict(X)
acc_sup = accuracy_score(y, y_pred_sup)

# 2. 使用标签传播的半监督学习
lp = LabelSpreading(kernel='knn', n_neighbors=7, alpha=0.8)
lp.fit(X, y_semi)
y_pred_semi = lp.predict(X)
acc_semi = accuracy_score(y, y_pred_semi)

print(f"\n仅用20%标签的监督学习准确率: {acc_sup:.4f}")
print(f"半监督学习(标签传播)准确率: {acc_semi:.4f}")
print(f"提升幅度: {(acc_semi - acc_sup)*100:.2f}%")

# 检查哪些无标签样本被纠正了
mislabeled_sup = (y_pred_sup != y) & (y_semi == -1)
corrected = (y_pred_semi == y) & (y_semi == -1)
print(f"无标签样本中,监督学习预测错误数量: {mislabeled_sup.sum()}")
print(f"半监督学习纠正回来的数量: {corrected.sum()}")

案例实操演示

案例1:判断实际问题属于哪类学习范式

问题:电商平台想要预测用户是否会购买某件商品(是/否)。数据包括用户浏览历史、点击记录、是否购买(部分用户有标注)。

分析

  • 监督学习:如果有大量已标注“购买/未购买”的用户数据,直接训练二分类器。
  • 半监督学习:如果标注数据很少(需要付费回访),但有无标注用户行为数据,可用半监督。
  • 无监督学习:如果完全没有购买标签,可以聚类发现用户群体,但无法预测具体用户是否购买。
  • 强化学习:不适合,因为没有交互式奖励。

结论:这是一个监督学习(或半监督)分类任务。

案例2:用sklearn生成数据直观对比四种范式

# 生成4个子图,分别展示分类、回归、聚类、降维的数据形态
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 分类数据(二分类,2特征)
from sklearn.datasets import make_classification
X_clf, y_clf = make_classification(100, 2, n_redundant=0, random_state=42)
axes[0,0].scatter(X_clf[:,0], X_clf[:,1], c=y_clf, cmap='coolwarm')
axes[0,0].set_title("监督学习 - 分类数据(颜色表示类别)")

# 回归数据(单特征,连续目标)
X_reg, y_reg = make_regression(100, 1, noise=10, random_state=42)
axes[0,1].scatter(X_reg, y_reg)
axes[0,1].set_title("监督学习 - 回归数据(连续目标值)")

# 聚类数据(无标签,3个簇)
from sklearn.datasets import make_blobs
X_blob, _ = make_blobs(100, centers=3, n_features=2, random_state=42)
axes[1,0].scatter(X_blob[:,0], X_blob[:,1])
axes[1,0].set_title("无监督学习 - 聚类数据(无标签)")

# 高维数据降维可视化(手写数字8x8=64维,用PCA降到2维)
from sklearn.datasets import load_digits
digits = load_digits()
X_digits = digits.data
y_digits = digits.target
pca = PCA(2)
X_pca = pca.fit_transform(X_digits)
axes[1,1].scatter(X_pca[:,0], X_pca[:,1], c=y_digits, cmap='tab10', alpha=0.6)
axes[1,1].set_title("降维可视化(64维→2维,颜色为真实数字)")

plt.tight_layout()
plt.show()

常见报错与避坑指南

报错1:混淆分类和回归的API

错误:分类任务使用了LinearRegression,回归任务使用了LogisticRegression

后果:代码不报错但结果完全错误(线性回归输出连续值,分类要求离散)。

解决:记住:分类标签是整数(0,1,2…)或字符串,回归目标是连续浮点数。检查y的取值:np.unique(y)看到少量离散值则是分类,大量连续值则是回归。

报错2:无监督学习中错误使用y进行训练

错误kmeans.fit(X, y) 将标签传入fit,但KMeans不需要标签。

后果:不会报错,但KMeans会忽略y(sklearn中大多数无监督模型的fit只接受X)。这不算错误,但传递y会造成混淆。

正确kmeans.fit(X)

报错3:混淆半监督学习中标签为-1的含义

错误:半监督数据中,无标签样本使用0作为占位符,但0可能是一个真实类别。

后果:算法会把类别0的样本当作无标签,导致错误。

解决:无标签样本必须使用一个不在任何真实类别中的值,通常用-1。检查np.unique(y)确保无冲突。

报错4:强化学习在sklearn中找不到模块

错误from sklearn import gymfrom sklearn.强化学习 import ...

后果:ModuleNotFoundError。

解决:sklearn没有强化学习模块。如需强化学习,安装gym(OpenAI Gym)和stable-baselines3等库。本专栏不涉及。

避坑总结

  1. 明确任务类型:先看数据有没有标签(y),有则监督学习,无则无监督学习。有少量标签则考虑半监督。
  2. 评估指标匹配:分类用准确率、精确率、召回率;回归用MSE、MAE、R²;聚类用轮廓系数、惯性;降维用可解释方差。
  3. 数据尺度:许多算法(SVM、KNN、PCA、KMeans)依赖尺度,做之前先标准化(StandardScaler)。
  4. 半监督学习的前提:无标签数据与有标签数据来自同一分布,且标签缺失是随机的。

知识点总结

本课建立了机器学习的顶层认知框架:

核心概念

  1. 监督学习:有标签数据,任务包括分类(离散输出)和回归(连续输出)。
  2. 无监督学习:无标签数据,任务包括聚类(分组)和降维(压缩可视化)。
  3. 半监督学习:少量标签+大量无标签,利用无标签提升效果。
  4. 强化学习:智能体与环境交互,最大化累积奖励。

Sklearn对应模块

  • 分类:sklearn.linear_modelsklearn.treesklearn.svm等中的*Classifier
  • 回归:*Regressor
  • 聚类:sklearn.cluster
  • 降维:sklearn.decompositionsklearn.manifold
  • 半监督:sklearn.semi_supervised

实战技能

  1. 使用make_classificationmake_regressionmake_blobs生成模拟数据。
  2. 逻辑回归和线性回归的完整流程。
  3. KMeans聚类和PCA降维的可视化。
  4. 标签传播算法在半监督场景的应用。

判断能力

  1. 新问题快速归类:有标签→监督;无标签→无监督;交互奖励→强化学习。
  2. 避免常见概念混淆:分类vs回归、聚类vs降维、半监督vs监督。

课后练习题

选择题

  1. 以下哪个任务属于无监督学习?
    A. 根据邮件内容判断是否为垃圾邮件
    B. 根据历史销售数据预测未来一周销量
    C. 将新闻文章自动分成几个主题
    D. 根据用户点击历史推荐商品(有奖励信号)

  2. 在sklearn中,以下哪个类用于降维?
    A. KMeans B. PCA C. SVC D. LogisticRegression

  3. 半监督学习中,通常用哪个特殊值表示无标签样本?
    A. 0 B. 1 C. -1 D. None

填空题

# 根据任务类型选择正确的sklearn类
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

# 任务1:预测房屋价格(连续值)→ 使用 ________
model1 = ________

# 任务2:识别手写数字(0-9分类)→ 使用 ________
model2 = ________

# 任务3:将用户分成不同消费群体 → 使用 ________
model3 = ________

# 任务4:将1000维数据压缩到50维 → 使用 ________
model4 = ________

实操题

  1. 数据生成与分类:使用make_classification生成1000个样本、5个特征的分类数据集,用train_test_split划分,使用RandomForestClassifier训练,输出测试集准确率。

  2. 聚类并评估:使用make_blobs生成500个样本、3个中心点、2个特征的数据集。用KMeans聚类,并将聚类预测的标签与真实生成的标签(y_true)计算调整兰德指数(adjusted_rand_score)。改变n_clusters为2、3、4,观察ARI变化。

  3. 半监督小实验:取鸢尾花数据集,只保留10%的标签(随机选择),其余设为-1。分别用LabelSpreading和只用有标签数据的SVC训练,比较准确率。尝试改变LabelSpreadingkernel参数(‘knn’ vs ‘rbf’),观察效果。

思考题

假设你有一个电商数据集,包含100万用户的行为数据(浏览、点击、购买历史),但只有1万用户有“是否喜欢某商品”的显式评分标签。你会采用哪种学习范式?为什么?如果采用半监督学习,你如何构建特征来利用无标签数据?


下一课预告:第4课我们将深入学习scikit-learn的两大基础依赖库——NumPy和Pandas。没有它们,sklearn根本无法运行。我们会讲解数组运算、矩阵操作、DataFrame核心技巧,让你彻底打好数据基础。敬请期待!


🔗《30节课 scikit-learn 从入门到精通》系列课程导航

去订阅

第一部分:基础入门 & 环境准备(1-6 课)
第二部分:数据预处理 & 数据集操作(7-12 课)
第三部分:传统机器学习回归算法(13-17 课)
第四部分:分类算法精讲(18-23 课)
第五部分:聚类 & 降维 & 集成学习(24-29 课)
第六部分:结业大型项目实战(第 30 课)

🌟 感谢您耐心阅读到这里!
💡 如果本文对您有所启发欢迎:
👍 点赞📌 收藏 📤 分享给更多需要的伙伴。
🗣️ 期待在评论区看到您的想法, 共同进步。
🔔 关注我,持续获取更多干货内容~
🤗 我们下篇文章见~

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐