当前位置: 首页 > article >正文

【大数据】机器学习-----模型的评估方法

一、评估方法

  • 留出法(Holdout Method)
    • 将数据集划分为训练集和测试集两部分,通常按照一定比例(如 70% 训练集,30% 测试集)。训练集用于训练模型,测试集用于评估模型性能。
    • 优点:简单易行。
    • 缺点:结果依赖于数据集的划分方式,不同的划分可能导致不同的评估结果。
  • 交叉验证法(Cross Validation)
    • 最常见的是 k 折交叉验证。将数据集分成 k 个大小相似的互斥子集,每次用 k-1 个子集作为训练集,余下的一个作为测试集,进行 k 次训练和测试,最终将 k 次的结果取平均值。
    • 优点:能更充分利用数据,结果相对稳定,能降低因数据划分导致的偏差。
    • 缺点:计算开销较大,尤其是对于大数据集和复杂模型。
    • 例如,5 折交叉验证就是将数据集分成 5 份,每次取 4 份训练,1 份测试,重复 5 次。
  • 自助法(Bootstrap Method)
    • 从原始数据集中有放回地抽样产生多个新的训练集,每次抽样得到的样本作为一个训练集,未被抽到的样本作为测试集。
    • 优点:在数据集较小、难以有效划分训练集和测试集时很有用。
    • 缺点:改变了初始数据集的分布,会引入一定的偏差。

二、性能度量

  • 分类问题的性能度量
    • 准确率(Accuracy):预测正确的样本数占总样本数的比例,公式为 Accuracy = (TP + TN) / (TP + TN + FP + FN),其中 TP 是真正例,TN 是真反例,FP 是假正例,FN 是假反例。
    • 精确率(Precision):预测为正例的样本中真正例的比例,公式为 Precision = TP / (TP + FP)
    • 召回率(Recall):真正例中被预测为正例的比例,公式为 Recall = TP / (TP + FN)
    • F1 分数:精确率和召回率的调和平均值,公式为 F1 = 2 * (Precision * Recall) / (Precision + Recall)
    • ROC 曲线和 AUC 值
      • ROC 曲线以假正例率(FPR)为横坐标,真正例率(TPR)为纵坐标绘制,通过调整分类阈值得到不同的点连成曲线。
      • AUC 值是 ROC 曲线下的面积,范围在 0 到 1 之间,值越大表示模型性能越好。
  • 回归问题的性能度量
    • 均方误差(MSE):预测值与真实值差的平方的平均值,公式为 MSE = (1/n) * Σ(y - y_pred)^2,其中 y 是真实值,y_pred 是预测值。
    • 平均绝对误差(MAE):预测值与真实值差的绝对值的平均值,公式为 MAE = (1/n) * Σ|y - y_pred|
    • 均方根误差(RMSE):MSE 的平方根,对较大误差更敏感,公式为 RMSE = sqrt(MSE)

三、比较检验

  • 假设检验
    • 用于比较不同模型性能差异是否显著。
    • 例如,使用 t 检验或 McNemar 检验。
    • t 检验通常用于比较两个模型在同一数据集上的性能是否有显著差异,基于样本均值和标准差。
    • McNemar 检验用于比较两种分类算法在同一测试集上的差异,主要关注两种算法的分类结果不一致的部分。
  • 交叉验证 t 检验
    • 结合了交叉验证和 t 检验,用于比较多个模型的性能。
    • 对于两个模型,分别进行多次交叉验证,得到多个性能度量,然后对这些度量进行 t 检验,以判断它们是否有显著差异。

四、偏差与方差

  • 偏差(Bias)
    • 反映了模型预测值与真实值的期望之间的差异,描述了模型的准确性。
    • 高偏差意味着模型过于简单,可能导致欠拟合,不能很好地拟合训练数据,也不能很好地泛化到新数据。
  • 方差(Variance)
    • 反映了模型在不同训练集上的预测值的变化程度,描述了模型的稳定性。
    • 高方差意味着模型对训练数据的微小变化非常敏感,可能导致过拟合,在训练集上表现好,但在新数据上表现差。
  • 偏差-方差权衡
    • 模型的泛化误差可以分解为偏差、方差和噪声。通常,简单模型偏差大、方差小,复杂模型偏差小、方差大,需要找到一个平衡,使泛化误差最小。

