监督学习
→ 返回机器学习
使用带有标签的训练数据,让模型学习从输入 X 到输出 y 的映射关系,从而对新样本做出预测。
任务类型
| 类型 | 输出 | 典型场景 |
|---|---|---|
| 分类 | 离散类别 | 垃圾邮件检测、图像识别、疾病诊断 |
| 回归 | 连续数值 | 房价预测、股价预测、销量预测 |
核心概念
| 概念 | 说明 |
|---|---|
| 训练集 | 带标签数据,用于拟合模型 |
| 测试集 | 未见数据,用于评估泛化能力 |
| 特征(Feature) | 输入变量 X |
| 标签(Label) | 输出变量 y |
| 过拟合 | 训练集好、测试集差,模型记住了噪声 |
| 欠拟合 | 训练集也差,模型未能学到规律 |
| 泛化 | 模型在新数据上的表现能力 |
常用算法
线性回归
拟合输入与连续输出之间的线性关系,用梯度下降最小化 MSE。
适用:特征与目标近似线性、可解释性要求高
逻辑回归
通过 Sigmoid 函数将线性输出映射为概率,用于二分类。
- 损失函数:交叉熵
- 输出可直接作为概率使用
决策树
递归地对特征空间进行划分,构建 if-else 规则树。
- 划分准则:信息增益(ID3)、基尼系数(CART)、增益率(C4.5)
- 优点:可解释性强,无需特征归一化
- 缺点:容易过拟合,对噪声敏感
支持向量机(SVM)
寻找使两类样本间隔最大的超平面。
| 方式 | 说明 |
|---|---|
| 硬间隔 | 线性可分,直接找最大间隔 |
| 软间隔 | 允许少量误分类,C 参数控制容忍度 |
| 核函数 | 将数据映射到高维空间处理非线性问题(RBF 核最常用) |
K 近邻(KNN)
预测时找训练集中 K 个最近邻居,以多数类(分类)或均值(回归)作为结果。
- K 小 → 过拟合;K 大 → 欠拟合
- 缺点:预测慢,高维失效(维度诅咒)
朴素贝叶斯
假设特征独立,用贝叶斯定理计算后验概率:
- 训练快,对小数据集友好
- 常用于文本分类、垃圾邮件过滤
随机森林
并行训练多棵决策树(Bagging),结果取投票/均值。
- 随机采样训练数据 + 随机选取特征子集
- 对过拟合有较强抵抗力,几乎不需要调参
梯度提升(Gradient Boosting)
串行添加树,每棵树拟合前一轮的残差。
| 框架 | 特点 |
|---|---|
| XGBoost | 正则化强,支持并行,工业界标配 |
| LightGBM | 基于直方图分裂,速度更快,内存更省 |
| CatBoost | 对类别特征原生支持,无需手动编码 |
模型评估
分类指标
| 指标 | 说明 | 适用场景 |
|---|---|---|
| 准确率(Accuracy) | 预测正确比例 | 类别均衡 |
| 精确率(Precision) | 预测为正中真正为正的比例 | 误报代价高(如垃圾邮件) |
| 召回率(Recall) | 实际为正中被找出的比例 | 漏报代价高(如疾病检测) |
| F1 Score | 精确率与召回率的调和均值 | 类别不均衡 |
| AUC-ROC | 分类器区分正负样本的综合能力 | 二分类通用 |
混淆矩阵:
| 预测正 | 预测负 | |
|---|---|---|
| 实际正 | TP(真正例) | FN(假负例) |
| 实际负 | FP(假正例) | TN(真负例) |
回归指标
| 指标 | 说明 |
|---|---|
| MAE | 平均绝对误差,对异常值鲁棒 |
| MSE / RMSE | 放大大误差,RMSE 与目标同单位 |
| R² | 方差解释比例,1 为完美,<0 比均值还差 |
交叉验证
K-Fold:数据分 K 份,轮流用 1 份验证、K-1 份训练,取平均
常用 K=5 或 10,充分利用数据,评估更可靠
特征工程
预处理
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# Z-score 标准化(均值0,标准差1)— SVM、KNN、逻辑回归必做
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test) # 用训练集参数转换,防止数据泄露
# Min-Max 归一化到 [0,1] — 神经网络常用
minmax = MinMaxScaler()
X_train = minmax.fit_transform(X_train)特征选择
| 方法 | 说明 |
|---|---|
| 过滤法 | 相关系数、卡方检验、互信息,独立于模型 |
| 包装法 | 递归特征消除(RFE),用模型评估子集 |
| 嵌入法 | L1 正则(Lasso)、树模型特征重要性 |
处理不平衡数据
from imblearn.over_sampling import SMOTE
# 过采样:合成少数类样本
X_res, y_res = SMOTE(random_state=42).fit_resample(X, y)
# 也可在模型中设置 class_weight='balanced'正则化
| 方法 | 效果 |
|---|---|
| L1(Lasso) | 产生稀疏解,自动做特征选择 |
| L2(Ridge) | 权重均匀收缩,不产生零权重 |
| ElasticNet | 兼顾 L1 和 L2,高维相关特征场景 |
完整流程
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import classification_report
from sklearn.preprocessing import StandardScaler
import pandas as pd
df = pd.read_csv('data.csv')
X, y = df.drop('label', axis=1), df['label']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
param_grid = {'n_estimators': [100, 200], 'max_depth': [None, 10, 20]}
grid = GridSearchCV(RandomForestClassifier(random_state=42),
param_grid, cv=5, scoring='f1_weighted')
grid.fit(X_train, y_train)
print(classification_report(y_test, grid.best_estimator_.predict(X_test)))算法选型
| 场景 | 推荐 |
|---|---|
| 小数据、需要可解释性 | 逻辑回归、决策树 |
| 文本/高维稀疏 | 朴素贝叶斯、线性 SVM |
| 中等规模结构化数据 | 随机森林、XGBoost |
| 大规模结构化数据 | LightGBM |
| 数据量极大、非结构化 | 深度学习(见深度学习) |