监督学习(Supervised Learning)和 无监督学习(Unsupervised Learning)详解

一、监督学习 (Supervised Learning)

1. 定义

监督学习是指在 输入数据 (X)目标标签 (Y) 已知的情况下,训练一个模型,使其能够学习输入与输出之间的映射关系。

  • 输入:特征(Feature)
  • 输出:标签(Label,可能是类别或连续值)
  • 目标:学习函数 f:X→Yf: X \to Yf:X→Y,并能泛化到新的数据

2. 常见任务

分类 (Classification)

1. 定义

分类是监督学习中的一种任务,目标是 学习输入特征与离散类别之间的映射关系

输入 XXX → 输出类别 Y∈{1,2,...,K}Y \in \{1, 2, ..., K\}Y∈{1,2,...,K}。

比如:邮件分类 → "垃圾邮件" / "正常邮件"。


2. 数学模型

分类器需要学习一个函数 f:X→Yf: X \to Yf:X→Y,本质上是计算 某样本属于某个类别的概率

P(Y=k∣X=x),k=1,2,...,K P(Y=k|X=x), \quad k=1,2,...,K P(Y=k∣X=x),k=1,2,...,K

最终的预测结果是:

y^=arg⁡max⁡kP(Y=k∣X=x) \hat{y} = \arg\max_k P(Y=k|X=x) y^=argkmaxP(Y=k∣X=x)


3. 常见算法
  • 线性分类器:逻辑回归 (Logistic Regression)
  • 非线性模型:决策树、随机森林
  • 支持向量机 (SVM)
  • 神经网络 (MLP, CNN, RNN)
  • 集成学习:XGBoost, LightGBM, CatBoost

4. 应用场景
  • 文本分类:垃圾邮件检测、情感分析
  • 图像分类:人脸识别、医学影像诊断
  • 金融风控:贷款违约预测
  • 工业检测:产品合格/不合格分类

5. 实践示例(垃圾邮件分类)
python 复制代码
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 加载数据 (新闻数据替代垃圾邮件示例)
categories = ['sci.space', 'rec.sport.baseball']
data = fetch_20newsgroups(subset='train', categories=categories)
test_data = fetch_20newsgroups(subset='test', categories=categories)

# 特征提取 (TF-IDF)
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(data.data)
X_test = vectorizer.transform(test_data.data)

# 训练逻辑回归
clf = LogisticRegression(max_iter=300)
clf.fit(X_train, data.target)

# 预测
y_pred = clf.predict(X_test)
print("分类准确率:", accuracy_score(test_data.target, y_pred))

回归 (Regression)

1. 定义

回归任务是 预测连续数值 的监督学习问题。

输入 XXX → 输出一个连续变量 Y∈RY \in \mathbb{R}Y∈R。

例如:房价预测(输入特征:面积、位置 → 输出房价)。


2. 数学模型

回归模型试图找到一个函数 f(x)f(x)f(x),使得:

Y≈f(X)+ϵ Y \approx f(X) + \epsilon Y≈f(X)+ϵ

其中 ϵ\epsilonϵ 表示误差项。

常见的损失函数是 均方误差 (MSE)

L=1N∑i=1N(yi−y^i)2 L = \frac{1}{N} \sum_{i=1}^N (y_i - \hat{y}_i)^2 L=N1i=1∑N(yi−y^i)2


3. 常见算法
  • 线性回归 (Linear Regression)
  • 正则化回归:Ridge (L2 正则)、Lasso (L1 正则)
  • 非线性模型:决策树回归、随机森林回归
  • 梯度提升树:XGBoost、LightGBM
  • 神经网络回归

4. 应用场景
  • 房价预测:输入特征 → 预测房价
  • 股票预测:输入历史数据 → 预测未来价格
  • 温度预测:输入环境参数 → 输出温度
  • 工业控制:输入传感器数据 → 预测设备寿命

5. 实践示例(房价预测)
python 复制代码
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

# 加载数据 (加州房价数据集)
data = fetch_california_housing()
X, y = data.data, data.target

# 划分训练/测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练线性回归
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))

