机器学习基础概念

标签: #机器学习 #监督学习 #无监督学习 #评估指标 #正则化
学习周期:2 天 | 核心目标:理解机器学习核心术语、评估指标及常见问题,为后续算法学习打下基础


5.1 机器学习基础概念

机器学习是让计算机从数据中学习规律,从而对新数据做出预测或决策的技术。本章是所有机器学习算法的理论基石,必须彻底理解。


5.1.1 监督学习 vs 无监督学习

机器学习最核心的分类方式:是否有标签(标准答案)

类型 定义 输入 输出 常见算法 典型任务
监督学习 数据包含特征+标签,学习“特征→标签”映射 特征 + 标签 预测标签 线性回归、逻辑回归、决策树、SVM、神经网络 分类、回归
无监督学习 数据只有特征,自动发现数据结构 仅特征 聚类/降维结果 K-Means、DBSCAN、PCA、t-SNE 聚类、降维
代码示例(简单区分)
# 从 sklearn 的 datasets 模块导入 make_blobs 函数,用于生成聚类用的合成数据集
from sklearn.datasets import make_blobs

# 从 sklearn 的 cluster 模块导入 KMeans 类,用于执行 K-Means 聚类算法(无监督学习)
from sklearn.cluster import KMeans

# 从 sklearn 的 linear_model 模块导入 LogisticRegression 类,用于执行逻辑回归分类(监督学习)
from sklearn.linear_model import LogisticRegression

# 注释:监督学习示例部分开始,说明此处使用有标签的数据 y
# 生成一个包含 300 个样本、3 个中心点(即 3 个类别)的二维 blobs 数据集
# n_samples=300:样本总数;centers=3:簇中心数量(类别数);random_state=42:随机种子,确保结果可重复
X_supervised, y_supervised = make_blobs(n_samples=300, centers=3, random_state=42)

# 创建一个逻辑回归模型对象,使用默认参数(如 solver='lbfgs',max_iter=100 等)
model = LogisticRegression()

# 使用生成的带标签数据训练逻辑回归模型,X_supervised 是特征矩阵,y_supervised 是目标标签向量
model.fit(X_supervised, y_supervised)

# 打印模型在训练集上的准确率,model.score() 返回平均分类准确率
print("监督学习准确率:", model.score(X_supervised, y_supervised))

# 注释:无监督学习示例部分开始,说明此处不使用标签
# 创建一个 K-Means 聚类模型,指定聚类数量为 3(与数据真实类别数相同),random_state=42 保证聚类结果可重复
kmeans = KMeans(n_clusters=3, random_state=42)

# 仅使用特征矩阵 X_supervised 进行聚类拟合(无标签 y),K-Means 会为每个样本分配一个簇标签
kmeans.fit(X_supervised)  # 只用特征

# 打印聚类后前 10 个样本的簇标签(kmeans.labels_ 是每个样本的聚类结果,[:10] 取前 10 个)
print("无监督学习聚类标签:", kmeans.labels_[:10])

5.1.2 特征、标签、训练集/测试集划分

核心定义
  • 特征(Feature):输入变量,用于预测的属性(X)
  • 标签(Label):输出变量,需要预测的目标(y)
  • 训练集(Train Set):用于模型学习规律的数据
  • 测试集(Test Set):用于评估模型泛化能力的数据(从未见过的新数据)
为什么要划分?
  • 避免模型只记住训练数据,无法预测新数据
  • 真实评估模型的泛化能力
划分规则
  • 比例:常用 7:3 或 8:2
  • 原则:随机划分、保持分布一致、数据独立同分布
代码示例(sklearn 标准划分)
# 从 sklearn 的 model_selection 模块导入 train_test_split 函数,用于将数据集随机划分为训练集和测试集
from sklearn.model_selection import train_test_split

# 从 sklearn 的 datasets 模块导入 load_iris 函数,用于加载经典的鸢尾花(Iris)数据集
from sklearn.datasets import load_iris

# 加载鸢尾花数据集,返回一个类似字典的对象,包含数据、标签、特征名称等信息
iris = load_iris()

# 提取特征矩阵 X,形状为 (150, 4),包含 150 个样本,每个样本有 4 个特征(花萼长宽、花瓣长宽)
X = iris.data      # 特征

