模型评估
理论基础:
- 欠拟合 (Underfitting):模型过于简单,无法捕捉数据真实规律(类比:学生没理解核心概念)。
- 特征:训练误差和测试误差都高;模型复杂度不足;特征工程不充分。
- 过拟合 (Overfitting):模型过于复杂,记住了训练数据的噪声和细节(类比:学生死记硬背,不会举一反三)。
- 欠拟合 (Underfitting):模型过于简单,无法捕捉数据真实规律(类比:学生没理解核心概念)。
数据处理:数据集划分
核心原则:测试集必须完全独立,只能在最终评估时使用一次。
- 训练集 (70%):用于训练模型参数,学习数据规律。
- 验证集 (15%):用于调整超参数和模型选择,优化模型结构。
- 测试集 (15%):用于最终评估模型性能,模拟真实应用场景【可选】。
fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split iris=load_iris()x=iris.data y=iris.target# 测试集(70%) + 临时集(30%)x_train,x_temp,y_train,y_temp=train_test_split(x,y,test_size=0.3,random_state=42)# 临时集(30%) = 验证集(15%) + 测试集(15%)x_val,x_test,y_val,y_test=train_test_split(x_temp,y_temp,test_size=0.5,random_state=42)交叉验证:可靠的评估方法
交叉验证主要用于模型评估、模型选择、超参数调优 和 生成OOF预测。
目前而言,经常用于
超参数调优(适用于任何场景)- 基本流程:
- 数据分割:将数据分为K个等份
- 循环训练:每次用K-1份进行训练
- 轮流验证:每次用1份验证
- 结果汇总:计算K次的平均值
- 优势:充分利用有限数据、减少随机划分带来的偏差、获得更稳定的性能估计,适合小样本数据集。
- K值选择:
K=5:常用默认值,平衡效率与准确性。K=10:更精确,但计算成本较高。K=N (LOOCV):留一交叉验证,适合极小数据集。
fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split,cross_val_scorefromsklearn.ensembleimportRandomForestClassifier 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.2,random_state=42)# 模型model=RandomForestClassifier(n_estimators=100,n_jobs=-1,random_state=42)# 执行K折交叉验证(在训练集上做!)# cv=5 表示5折交叉验证# scoring='accuracy' 表示评估指标为准确率cv_scores=cross_val_score(model,x_train,y_train,cv=5,scoring='accuracy')# 输出交叉验证结果print(f"各折准确率:{cv_scores}")# 打印每一折的得分print(f"平均准确率:{cv_scores.mean():.4f}")# 计算平均值print(f"标准差:{cv_scores.std():.4f}")# 计算标准差(越小说明模型越稳定)--------------------------------------------------------------------------------各折准确率:[0.958333330.958333330.833333331.0.95833333]平均准确率:0.9417标准差:0.0565最终测试集准确率:1.0000--------------------------------------------------------------------------------- 基本流程:
分类模型的评估指标
预测值:正类 (1) 预测值:负类 (0) 真实值:正类 (1) 真正例 (TP) 假负例 (FN) 真实值:负类 (0) 假正例 (FP) 真负例 (TN) 四大核心评估指标:
指标名称 定义 计算公式 适用场景与特点 准确率 (Accuracy) 正确预测的样本占总样本的比例。 (TP + TN) / (TP + TN + FP + FN)适用于类别平衡的数据集。 查准率 / 精确率 (Precision) 预测为正类的样本中,真正为正类的比例。 TP / (TP + FP)关注误报率。适合对“假正例”容忍度低、代价敏感的场景(如垃圾邮件拦截)。 查全率 / 召回率 (Recall) 真正为正类的样本中,被正确预测的比例。 TP / (TP + FN)关注漏报率。适合需要高覆盖的场景(如地震预测、癌症筛查)。 F1分数 (F1-Score) 精确率和召回率的调和平均数,综合指标。 2 * (Precision * Recall) / (Precision + Recall)平衡精确率和召回率的综合指标,尤其适合类别不平衡场景。 fromsklearn.metricsimportaccuracy_score,precision_score,recall_score,f1_score# 计算各种分类指标accuracy=accuracy_score(y_true,y_pred)# 准确率 Accuracyprecision=precision_score(y_true,y_pred,average='weighted')# 查准率 Precisionrecall=recall_score(y_true,y_pred,average='weighted')# 查全率 Recallf1=f1_score(y_true,y_pred,average='weighted')# F1分数 F1-Score# 输出结果print(f"准确率(Accuracy):{accuracy:.4f}")print(f"查准率 / 精确率(Precision):{precision:.4f}")print(f"查全率 / 召回率(Recall):{recall:.4f}")print(f"F1分数(F1-Score):{f1:.4f}")基础工具:混淆矩阵(可视化分类结果)
- 使用
confusion_matrix(y_true, y_pred)计算混淆矩阵。 - 使用
classification_report(y_true, y_pred)生成包含精确率、召回率、F1分数及样本量的详细报告。
fromsklearn.metricsimportconfusion_matrix,classification_report# 假设 y_true 为真实标签,y_pred 为模型预测标签# 1、计算混淆矩阵cm=confusion_matrix(y_true,y_pred)print("混淆矩阵:")print(cm)# 2、生成详细报告report=classification_report(y_true,y_pred,target_names=['负类','正类']# 指定类别名称,使报告更直观)print("\n分类报告:")print(report)- 使用
回归模型的评估指标
三大核心评估指标
指标名称 定义 计算公式 特点与适用场景 均方误差 (MSE) 预测值与真实值差值的平方的平均值。 MSE = Σ(y - ŷ)² / n对异常值敏感,数值较大。当需要惩罚大误差时使用。 均方根误差 (RMSE) 均方误差的平方根(预测值与真实值差值的平方的平均值的平方根)。 RMSE = √[Σ(y - ŷ)² / n]或√MSE与原始数据单位相同,更易解释。对异常值敏感(因放大了大误差)。当需要惩罚大误差时使用。 平均绝对误差 (MAE) 预测值与真实值差值的绝对值的平均值。 `MAE = Σ y - ŷ R²决定系数 模型解释的方差占总方差的比例。 R² = 1 - SSE / SST取值0到1,越接近1越好。评估模型整体拟合优度,但不能单独使用,需结合其他指标。 fromsklearn.metricsimportmean_squared_error,mean_absolute_error,r2_scoreimportnumpyasnp# 计算各种回归指标mse=mean_squared_error(y_true,y_pred)# 均方误差MSErmse=np.sqrt(mse)# 均方根误差RMSEmae=mean_absolute_error(y_true,y_pred)# 平均绝对误差MAEr2=r2_score(y_true,y_pred)# 决定系数R²# 输出结果print(f"均方误差(MSE):{mse:.4f}")print(f"均方根误差(RMSE):{rmse:.4f}")print(f"平均绝对误差(MAE):{mae:.4f}")print(f"R²分数:{r2:.4f}")可视化评估
- 预测值 vs 实际值散点图:
- 理想情况下,点应该落在
y=x线上,偏离程度反映预测误差。
- 理想情况下,点应该落在
- 残差图(Residual Plot):
- 残差(真实值 - 预测值)应该随机分布在零附近。如果有明显的模式(如喇叭形、曲线形),则说明模型存在系统性偏差。
- 残差分布直方图:
- 检查残差是否符合正态分布,以判断模型假设是否成立。
- 预测值 vs 实际值散点图:
常见问题与解决方案
常见问题 核心表现(症状) 避坑指南(对策) 数据泄露 预处理或特征工程时使用了测试集信息,导致评估结果虚高。 严格分离数据,正确使用 fit_transform(训练集)和transform(测试集)。过度依赖单一指标 只看准确率(Accuracy),忽视了模型在其他维度的表现。 使用多个互补指标(精确率、召回率、F1等),结合具体业务需求判断。 测试集多次使用 反复在测试集上调参、选特征,导致测试集变成了“验证集”。 测试集仅用于最终评估,调参和模型选择必须使用交叉验证。 忽视样本不平衡 在类别极度不平衡的数据上仅看准确率(如99%正常邮件,全猜正常也99%)。 使用F1分数、AUC-ROC等指标;
采用重采样(SMOTE)或调整类别权重。过拟合 (Overfitting) 训练误差极低,测试误差高。模型过于复杂,记住了噪声。 增加数据量、正则化、降低模型复杂度。 欠拟合 (Underfitting) 训练误差和测试误差都很高。模型过于简单,没学到规律。 增加模型复杂度、补充特征工程。 K值选择不当 K值过小(方差大),K值过大(计算成本高,留一法LOOCV成本极高)。 在计算成本和评估准确性间权衡,K=5 或 K=10是最常用选择。