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)曲线计算曲线下面积,反映模型在不同阈值下的分类能力,尤其适用于类别不平衡场景。
代码示例:计算分类指标
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_scorey_true = [0, 1, 1, 0, 1]y_pred = [0, 1, 0, 0, 1]y_proba = [0.1, 0.9, 0.4, 0.3, 0.8] # 预测为正类的概率print("Accuracy:", accuracy_score(y_true, y_pred))print("Precision:", precision_score(y_true, y_pred))print("Recall:", recall_score(y_true, y_pred))print("F1-Score:", f1_score(y_true, y_pred))print("ROC-AUC:", roc_auc_score(y_true, y_proba))
1.2 回归任务评估指标
回归模型需量化预测值与真实值的偏差,常用指标包括:
- 均方误差(MSE):对异常值敏感,适用于误差平方敏感的场景(如金融预测)。
- 平均绝对误差(MAE):鲁棒性更强,直接反映预测误差的平均大小。
- R²分数:衡量模型解释方差的比例,范围为(-∞,1],越接近1表示模型拟合效果越好。
代码示例:计算回归指标
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_scorey_true = [3, -0.5, 2, 7]y_pred = [2.5, 0.0, 2, 8]print("MSE:", mean_squared_error(y_true, y_pred))print("MAE:", mean_absolute_error(y_true, y_pred))print("R² Score:", r2_score(y_true, y_pred))
二、交叉验证:避免数据泄露的稳健评估
2.1 传统训练-测试集划分的局限性
简单划分训练集与测试集可能导致评估结果波动大,尤其在数据量较小时。例如,若测试集恰好包含较多异常值,模型性能可能被低估。
2.2 K折交叉验证原理与实现
K折交叉验证将数据分为K个子集,依次将每个子集作为测试集,其余作为训练集,最终取K次评估结果的平均值。该方法能有效利用数据,减少评估方差。
代码示例:K折交叉验证
from sklearn.model_selection import cross_val_scorefrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_irisdata = load_iris()X, y = data.data, data.targetmodel = RandomForestClassifier()# 5折交叉验证,计算准确率scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')print("Cross-Validation Scores:", scores)print("Mean Accuracy:", scores.mean())
2.3 分层K折交叉验证
对于类别不平衡数据,分层K折交叉验证可确保每折中各类别比例与原始数据一致,避免评估偏差。
代码示例:分层K折交叉验证
from sklearn.model_selection import StratifiedKFoldskf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)for train_index, test_index in skf.split(X, y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]# 在此训练并评估模型
三、超参数调优:从网格搜索到贝叶斯优化
3.1 网格搜索(Grid Search)
网格搜索通过遍历所有预设超参数组合,选择验证集上性能最优的组合。适用于超参数空间较小或计算资源充足的场景。
代码示例:网格搜索
from sklearn.model_selection import GridSearchCVparam_grid = {'n_estimators': [50, 100, 200],'max_depth': [None, 10, 20],'min_samples_split': [2, 5]}grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy')grid_search.fit(X, y)print("Best Parameters:", grid_search.best_params_)print("Best Score:", grid_search.best_score_)
3.2 随机搜索(Randomized Search)
随机搜索从超参数分布中随机采样组合,适用于超参数空间较大或计算资源有限的场景。研究表明,随机搜索在相同计算量下常能获得与网格搜索相当甚至更优的结果。
代码示例:随机搜索
from sklearn.model_selection import RandomizedSearchCVfrom scipy.stats import randintparam_dist = {'n_estimators': randint(50, 200),'max_depth': [None] + list(range(10, 30)),'min_samples_split': randint(2, 10)}random_search = RandomizedSearchCV(model, param_dist, n_iter=20, cv=5, scoring='accuracy')random_search.fit(X, y)print("Best Parameters:", random_search.best_params_)
3.3 贝叶斯优化(Bayesian Optimization)
贝叶斯优化通过构建超参数与性能的代理模型(如高斯过程),选择最可能提升性能的组合进行评估。适用于评估成本高、超参数空间复杂的场景。
代码示例:使用Optuna进行贝叶斯优化
import optunadef objective(trial):params = {'n_estimators': trial.suggest_int('n_estimators', 50, 200),'max_depth': trial.suggest_int('max_depth', 5, 30),'min_samples_split': trial.suggest_int('min_samples_split', 2, 10)}model.set_params(**params)scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')return scores.mean()study = optuna.create_study(direction='maximize')study.optimize(objective, n_trials=20)print("Best Parameters:", study.best_params)
四、实战建议:构建高效优化流程
- 优先使用交叉验证:避免因数据划分导致的评估偏差,尤其在小数据集上。
- 分层抽样处理不平衡数据:确保每折中类别比例一致,提升评估可靠性。
- 从随机搜索开始:在超参数空间较大时,随机搜索能快速定位高潜力区域。
- 结合领域知识调整搜索空间:例如,树模型中
max_depth通常不超过特征数的对数。 - 监控优化过程:记录每次评估的性能与超参数,便于分析模型行为。
通过系统掌握模型评估指标、交叉验证策略与超参数调优方法,开发者能够构建更稳健、高效的机器学习模型,为业务决策提供可靠支持。