# 提取标签数组 y,形状为 (150,),每个元素是 0、1 或 2,代表三种鸢尾花品种(Setosa, Versicolour, Virginica)
y = iris.target    # 标签

# 划分数据集:80% 用于训练,20% 用于测试,并保持训练集和测试集中各类别样本的比例与原数据集一致
# test_size=0.2:指定测试集占全部数据的 20%(即 30 个样本),训练集占 80%(即 120 个样本)
# random_state=42:固定随机种子,保证每次运行划分结果相同,便于复现
# stratify=y:按照标签 y 进行分层抽样,确保训练集和测试集中各类别(0,1,2)的比例与原始数据集相同(各占约 1/3)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# 打印训练集的样本数量(X_train 的行数)
print(f"训练集大小: {X_train.shape[0]} 样本")

# 打印测试集的样本数量(X_test 的行数)
print(f"测试集大小: {X_test.shape[0]} 样本")

5.1.3 过拟合、欠拟合、偏差-方差权衡

概念 定义 表现 解决方法
欠拟合 模型过于简单,未捕捉数据规律 训练误差高,测试误差高 增加模型复杂度、增加特征、减少正则化
过拟合 模型过于复杂,记住噪声 训练误差极低,测试误差高 增加数据量、正则化、早停、降维
偏差 模型预测值与真实值的系统误差 高偏差导致欠拟合 使用更复杂模型
方差 模型对训练数据变化的敏感度 高方差导致过拟合 增加数据、正则化
偏差-方差权衡图(概念示意)
# 导入 NumPy 库,用于生成数值数组和数学计算
import numpy as np

# 导入 Matplotlib 的 pyplot 模块,用于绘图
import matplotlib.pyplot as plt

# 生成模型复杂度的横坐标值:从 0 到 1 之间均匀取 100 个点
# np.linspace(0, 1, 100) 返回一个包含 100 个等间距数值的一维数组,起点 0,终点 1
complexity = np.linspace(0, 1, 100)

# 计算偏差平方(bias²)随复杂度的变化:假设偏差 = (1 - complexity),则偏差² = (1 - complexity)²
# 复杂度低时偏差大,复杂度高时偏差趋近于 0
bias = (1 - complexity)**2

# 计算方差(variance)随复杂度的变化:假设方差 = complexity²
# 复杂度低时方差小,复杂度高时方差增大
variance = complexity**2

# 计算总误差 = 偏差² + 方差 + 不可约误差(常数 0.1)
# 不可约误差表示数据本身的噪声,无法通过模型降低
total_error = bias + variance + 0.1

# 绘制偏差²曲线:横坐标 complexity,纵坐标 bias
# label='偏差²':图例标签;linestyle='--':虚线样式
plt.plot(complexity, bias, label='偏差²', linestyle='--')

# 绘制方差曲线:label='方差';linestyle='-.':点划线样式
plt.plot(complexity, variance, label='方差', linestyle='-.')

# 绘制总误差曲线:linewidth=2 设置线宽为 2 像素,使其更突出
plt.plot(complexity, total_error, label='总误差', linewidth=2)

# 在 x=0.5 处添加一条垂直参考线,颜色红色,线型点线,图例标签为“最佳复杂度”
# 该位置表示偏差和方差达到平衡的最优模型复杂度
plt.axvline(x=0.5, color='red', linestyle=':', label='最佳复杂度')

# 设置横坐标标签文字为“模型复杂度”
plt.xlabel('模型复杂度')

# 设置纵坐标标签文字为“误差”
plt.ylabel('误差')

# 显示图例(根据各曲线的 label 参数自动生成)
plt.legend()

# 设置图表标题为“偏差-方差权衡”
plt.title('偏差-方差权衡')

# 显示绘制的图形窗口
plt.show()

5.1.4 正则化(L1 / L2)

正则化用于防止过拟合,通过在损失函数中加入惩罚项,限制模型参数的大小。

类型 公式(线性回归为例) 特点 效果
L1 正则化(Lasso) Loss + λ∑|w_i| 产生稀疏解(部分权重为0) 特征选择
L2 正则化(Ridge) Loss + λ∑w_i² 权重趋近于0但不为0 稳定参数