在这里插入图片描述

公式

一、分类问题的性能度量公式

  • 准确率(Accuracy)

    • 公式: Accuracy = T P + T N T P + T N + F P + F N \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} Accuracy=TP+TN+FP+FNTP+TN
    • 解释:
      • T P TP TP(True Positive):真正例,即实际为正类且被预测为正类的样本数量。
      • T N TN TN(True Negative):真反例,即实际为反类且被预测为反类的样本数量。
      • F P FP FP(False Positive):假正例,即实际为反类但被预测为正类的样本数量。
      • F N FN FN(False Negative):假反例,即实际为正类但被预测为反类的样本数量。
      • 该公式计算的是预测正确的样本数(包括正确预测为正类和正确预测为反类)在总样本数中的占比,反映了模型预测的整体准确性。
  • 精确率(Precision)

    • 公式: Precision = T P T P + F P \text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP
    • 解释:
      • 它衡量的是在所有被预测为正类的样本中,真正为正类的样本所占的比例。精确率高表示在预测为正类的样本中,误判为正类的情况较少,侧重于预测结果为正类的准确性。
  • 召回率(Recall)

    • 公式: Recall = T P T P + F N \text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP
    • 解释:
      • 召回率表示在所有实际为正类的样本中,被正确预测为正类的样本所占的比例。召回率高表示实际正类被模型成功找出的比例高,侧重于对正类的查全能力,避免遗漏正类样本。
  • F1 分数(F1 Score)

    • 公式: F1 = 2 × Precision × Recall Precision + Recall \text{F1} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1=2×Precision+RecallPrecision×Recall
    • 解释:
      • F1 分数是精确率和召回率的调和平均值,是一个综合考虑精确率和召回率的指标,用于平衡精确率和召回率之间的关系。当精确率和召回率都很高时,F1 分数会比较高,避免了单独考虑精确率或召回率的片面性。
  • ROC 曲线和 AUC 值

    • ROC 曲线(Receiver Operating Characteristic Curve)
      • 绘制方式:通过调整分类器的阈值,得到一系列的真阳性率( T P R TPR TPR)和假阳性率( F P R FPR FPR),以 F P R FPR FPR 为横坐标, T P R TPR TPR 为纵坐标绘制曲线。
      • T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP,表示在所有实际正类中被正确预测为正类的比例。
      • F P R = F P T N + F P FPR = \frac{FP}{TN + FP} FPR=TN+FPFP,表示在所有实际反类中被错误预测为正类的比例。
    • AUC 值(Area Under the Curve)
      • 解释:是 ROC 曲线下的面积,范围在 0 到 1 之间。
      • AUC 值越大,说明分类器在不同阈值下的性能越好,能够更好地区分正类和反类,当 AUC = 1 时表示完美分类器,AUC = 0.5 表示随机分类器。

二、回归问题的性能度量公式

  • 均方误差(MSE - Mean Squared Error)

    • 公式: MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2
    • 解释:
      • y i y_i yi 是第 i i i 个样本的真实值, y ^ i \hat{y}_i y^i 是第 i i i 个样本的预测值, n n n 是样本数量。
      • MSE 计算的是预测值与真实值差的平方的平均值,对较大误差的惩罚较大,因为误差是平方项,会放大较大误差的影响,常用于评估回归模型的性能。
  • 平均绝对误差(MAE - Mean Absolute Error)

    • 公式: MAE = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ \text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| MAE=n1i=1nyiy^i
    • 解释:
      • 计算预测值与真实值差的绝对值的平均值,对所有误差同等对待,不像 MSE 那样对大误差进行平方放大,更直观地反映了预测误差的平均大小。
  • 均方根误差(RMSE - Root Mean Squared Error)

    • 公式: RMSE = MSE \text{RMSE} = \sqrt{\text{MSE}} RMSE=MSE
    • 解释:
      • 是 MSE 的平方根,它与预测值和真实值具有相同的量纲,使得结果更具解释性,例如在预测房价时,RMSE 的单位与房价的单位相同。

