Machine Learning Mastery 应用机器学习教程(三):模型评估与优化实践

Machine Learning Mastery 应用机器学习教程(三):模型评估与优化实践

在机器学习项目开发中,模型评估与优化是决定模型最终性能的核心环节。本教程将围绕模型评估指标、交叉验证策略、超参数调优方法三大核心模块展开,结合代码示例与实战经验,帮助开发者构建科学、高效的模型优化体系。

一、模型评估指标:从分类到回归的量化标准

1.1 分类任务评估指标

分类模型的评估需兼顾准确性、鲁棒性与业务需求。常用指标包括:

  • 准确率(Accuracy):适用于类别均衡场景,但易受数据倾斜影响。例如,在垃圾邮件检测中,若90%为正常邮件,模型仅需全部预测为正常即可达到90%准确率,但实际价值有限。
  • 精确率(Precision)与召回率(Recall):精确率关注预测为正的样本中实际为正的比例(TP/(TP+FP)),召回率关注实际为正的样本中被正确预测的比例(TP/(TP+FN))。二者常通过F1-score(2(PrecisionRecall)/(Precision+Recall))综合考量。
  • ROC-AUC:通过绘制真正例率(TPR)与假正例率(FPR)曲线计算曲线下面积,反映模型在不同阈值下的分类能力,尤其适用于类别不平衡场景。

代码示例:计算分类指标

  1. from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
  2. y_true = [0, 1, 1, 0, 1]
  3. y_pred = [0, 1, 0, 0, 1]
  4. y_proba = [0.1, 0.9, 0.4, 0.3, 0.8] # 预测为正类的概率
  5. print("Accuracy:", accuracy_score(y_true, y_pred))
  6. print("Precision:", precision_score(y_true, y_pred))
  7. print("Recall:", recall_score(y_true, y_pred))
  8. print("F1-Score:", f1_score(y_true, y_pred))
  9. print("ROC-AUC:", roc_auc_score(y_true, y_proba))

1.2 回归任务评估指标

回归模型需量化预测值与真实值的偏差,常用指标包括:

  • 均方误差(MSE):对异常值敏感,适用于误差平方敏感的场景(如金融预测)。
  • 平均绝对误差(MAE):鲁棒性更强,直接反映预测误差的平均大小。
  • R²分数:衡量模型解释方差的比例,范围为(-∞,1],越接近1表示模型拟合效果越好。

代码示例:计算回归指标

  1. from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
  2. y_true = [3, -0.5, 2, 7]
  3. y_pred = [2.5, 0.0, 2, 8]
  4. print("MSE:", mean_squared_error(y_true, y_pred))
  5. print("MAE:", mean_absolute_error(y_true, y_pred))
  6. print("R² Score:", r2_score(y_true, y_pred))

二、交叉验证:避免数据泄露的稳健评估

2.1 传统训练-测试集划分的局限性

简单划分训练集与测试集可能导致评估结果波动大,尤其在数据量较小时。例如,若测试集恰好包含较多异常值,模型性能可能被低估。

2.2 K折交叉验证原理与实现

K折交叉验证将数据分为K个子集,依次将每个子集作为测试集,其余作为训练集,最终取K次评估结果的平均值。该方法能有效利用数据,减少评估方差。

代码示例:K折交叉验证

  1. from sklearn.model_selection import cross_val_score
  2. from sklearn.ensemble import RandomForestClassifier
  3. from sklearn.datasets import load_iris
  4. data = load_iris()
  5. X, y = data.data, data.target
  6. model = RandomForestClassifier()
  7. # 5折交叉验证,计算准确率
  8. scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
  9. print("Cross-Validation Scores:", scores)
  10. print("Mean Accuracy:", scores.mean())

2.3 分层K折交叉验证

对于类别不平衡数据,分层K折交叉验证可确保每折中各类别比例与原始数据一致,避免评估偏差。

代码示例:分层K折交叉验证

  1. from sklearn.model_selection import StratifiedKFold
  2. skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
  3. for train_index, test_index in skf.split(X, y):
  4. X_train, X_test = X[train_index], X[test_index]
  5. y_train, y_test = y[train_index], y[test_index]
  6. # 在此训练并评估模型

三、超参数调优:从网格搜索到贝叶斯优化

3.1 网格搜索(Grid Search)

网格搜索通过遍历所有预设超参数组合,选择验证集上性能最优的组合。适用于超参数空间较小或计算资源充足的场景。

代码示例:网格搜索

  1. from sklearn.model_selection import GridSearchCV
  2. param_grid = {
  3. 'n_estimators': [50, 100, 200],
  4. 'max_depth': [None, 10, 20],
  5. 'min_samples_split': [2, 5]
  6. }
  7. grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy')
  8. grid_search.fit(X, y)
  9. print("Best Parameters:", grid_search.best_params_)
  10. print("Best Score:", grid_search.best_score_)

3.2 随机搜索(Randomized Search)

随机搜索从超参数分布中随机采样组合,适用于超参数空间较大或计算资源有限的场景。研究表明,随机搜索在相同计算量下常能获得与网格搜索相当甚至更优的结果。

代码示例:随机搜索

  1. from sklearn.model_selection import RandomizedSearchCV
  2. from scipy.stats import randint
  3. param_dist = {
  4. 'n_estimators': randint(50, 200),
  5. 'max_depth': [None] + list(range(10, 30)),
  6. 'min_samples_split': randint(2, 10)
  7. }
  8. random_search = RandomizedSearchCV(model, param_dist, n_iter=20, cv=5, scoring='accuracy')
  9. random_search.fit(X, y)
  10. print("Best Parameters:", random_search.best_params_)

3.3 贝叶斯优化(Bayesian Optimization)

贝叶斯优化通过构建超参数与性能的代理模型(如高斯过程),选择最可能提升性能的组合进行评估。适用于评估成本高、超参数空间复杂的场景。

代码示例:使用Optuna进行贝叶斯优化

  1. import optuna
  2. def objective(trial):
  3. params = {
  4. 'n_estimators': trial.suggest_int('n_estimators', 50, 200),
  5. 'max_depth': trial.suggest_int('max_depth', 5, 30),
  6. 'min_samples_split': trial.suggest_int('min_samples_split', 2, 10)
  7. }
  8. model.set_params(**params)
  9. scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
  10. return scores.mean()
  11. study = optuna.create_study(direction='maximize')
  12. study.optimize(objective, n_trials=20)
  13. print("Best Parameters:", study.best_params)

四、实战建议:构建高效优化流程

  1. 优先使用交叉验证:避免因数据划分导致的评估偏差,尤其在小数据集上。
  2. 分层抽样处理不平衡数据:确保每折中类别比例一致,提升评估可靠性。
  3. 从随机搜索开始:在超参数空间较大时,随机搜索能快速定位高潜力区域。
  4. 结合领域知识调整搜索空间:例如,树模型中max_depth通常不超过特征数的对数。
  5. 监控优化过程:记录每次评估的性能与超参数,便于分析模型行为。

通过系统掌握模型评估指标、交叉验证策略与超参数调优方法,开发者能够构建更稳健、高效的机器学习模型,为业务决策提供可靠支持。