超参数 λ:λ 越大 → 惩罚越强 → 越防止过拟合(但过大导致欠拟合)

代码示例(正则化对比)
# 从 sklearn.linear_model 模块导入 Ridge(岭回归,L2正则化)、Lasso(套索回归,L1正则化)、LinearRegression(普通线性回归,无正则化)
from sklearn.linear_model import Ridge, Lasso, LinearRegression

# 从 sklearn.datasets 模块导入 make_regression 函数,用于生成回归任务的合成数据集
from sklearn.datasets import make_regression

# 从 sklearn.model_selection 模块导入 train_test_split 函数,用于划分训练集和测试集
from sklearn.model_selection import train_test_split

# 生成回归数据集:100个样本,20个特征,噪声较大(noise=10),固定随机种子保证结果可复现
# n_samples=100:样本数;n_features=20:特征数(自变量个数);noise=10:添加的高斯噪声标准差,值越大数据越分散
# random_state=42:固定随机种子,确保每次运行生成相同的数据
X, y = make_regression(n_samples=100, n_features=20, noise=10, random_state=42)

# 划分训练集和测试集:测试集占20%(即20个样本),训练集占80%(80个样本),随机种子固定为42,不做分层(回归任务不需要stratify)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建普通线性回归模型对象(无正则化,最小化残差平方和)
lr = LinearRegression()

# 使用训练集训练线性回归模型:学习特征到目标值的线性映射
lr.fit(X_train, y_train)

# 打印线性回归模型学习到的系数中非零的数量(coef_ 是模型的特征权重系数,形状 (n_features,))
# 普通线性回归通常所有系数都非零(除非数据导致某些系数恰好为0),这里用于对比正则化后的稀疏性
print("线性回归系数非零数量:", sum(lr.coef_ != 0))

# 创建岭回归(Ridge)模型,alpha=1.0 为正则化强度,alpha越大对系数的惩罚越重,防止过拟合
ridge = Ridge(alpha=1.0)

# 训练岭回归模型
ridge.fit(X_train, y_train)

# 打印 Ridge 模型中系数非零的数量(L2正则化不会使系数精确为0,只会缩小它们,所以通常所有系数都非零)
print("Ridge 系数非零数量:", sum(ridge.coef_ != 0))

# 创建套索回归(Lasso)模型,alpha=0.1 为正则化强度,Lasso 使用 L1 正则化,可以使部分系数精确为0,实现特征选择
lasso = Lasso(alpha=0.1)

# 训练 Lasso 模型
lasso.fit(X_train, y_train)

# 打印 Lasso 模型中系数非零的数量(由于 L1 正则化的稀疏性,部分系数会变为 0,因此非零系数数量通常少于特征总数)
print("Lasso 系数非零数量:", sum(lasso.coef_ != 0))  # 部分系数为0

5.1.5 评估指标

一、分类任务评估指标
1. 概述

针对分类任务,评估指标主要用来衡量模型预测的准确程度。选择哪个指标,取决于具体问题(例如是否类别不平衡,更关注哪类错误)。
所有指标都建立在混淆矩阵的基础上。

2. 混淆矩阵 (Confusion Matrix)

以二分类(正例 P,负例 N)为例,混淆矩阵是一个 2×2 表格:

              预测为正例 预测为负例
真实为正例     TP          FN     
真实为负例     FP          TN     
  • TP (True Positive):真正例,正确预测为正例的数量
  • FN (False Negative):假负例,错误预测为负例的数量(漏报)
  • FP (False Positive):假正例,错误预测为正例的数量(误报)
  • TN (True Negative):真负例,正确预测为负例的数量
3. 核心评估指标
指标 公式 核心含义 关注点 / 适用场景
准确率 (Accuracy) \frac{TP + TN}{TP + TN + FP + FN} 所有样本中预测正确的比例 类别均衡时简单直观;类别不平衡时失效
精确率 (Precision) \frac{TP}{TP + FP} 预测为正例的样本中,真正正例的比例 看重“预测出的正例有多准”(如垃圾邮件过滤,误报代价高)
召回率 (Recall) / 灵敏度 \frac{TP}{TP + FN} 真实正例中,被正确预测出的比例 看重“正例被漏掉多少”(如疾病筛查,漏报代价高)
特异度 (Specificity) \frac{TN}{TN + FP} 真实负例中,被正确预测为负例的比例 关注负例的识别能力
F1 分数 (F1-Score) 2 \times \frac{Precision \times Recall}{Precision + Recall} 精确率与召回率的调和平均数 需要同时平衡精确率和召回率
4. 多分类问题的指标扩展

