监督学习

返回机器学习

使用带有标签的训练数据,让模型学习从输入 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 与目标同单位
方差解释比例,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
数据量极大、非结构化深度学习(见深度学习

相关文档