一、监督学习 (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^=argmaxkP(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) |
任务 | 分类、回归 | 聚类、降维、异常检测 |
目标 | 学习输入到输出的映射 | 发现数据内在结构 |
示例 | 垃圾邮件分类、房价预测 | 客户分群、图像压缩 |
四、进阶实践建议
- 监督学习实战 :用
scikit-learn
或PyTorch
做图像分类(MNIST 手写数字)。 - 无监督学习实战 :对高维数据(如图像特征)用
PCA
+KMeans
进行聚类。 - 半监督学习:结合少量标签数据和大量无标签数据。
五、对比示例项目
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()
运行结果分析
-
监督学习分类
- 准确率通常在 95%+,因为 Iris 数据集比较简单。
- 模型利用了标签信息,所以预测效果很好。
-
无监督学习聚类
- 聚类会输出 3 个类别,但类别编号不一定和真实标签一一对应(可能需要手动匹配)。
- KMeans 大致能把 2 个类别分开,但可能会混淆一部分样本。