对于多分类问题(类别数 > 2),通常采用两种平均方式:

指标 计算方式 特点
宏平均 (Macro-Average) 先计算每个类别的指标(如精确率),再对所有类别求算术平均 平等对待每一个类别,不受多数类影响
微平均 (Micro-Average) 先将所有类别的 TP、FP、FN 对应求和,再计算指标 受多数类影响更大,反映整体样本表现
  • 若各类别样本数相近且同等重要 → 使用宏平均
  • 若更关注整体正确率,允许多数类主导 → 使用微平均
5. 考量排序能力的指标

这些指标不只看最终分类结果,还关注模型对样本“属于正例”的信心或概率排序。

5.1 ROC 曲线
  • 横轴:假正例率 (FPR) = \frac{FP}{TN + FP}(误报率)
  • 纵轴:真正例率 (TPR) = \frac{TP}{TP + FN}(召回率)
    通过调整分类阈值,画出曲线。曲线越靠近左上角,模型性能越好。
5.2 AUC (Area Under the ROC Curve)
  • 含义:ROC 曲线下的面积(最大为 1)
  • 优势:衡量模型将正例排在负例前面的能力。AUC 越大,排序能力越强。对类别不平衡不敏感,是非常好的综合评估指标。
6. 业务场景与指标选择对照表
业务场景 核心关注点(业务代价) 首选指标 参考指标
癌症/疾病筛查 漏掉一个病人(假阴性)代价极高,宁可误报 召回率 特异度、F2 分数
垃圾邮件过滤 误把正常邮件判为垃圾(假阳性)用户无法接受 精确率 特异度、F1 分数
金融欺诈检测 既要抓欺诈(召回率),又要减少误判(精确率) F1 分数 或 AUC 精确率、召回率
信用卡审批/贷款违约预测 错判好客户为坏客户损失业务机会;错判坏客户为好客户带来坏账 AUC PR 曲线、KS 统计量
产品质量检测 把次品判为合格品(假阴性)影响品牌,通常容忍度更低 召回率(针对次品) F1 分数、精确率
刑事嫌疑人筛选 抓错无辜者(假阳性)代价巨大,宁可漏过 精确率 召回率、F1 分数
舆情监控/敏感内容识别 漏掉敏感内容(假阴性)可能违规,要求召回率高 召回率 F1 分数、AUC
推荐系统(点击率预测) 希望推荐物品既准又全 精确率@K召回率@K MAP、NDCG
客户流失预警 漏掉流失客户损失大;误判打 召回率(初期)→ F1(调优后) AUC、提升率
多分类(各类别均衡) 每个类别都重要 宏平均 F1 宏平均精确率/召回率
多分类(类别严重不平衡) 多数类影响整体体验,少数类也不能太差 微平均 F1 加权 F1、各类别单独 F1
7. 总结与选择速查
业务目标 首选指标
类别均衡,看整体正确率 准确率
不能漏掉正例(如癌症筛查) 召回率
预测的正例要非常准(如邮件过滤) 精确率
兼顾精确率和召回率 F1 分数
类别严重不平衡(如 99:1) AUC 或 F1
多分类且各类别平等重要 宏平均
多分类且关注整体样本表现 微平均
8. 代码示例(分类指标)
# 从 sklearn.metrics 模块导入多个评估分类模型性能的指标函数
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve

# 从 sklearn.linear_model 模块导入逻辑回归模型
from sklearn.linear_model import LogisticRegression

# 从 sklearn.datasets 模块导入 make_classification 函数,用于生成分类任务的合成数据集
from sklearn.datasets import make_classification

# 导入 matplotlib.pyplot 用于绘图
import matplotlib.pyplot as plt