三、假设检验公式(以 t 检验为例)

  • t 检验
    • 公式: t = X 1 ˉ − X 2 ˉ s p 1 n 1 + 1 n 2 t = \frac{\bar{X_1} - \bar{X_2}}{s_p \sqrt{\frac{1}{n_1} + \frac{1}{n_2}}} t=spn11+n21 X1ˉX2ˉ
    • 解释:
      • X 1 ˉ \bar{X_1} X1ˉ X 2 ˉ \bar{X_2} X2ˉ 是两个样本的均值, n 1 n_1 n1 n 2 n_2 n2 是两个样本的大小。
      • s p s_p sp 是合并标准差,公式为 s p = ( n 1 − 1 ) s 1 2 + ( n 2 − 1 ) s 2 2 n 1 + n 2 − 2 s_p = \sqrt{\frac{(n_1 - 1)s_1^2 + (n_2 - 1)s_2^2}{n_1 + n_2 - 2}} sp=n1+n22(n11)s12+(n21)s22 ,其中 s 1 2 s_1^2 s12 s 2 2 s_2^2 s22 是两个样本的方差。
      • t 检验用于检验两个样本的均值是否有显著差异,根据计算得到的 t 值和自由度,查 t 分布表可得到对应的 p 值,若 p 值小于显著性水平(如 0.05),则认为两个样本的均值有显著差异。

四、偏差与方差公式(在平方损失下)

  • 偏差(Bias)

    • 对于一个模型 f ( x ) f(x) f(x),假设真实的数据生成函数是 y = g ( x ) + ϵ y = g(x) + \epsilon y=g(x)+ϵ,偏差的期望定义为: Bias ( f ^ ( x ) ) = E [ f ^ ( x ) ] − g ( x ) \text{Bias}(\hat{f}(x)) = E[\hat{f}(x)] - g(x) Bias(f^(x))=E[f^(x)]g(x)
    • 解释:
      • 偏差反映了模型预测的期望与真实值的差距,衡量了模型对数据的拟合能力,高偏差可能导致欠拟合,即模型过于简单,无法很好地拟合训练数据和潜在的数据模式。
  • 方差(Variance)

    • 对于一个模型 f ( x ) f(x) f(x),方差定义为: Variance ( f ^ ( x ) ) = E [ ( f ^ ( x ) − E [ f ^ ( x ) ] ) 2 ] \text{Variance}(\hat{f}(x)) = E[(\hat{f}(x) - E[\hat{f}(x)])^2] Variance(f^(x))=E[(f^(x)E[f^(x)])2]
    • 解释:
      • 方差反映了模型在不同训练集上预测结果的波动情况,高方差可能导致过拟合,即模型对训练数据过于敏感,在不同训练集上会产生较大的预测差异。

这些公式在评估机器学习模型的性能、比较不同模型以及分析模型的拟合能力等方面都起着至关重要的作用,你可以根据具体的问题和数据类型选择合适的评估指标和检验方法,使用相应的公式进行计算和分析。

Python 的 numpy 库来进行向量和矩阵的操作,以方便计算上述公式中的求和、平方、绝对值等操作。,计算 MSE 的
Python 代码如下:

import numpy as np


def mse(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)


# 示例使用
y_true = np.array([1, 2, 3, 4, 5])
y_pred = np.array([1.2, 2.1, 2.8, 4.2, 5.1])
print(mse(y_true, y_pred))

代码解释:

  • 导入 numpy 库,使用 numpyarray 存储真实值和预测值。
  • 定义 mse 函数,使用 numpymean 函数计算差值的平方的平均值。
  • 最后给出一个示例调用函数,计算并输出 MSE 值。

五、代码示例(Python 实现)

from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression


# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target


# 留出法示例
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
model = LogisticRegression()
model.fit(X_train, y_train)
accuracy = model.score(X_test, y_test)
print(f"Holdout Method Accuracy: {accuracy}")


