文章 · 2024-01-01

监督学习 vs 非监督学习:概念、算法与实践


2. 核心概念与差异

2.1 监督学习(Supervised Learning)

监督学习从有标签的数据中学习—每个输入都配有其正确答案。算法学习一个映射函数 f,使得 f(x) ≈ y

2.2 非监督学习(Unsupervised Learning)

非监督学习处理无标签的数据,在没有预标注答案的情况下发现数据的内在结构。

2.3 差异一览表

维度 监督学习 非监督学习
训练数据 有标签 (X, y) 无标签 (X)
主要目标 预测明确的输出 发现隐藏的结构
评价方式 对比真实标签 (准确率, RMSE, F1-Score) 间接指标 (轮廓系数, 重构误差)
主要挑战 过拟合、标注成本高 结果解释困难、评价标准模糊

3. 工作流程对比

3.1 监督学习流水线

  1. 数据标注与划分:获取或标注数据;划分为训练集、验证集和测试集。
  2. 特征工程与模型选择:提取相关特征;选择模型架构(线性、树模型或神经网络)。
  3. 训练与调优:在训练集上训练;利用验证集调整超参数(学习率、树深度)。
  4. 评估与部署:在测试集上评估;达到标准后上线。
  5. 监控与迭代:警惕概念漂移(分布变化);定期用新数据再训练。

3.2 非监督学习流水线

  1. 数据预处理:标准化或归一化特征。选择合适的距离度量(欧氏距离、余弦相似度)。许多算法(如 K-means、PCA)对尺度敏感。
  2. 算法与超参数探索:选择算法(K-means、DBSCAN)并探索关键超参数(簇数 k、邻域半径 ε)。
  3. 结果验证:无真实标签的情况下,可视化结果(聚类、降维图),结合业务知识验证。
  4. 下游应用:将结果作为下游任务的输入—例如将聚类结果作为用户标签,或将降维特征用于监督学习模型。

4. 典型算法速览

4.1 监督学习算法

算法 简介 适用场景
线性回归 最小化预测值与真实值的平方误差。 可解释的基线模型;房价、销量预测。
逻辑回归 使用 Sigmoid 函数将线性输出映射到 (0,1) 区间进行二分类。 概率估计;CTR 预估、信用评分。
决策树 (CART) 递归划分数据以最大化节点纯度。 直观的规则;处理非线性和缺失值,但易过拟合。
随机森林 结合多棵决策树的投票结果。 抵抗过拟合;衡量特征重要性;强大的基线。
支持向量机 (SVM) 寻找最大间隔的超平面;用核技巧处理非线性。 小样本高维数据;文本分类、图像识别。
Boosting (XGBoost/LightGBM) 逐次拟合前一轮的残差,叠加弱学习器。 表格数据性能顶尖;特征工程友好。
深度网络 (CNN/Transformer) 通过多层非线性变换自动学习层次化特征。 CNN 捕捉局部空间特征(图像);Transformer 建模全局依赖(文本、语音)。

4.2 非监督学习算法

算法 简介 特点
K-means 迭代更新簇中心以最小化点到中心的距离平方和。 简单高效;需预指定 k,对初始值敏感。用户分群。
DBSCAN 基于密度定义簇;自动识别噪声、发现任意形状。 无需预设 k;对噪声鲁棒。地理空间数据分析。
层次聚类 通过合并(自底向上)或拆分(自顶向下)形成树状结构。 生成谱系图;无需预设 k。物种进化分析。
PCA 投影到方差最大的方向上。 经典降维方法;压缩、去噪、可视化。
t-SNE / UMAP 通过非线性嵌入保持高维数据的局部邻域结构。 高维数据(文本、基因)可视化利器;常优于 PCA。
高斯混合模型 (GMM) 将数据建模为多个高斯分布的混合;用 EM 算法软聚类。 处理椭圆簇;输出成员概率。
核密度估计 (KDE) 在每个数据点放置核函数(如高斯核)估计概率密度。 数据分布可视化;异常检测。
生成对抗网络 (GAN) 生成器和判别器对抗;生成器创造逼真数据,判别器识别真假。 图像合成和数据增强效果惊人。
变分自编码器 (VAE) 编码到潜在分布,采样后重构—生成模型。 生成可控新样本;潜在变量具有语义解释性。

5. 场景与案例

任务 方法范式 示例
医学影像诊断 监督 (CNN/Transformer) 输入 CT 图像 → 模型分类病灶区域(肿瘤、结节)。
电商用户分群 非监督 (K-means/DBSCAN) 根据浏览和购买行为将用户划分为价值等级。
风格化图像生成 非监督 (GAN/VAE) 将普通照片变换为梵高或水墨画风格。
半监督文本分类 自监督预训练 + 监督微调 用海量无标签文本预训练(如 BERT),再用少量有标签数据微调。现代 NLP 主流范式。