# 生成二分类数据集:500个样本,10个特征,类别数为2,固定随机种子确保结果可复现
# n_samples=500:样本总数;n_features=10:特征数量;n_classes=2:二分类问题;random_state=42:随机种子
X, y = make_classification(n_samples=500, n_features=10, n_classes=2, random_state=42)

# 划分训练集和测试集:测试集占30%(150个样本),训练集占70%(350个样本),随机种子固定为42
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建逻辑回归模型对象(默认参数:solver='lbfgs', 最大迭代次数等)
model = LogisticRegression()

# 使用训练集训练逻辑回归模型,学习特征到类别的映射关系
model.fit(X_train, y_train)

# 预测测试集的类别标签(0或1),返回形状为 (n_samples,) 的数组
y_pred = model.predict(X_test)

# 预测测试集属于正类(类别1)的概率,predict_proba返回形状 (n_samples, 2),[:, 1]取第二列(正类概率)
y_proba = model.predict_proba(X_test)[:, 1]

# 计算并打印准确率:预测正确的样本数占总样本数的比例
print("准确率:", accuracy_score(y_test, y_pred))

# 计算并打印精确率:预测为正类的样本中真正为正类的比例(Precision = TP / (TP + FP))
print("精确率:", precision_score(y_test, y_pred))

# 计算并打印召回率:真正为正类的样本中被正确预测出来的比例(Recall = TP / (TP + FN))
print("召回率:", recall_score(y_test, y_pred))

# 计算并打印 F1 分数:精确率和召回率的调和平均数,综合评价指标
print("F1-score:", f1_score(y_test, y_pred))

# 计算并打印 AUC(Area Under the ROC Curve):ROC 曲线下的面积,衡量模型区分正负类的能力,值越大越好
print("AUC:", roc_auc_score(y_test, y_proba))

# 计算 ROC 曲线所需的假阳性率(FPR)和真阳性率(TPR),返回三个值:fpr, tpr, thresholds(阈值数组)
fpr, tpr, _ = roc_curve(y_test, y_proba)

# 绘制 ROC 曲线:横坐标为假阳性率,纵坐标为真阳性率,图例中显示 AUC 值并保留两位小数
plt.plot(fpr, tpr, label=f'AUC = {roc_auc_score(y_test, y_proba):.2f}')

# 绘制对角线(随机分类器的参考线):从 (0,0) 到 (1,1),黑色虚线,表示随机猜测时的 ROC 曲线
plt.plot([0,1], [0,1], 'k--')

# 设置横坐标标签为“假阳性率”(False Positive Rate)
plt.xlabel('假阳性率')

# 设置纵坐标标签为“真阳性率”(True Positive Rate)
plt.ylabel('真阳性率')

# 设置图表标题为“ROC 曲线”
plt.title('ROC 曲线')

# 显示图例(自动使用 plot 中的 label 参数)
plt.legend()

# 显示绘制的图形
plt.show()
二、回归任务评估指标
1. 概述

回归任务的目标是预测一个连续数值(如房价、温度、销量)。评估指标用于衡量模型预测值 (\hat{y}_i) 与真实值 (y_i) 之间的差异。选择合适的指标取决于数据分布、异常值情况以及业务对误差的容忍程度。
所有指标都建立在残差 (e_i = y_i - \hat{y}_i) 的基础上。