# 交叉验证示例
model = LogisticRegression()
cv_scores = cross_val_score(model, X, y, cv=5)
print(f"Cross Validation Scores: {cv_scores}")
print(f"Cross Validation Mean Accuracy: {cv_scores.mean()}")


# 性能度量示例(使用混淆矩阵计算精确率、召回率和 F1 分数)
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score
y_pred = model.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
print(f"Confusion Matrix:\n{cm}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")


# 比较检验示例(这里简单对比两个不同参数的逻辑回归模型)
model1 = LogisticRegression(C=1.0)
model2 = LogisticRegression(C=0.1)
cv_scores1 = cross_val_score(model1, X, y, cv=5)
cv_scores2 = cross_val_score(model2, X, y, cv=5)
from scipy.stats import ttest_ind
t_stat, p_value = ttest_ind(cv_scores1, cv_scores2)
print(f"T-Test Statistic: {t_stat}, P-Value: {p_value}")


# 偏差与方差示例(这里仅为概念说明,实际需要多次实验)
def train_and_predict(X_train, y_train, X_test):
    model = LogisticRegression()
    model.fit(X_train, y_train)
    return model.predict(X_test)


# 多次实验观察结果的变化,可判断方差
results = []
for i in range(10):
    X_train, _, y_train, _ = train_test_split(X, y, test_size=0.3, random_state=i)
    y_pred = train_and_predict(X_train, y_train, X_test)
    results.append(y_pred)

代码解释:

  1. 留出法
    • 使用 train_test_splitiris 数据集中划分出训练集和测试集。
    • 创建 LogisticRegression 模型,在训练集上训练并在测试集上评估准确率。
  2. 交叉验证
    • 直接使用 cross_val_score 进行 5 折交叉验证,得到 5 次验证的准确率得分,取平均值。
  3. 性能度量
    • 使用 confusion_matrix 计算混淆矩阵,进而计算精确率、召回率和 F1 分数。
  4. 比较检验
    • 创建两个不同参数的 LogisticRegression 模型,使用 cross_val_score 得到它们的交叉验证得分。
    • 使用 ttest_ind 进行 t 检验,得到 t 统计量和 p 值,根据 p 值判断差异是否显著。
  5. 偏差与方差
    • 定义 train_and_predict 函数进行训练和预测。
    • 多次不同划分进行实验,观察结果的变化,可定性分析方差。

通过上述评估方法、性能度量、比较检验和对偏差与方差的理解,你可以更好地评估和选择机器学习模型,使模型在训练和测试中取得更好的性能,并能有效地比较不同模型的优劣。

阅读代码时,注意 sklearn 中函数的参数设置,如 train_test_splittest_size 决定了测试集比例,cross_val_scorecv
表示交叉验证的折数。。


http://www.kler.cn/a/503604.html

相关文章:

  • 《盘古大模型——鸿蒙NEXT的智慧引擎》
  • 幂次进近
  • MySQL:索引
  • 2 XDMA IP中断
  • ASP.NET Core与GraphQL集成
  • Mysql--运维篇--空间管理(表空间,索引空间,临时表空间,二进制日志,数据归档等)
  • 微服务中引入消息队列的利弊
  • nginx 简单实践:静态资源部署、URL 重写【nginx 实践系列之一】
  • 使用 configparser 读取 INI 配置文件
  • PHP Filesystem
  • conda管理Python库和虚拟环境
  • 数据挖掘实训:天气数据分析与机器学习模型构建
  • 【RAG学习】如何使用大型语言模型?提示工程、RAG、微调或预训练,什么时候需要哪个
  • 面试题:Java中并发的三大特性
  • .Net Core Record 类型
  • 《银行保险机构数据安全管理办法》正式实施,分类分级、安全评估共筑安全防线
  • MVC如何使用任务调度
  • 基于springboot航空售票及管理系统
  • Duke Humanoid:利用被动动力学实现节能双足机器人
  • PyTorch 中的 Dropout 解析
  • 1.14寒假作业
  • Logback日志技术
  • 信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高
  • 2501,VC++接口函数总结
  • Python Wi-Fi密码测试工具
  • 从根源上解决cursor免费版50次限制问题