分类 vs 回归 对比总结

特点 分类 (Classification) 回归 (Regression)
输出 离散类别 (有限集合) 连续数值 (实数域)
损失函数 交叉熵 (Cross Entropy) 均方误差 (MSE)
模型示例 逻辑回归、SVM、决策树、神经网络 线性回归、随机森林、XGBoost
应用场景 垃圾邮件分类、人脸识别 房价预测、气温预测

3. 常见算法

  • 分类:逻辑回归、决策树、随机森林、支持向量机、神经网络
  • 回归:线性回归、岭回归、Lasso 回归、梯度提升树、神经网络

4. 实践示例:房价预测(回归)

python 复制代码
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 加载数据
data = load_boston()
X, y = data.data, data.target

# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评价
print("MSE:", mean_squared_error(y_test, y_pred))

二、无监督学习 (Unsupervised Learning)

1. 定义

无监督学习是指在 只有输入数据 (X) 而没有标签 (Y) 的情况下,模型需要从数据中自动发现潜在结构或模式。


2. 常见任务

  • 聚类 (Clustering)
    将数据点自动分组,示例:客户分群
  • 降维 (Dimensionality Reduction)
    从高维数据中提取低维表示,示例:PCA 用于数据可视化
  • 异常检测 (Anomaly Detection)
    识别数据中的"异常点",示例:信用卡欺诈检测

3. 常见算法

  • 聚类:K-Means、层次聚类、DBSCAN
  • 降维:PCA、t-SNE、AutoEncoder
  • 异常检测:孤立森林、One-Class SVM

4. 实践示例:K-Means 聚类

python 复制代码
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 生成数据
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.6, random_state=42)

# K-Means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], 
            s=200, c='red', marker='X')
plt.show()

三、对比总结

特点 监督学习 无监督学习
标签 有标签 (X, Y) 无标签 (X)
任务 分类、回归 聚类、降维、异常检测
目标 学习输入到输出的映射 发现数据内在结构
示例 垃圾邮件分类、房价预测 客户分群、图像压缩

四、进阶实践建议

  1. 监督学习实战 :用 scikit-learnPyTorch 做图像分类(MNIST 手写数字)。
  2. 无监督学习实战 :对高维数据(如图像特征)用 PCA + KMeans 进行聚类。
  3. 半监督学习:结合少量标签数据和大量无标签数据。

五、对比示例项目

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

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

# ---------------------------------------------------------
# 2. 监督学习:逻辑回归分类
# ---------------------------------------------------------
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

clf = LogisticRegression(max_iter=200)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

print("监督学习分类准确率:", accuracy_score(y_test, y_pred))
print("监督学习混淆矩阵:\n", confusion_matrix(y_test, y_pred))

# ---------------------------------------------------------
# 3. 无监督学习:KMeans 聚类
# ---------------------------------------------------------
kmeans = KMeans(n_clusters=3, random_state=42)
y_kmeans = kmeans.fit_predict(X)

print("\nKMeans 聚类结果(与真实标签对齐情况):")
print("混淆矩阵:\n", confusion_matrix(y, y_kmeans))

# ---------------------------------------------------------
# 4. 可视化对比 (PCA降维到2D)
# ---------------------------------------------------------
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# 监督学习结果(真实标签)
axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
axes[0].set_title("真实标签 (Supervised Truth)")

# 无监督学习结果(KMeans)
axes[1].scatter(X_pca[:, 0], X_pca[:, 1], c=y_kmeans, cmap='viridis')
axes[1].scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], 
                s=200, c='red', marker='X')  # 聚类中心
axes[1].set_title("KMeans 聚类结果 (Unsupervised)")

plt.show()

运行结果分析

  1. 监督学习分类

    • 准确率通常在 95%+,因为 Iris 数据集比较简单。
    • 模型利用了标签信息,所以预测效果很好。
  2. 无监督学习聚类

    • 聚类会输出 3 个类别,但类别编号不一定和真实标签一一对应(可能需要手动匹配)。
    • KMeans 大致能把 2 个类别分开,但可能会混淆一部分样本。