2. 核心评估指标
指标 公式 核心含义 特点 / 适用场景
均方误差 (MSE) \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 预测误差的平方的平均值 对大误差惩罚严重,易受异常值影响;单位是原单位的平方
均方根误差 (RMSE) \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} MSE 的平方根,与原单位一致 最常用指标,对大误差敏感,易受异常值影响
平均绝对误差 (MAE) \frac{1}{n}\sum_{i=1}^{n}\|y_i - \hat{y}_i\| 预测误差绝对值的平均值 对异常值较鲁棒,体现平均偏差大小
中位绝对误差 (MedAE) \text{median}(\|y_1 - \hat{y}_1\|, \dots, \|y_n - \hat{y}_n\|) 误差绝对值的中位数 对异常值非常鲁棒,适合有离群点的数据
决定系数 (R^2) 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2} 模型解释的方差比例 衡量拟合优度,取值 (-\infty, 1],越接近 1 越好;缺点是对添加无关特征不敏感
调整 R^2 1 - (1-R^2)\frac{n-1}{n-p-1} 对特征数量进行惩罚的 R^2 用于特征选择,防止过拟合
平均绝对百分比误差 (MAPE) \frac{100\%}{n}\sum_{i=1}^{n}\left\|\frac{y_i - \hat{y}_i}{y_i}\right\| 相对误差的百分比平均值 无量纲,便于比较不同量纲的数据;但真实值接近 0 时会爆炸,且对负值不友好
对称平均绝对百分比误差 (SMAPE) \frac{100\%}{n}\sum_{i=1}^{n}\frac{\|y_i - \hat{y}_i\|}{(\|y_i\| + \|\hat{y}_i\|)/2} 对称形式的百分比误差 解决了 MAPE 中分母为零的问题,但仍有对低值敏感的问题
均方对数误差 (MSLE) \frac{1}{n}\sum_{i=1}^{n}(\log(1+y_i) - \log(1+\hat{y}_i))^2 对数空间下的均方误差 关注相对误差,适用于目标值呈指数增长或需惩罚低估时
3. 指标选择注意事项
  • 异常值处理:RMSE 和 MSE 对异常值非常敏感;如果数据中存在较多离群点,优先使用 MAE 或 MedAE
  • 量纲与可比性:MAPE、SMAPE 是相对指标,无量纲,适合对比不同尺度的预测任务;但需注意真实值不能为零或接近零。
  • 解释性:R^2 给出模型解释力的直观感受,但无法反映预测误差的实际大小。
  • 业务偏好:某些场景下高估比低估代价更大(如库存预测),可考虑自定义非对称损失函数。