6. 拓展范式

监督与非监督的边界不是绝对的,实践中两者日益融合:


7. 选型指南 & 实战技巧

  1. 从数据和标签出发

    • 有高质量标签:优先选择监督学习。
    • 标注成本高:优先考虑非监督学习进行数据探索(聚类、可视化),或使用半监督/自监督方法减少标签依赖。
  2. 考虑模型规模与数据复杂度

    • 大规模感知任务(图像、语音、文本):深度学习是最佳选择。
    • 小样本高维数据:SVM 或随机森林可能表现更优。
    • 结构化 / 表格数据:XGBoost/LightGBM 通常性能最优。
  3. 平衡可解释性与精度

    • 金融、医疗等高风险或需合规的场景:青睐可解释的模型(线性回归、逻辑回归、决策树)。
    • 在线广告、推荐等追求极致效果的场景:部署复杂、精度高的模型(深度网络)。
  4. 结合离线探索与在线应用

    • 一个验证的模式是:先用非监督学习离线探索发现用户群体或数据模式;再将这些发现作为特征或目标,构建监督学习模型并在线部署以提供实时预测。

8. 两种范式的实践意义

监督学习擅长预测:在明确的目标和优质标签驱动下,它做出精准、可验证的预测。非监督学习擅长发现:在没有先验标签的情况下,它揭示隐藏的结构和意外的模式。

在生产系统中,两者很少孤立。最强大的解决方案往往将其结合:先通过非监督技术探索数据结构,再通过监督学习构建精准的预测模型,形成从洞察到价值的完整闭环。


9. 代码示例

9.1 环境准备

pip install scikit-learn matplotlib torch torchvision

9.2 监督学习示例

线性回归 (California Housing)

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

# 加州房价数据集
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression().fit(X_train, y_train)
pred = model.predict(X_test)
print(f"RMSE on California Housing: {mean_squared_error(y_test, pred, squared=False):.2f}")

逻辑回归 (乳腺癌二分类)

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

X, y = load_breast_cancer(return_X_y=True)
# 归一化提升性能
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

clf = LogisticRegression(max_iter=1000).fit(X_scaled, y)
print(f"Accuracy on Breast Cancer: {clf.score(X_scaled, y):.3f}")

9.3 非监督学习示例

K-means 聚类 + 可视化

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

X, y = load_iris(return_X_y=True) # y 在这里只用于后续对比,K-means本身不用
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10).fit(X) # n_init='auto' in future

# 可视化前两个特征
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.title('K-means Clustering on Iris Dataset')
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.show()

PCA + t-SNE 可视化

from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)

# 先用PCA降到合理的中间维度
X_reduced = PCA(n_components=50, random_state=42).fit_transform(X) if X.shape[1] > 50 else X

# 再用t-SNE进行非线性降维以可视化
X_embedded = TSNE(n_components=2, learning_rate='auto', init='pca', random_state=42).fit_transform(X_reduced)

plt.scatter(X_embedded[:, 0], X_embedded[:, 1], c=y, cmap='viridis') # 用真实标签y着色以验证效果
plt.title('t-SNE Visualization of Iris Dataset')
plt.xlabel('t-SNE feature 1')
plt.ylabel('t-SNE feature 2')
plt.show()

9.4 简易 GAN 骨架 (PyTorch)

这是一个极简的 GAN 结构,用于演示其核心组件,并非一个完整的训练脚本。

import torch
from torch import nn

# 定义生成器
class Generator(nn.Module):
    def __init__(self, z_dim=100, img_dim=784):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(z_dim, 256),
            nn.ReLU(True),
            nn.Linear(256, 512),
            nn.ReLU(True),
            nn.Linear(512, img_dim),
            nn.Tanh()  # 将输出归一化到[-1, 1]
        )
    def forward(self, z):
        return self.net(z)

# 定义判别器
class Discriminator(nn.Module):
    def __init__(self, img_dim=784):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(img_dim, 512),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, 1),
            nn.Sigmoid() # 输出一个[0, 1]的概率值
        )
    def forward(self, x):
        return self.net(x)

# 初始化模型、优化器和损失函数
G = Generator()
D = Discriminator()
g_opt = torch.optim.Adam(G.parameters(), lr=2e-4)
d_opt = torch.optim.Adam(D.parameters(), lr=2e-4)
criterion = nn.BCELoss()

print("GAN components initialized successfully.")

10. 参考资料

© 2026 Yuxu Ge ·