4. 业务场景与指标选择对照表
业务场景 核心关注点 首选指标 参考指标 说明
房价预测 预测误差与实际金额的偏差 RMSE 或 MAE R^2 RMSE 对大偏差更敏感;MAE 更直观
销量预测(零售) 避免严重低估导致缺货,可接受适度高估 MSLE(惩罚低估) MAPE MSLE 对低估的惩罚大于高估
电力负荷预测 要求误差稳定,不希望出现极端偏差 MAE MedAE、RMSE 电力系统对峰值误差容忍度低,但 MAE 稳健
风速/气象预测 相对误差更有意义 MAPE SMAPE 不同站点量纲一致时也可用 RMSE
股票价格预测 对异常波动敏感,需要捕捉大误差 RMSE MSE 大误差往往对应重要市场事件
工业过程控制(如温度) 小误差可容忍,但禁止大误差 RMSE + 最大误差 MAE 需监控最大偏差是否超安全阈值
寿命预测(设备剩余寿命) 过早更换浪费成本,过晚更换导致故障 非对称指标(如 分段损失 MAE 可根据代价函数自定义
多目标回归(同时预测多个值) 综合评估所有输出维度的表现 平均 RMSE 或 均方根误差 (RMSRE) 多输出 R^2 先计算各维度的指标,再平均
模型对比(不同量纲的数据集) 需要无量纲的指标 MAPE SMAPE、R^2 R^2 也与量纲无关,但解释不同
5. 总结与选择速查
业务需求 推荐指标
简单、直观,对异常值不敏感 MAE
需要强调大误差(惩罚离群点) RMSE 或 MSE
希望得到“模型解释了多少变异” R^2
比较不同尺度数据的预测精度 MAPE(确保真实值不为零)
数据存在极端离群点 MedAE
目标值呈指数增长(如人口、病毒传播) MSLE
需要防止过拟合(特征选择) 调整 R^2
评估推荐系统或排序中的评分预测 RMSE(Netflix 奖曾用)

最终建议

  • 优先查看残差分布图,了解误差是否存在偏斜或离群点。
  • 没有万能的指标,通常需要同时报告 RMSE 和 MAE,以及 R^2
  • 若业务对高估和低估的代价不对称,应设计自定义损失函数,而不是使用对称指标。
  • 在多模型比较时,建议使用交叉验证计算指标的平均值和标准差,以评估稳定性。
6.代码示例(回归指标)
# 从 sklearn.metrics 模块导入回归任务的评估指标:平均绝对误差、均方误差、R平方(决定系数)
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# 从 sklearn.linear_model 导入线性回归模型
from sklearn.linear_model import LinearRegression

# 从 sklearn.datasets 导入 make_regression 函数,用于生成回归数据集
from sklearn.datasets import make_regression

# 注意:以下代码中使用了 np.sqrt,需要提前导入 numpy 库(本代码片段省略了 import numpy as np,实际运行需添加)

# 生成回归数据集:200个样本,1个特征(一元线性回归),噪声标准差为10,固定随机种子确保结果可复现
# n_samples=200:样本数;n_features=1:特征个数(自变量维度);noise=10:添加的高斯噪声标准差;random_state=42:随机种子
X, y = make_regression(n_samples=200, n_features=1, noise=10, random_state=42)

# 划分训练集和测试集:测试集占20%(40个样本),训练集占80%(160个样本),随机种子固定为42
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建普通线性回归模型对象
lr = LinearRegression()

# 使用训练集训练线性回归模型,学习特征 X_train 到目标值 y_train 的线性关系
lr.fit(X_train, y_train)

# 使用训练好的模型对测试集特征进行预测,得到预测值 y_pred
y_pred = lr.predict(X_test)

# 计算均方误差(MSE),然后取平方根得到均方根误差(RMSE)
mse = mean_squared_error(y_test, y_pred)   # 计算预测值与真实值之间误差的平方的平均值
rmse = np.sqrt(mse)                        # 对 MSE 开平方,得到与原始目标值相同量纲的误差指标

# 打印平均绝对误差(MAE):预测误差绝对值的平均值,对异常值不敏感
print("MAE:", mean_absolute_error(y_test, y_pred))

# 打印均方误差(MSE):预测误差平方的平均值,对大误差惩罚更重
print("MSE:", mean_squared_error(y_test, y_pred))

# 打印均方根误差(RMSE):MSE 的平方根,量纲与 y 相同,便于解释
print("RMSE:", rmse)

# 打印决定系数 R²:表示模型解释的方差比例,取值范围 (-∞, 1],越接近 1 说明拟合效果越好
# R² = 1 - (SS_res / SS_tot),其中 SS_res 是残差平方和,SS_tot 是总平方和
print("R²:", r2_score(y_test, y_pred))

📚 学习资料(Obsidian 可直接收藏)


🎯 学习建议(2 天计划)

  1. 第 1 天:理解监督/无监督学习、特征标签、训练测试划分;掌握欠拟合/过拟合、偏差-方差概念;了解 L1/L2 正则化。
  2. 第 2 天:重点练习分类评估指标(混淆矩阵、精确率/召回率/F1、ROC/AUC)和回归指标(MAE/MSE/RMSE/R²),用 sklearn 实现。

✅ 核心要点总结

  1. 监督学习:有标签,预测目标(分类/回归);无监督学习:无标签,发现结构(聚类/降维)。
  2. 训练/测试集划分:常用 7:3 或 8:2,需保持类别分布(stratify)。
  3. 欠拟合(高偏差)→ 增加复杂度;过拟合(高方差)→ 正则化、增数据。
  4. L1 正则化产生稀疏解(特征选择);L2 正则化参数平滑,常用 Ridge。
  5. 分类指标:准确率(平衡数据)、精确率/召回率/F1(不平衡数据)、ROC/AUC(排序能力)。
  6. 回归指标:MAE(鲁棒)、MSE/RMSE(对大误差敏感)、R²(拟合优度)。

练习题(自测)

  1. 使用 make_classification 生成不平衡数据集(例如正负比 1:9),比较准确率和 F1-score 哪个更能反映模型性能。
  2. 在回归任务中,故意添加异常值,观察 MAE 和 MSE 的变化差异。
  3. 手动实现混淆矩阵,并计算精确率和召回率(不使用 sklearn)。
  4. 调整 Ridge 和 Lasso 的 alpha 参数,观察模型系数稀疏性的变化。
  5. 对同一数据集使用过拟合模型(如高次多项式回归)和正则化模型,比较测试集误差。

建议使用 Jupyter Notebook 或 VS Code 运行代码,修改参数观察效果。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