机器学习笔记(二)模型评估与特征工程实操

机器学习笔记(二)模型评估与特征工程实操
一、为什么需要模型评估训练出来的模型准确率高不代表它就是一个好模型。一个常见陷阱是过拟合模型在训练集上表现完美但面对新数据时一塌糊涂。模型评估的核心目标是回答一个问题——这个模型能不能在未知数据上稳定可靠地工作。1.1 过拟合 vs 欠拟合现象表现原因解决方案过拟合训练集准、测试集差模型太复杂增加数据、正则化、降低复杂度欠拟合训练集和测试集都差模型太简单增加特征、换更复杂模型1.2 评估指标体系不同任务需要不同的评估指标准确率不是万能的指标公式适用场景准确率正确数 / 总数类别均衡精确率TP / (TP FP)关注误报代价垃圾邮件召回率TP / (TP FN)关注漏报代价疾病检测F1值精确率与召回率的调和平均精确率与召回率需兼顾TP 真正例FP 假正例FN 假负例TN 真负例二、交叉验证实操2.1 为什么简单划分不够单次 train_test_split 的结果受随机种子影响可能偏乐观或偏悲观。K 折交叉验证将数据分成 K 份轮流用其中 1 份做测试、其余做训练最终取平均结果更可靠。2.2 代码实操K 折交叉验证fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimportcross_val_score,StratifiedKFoldfromsklearn.ensembleimportRandomForestClassifierfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelineimportnumpyasnp# 加载数据dataload_breast_cancer()X,ydata.data,data.target# 用 Pipeline 封装标准化 模型避免数据泄露pipelinePipeline([(scaler,StandardScaler()),(rf,RandomForestClassifier(n_estimators100,random_state42))])# 5 折分层交叉验证cvStratifiedKFold(n_splits5,shuffleTrue,random_state42)scorescross_val_score(pipeline,X,y,cvcv,scoringf1)print(f各折 F1 值:{scores})print(f平均 F1 值:{scores.mean():.4f}/-{scores.std():.4f})输出结果各折 F1 值: [0.9722 0.9722 0.9861 0.9653 0.9861] 平均 F1 值: 0.9764 /- 0.00802.3 学习曲线分析学习曲线展示训练集大小与模型表现的关系是诊断过拟合/欠拟合的利器fromsklearn.model_selectionimportlearning_curveimportmatplotlib.pyplotasplt train_sizes,train_scores,val_scoreslearning_curve(pipeline,X,y,cv5,train_sizesnp.linspace(0.1,1.0,10),scoringf1,n_jobs-1)train_meantrain_scores.mean(axis1)val_meanval_scores.mean(axis1)plt.figure(figsize(10,6))plt.plot(train_sizes,train_mean,o-,color#FF6B6B,labelTraining F1)plt.plot(train_sizes,val_mean,o-,color#4D96FF,labelValidation F1)plt.xlabel(Training Set Size,fontsize12)plt.ylabel(F1 Score,fontsize12)plt.title(Learning Curve,fontsize14)plt.legend(fontsize12)plt.grid(True,alpha0.3)plt.tight_layout()plt.savefig(learning_curve.png,dpi150,bbox_inchestight)plt.show()如何判读学习曲线训练线高、验证线低两线差距大 →过拟合两条线都低差距小 →欠拟合两条线都高且接近 →理想状态三、特征工程实操3.1 特征工程的核心地位业界有一句名言数据和特征决定了机器学习的上限模型和算法只是逼近这个上限。特征工程的质量直接决定最终效果。3.2 数值型特征处理importpandasaspdimportnumpyasnpfromsklearn.preprocessingimportStandardScaler,MinMaxScaler,RobustScaler# 模拟数据np.random.seed(42)datapd.DataFrame({age:np.random.normal(35,10,1000).clip(18,70),income:np.random.lognormal(10,1,1000),# 偏态分布score:np.random.uniform(0,100,1000)})# 方式一标准化均值为0标准差为1—— 适合大多数场景scaler_stdStandardScaler()data_stdscaler_std.fit_transform(data)# 方式二归一化缩放到0-1—— 适合距离类算法scaler_minmaxMinMaxScaler()data_minmaxscaler_minmax.fit_transform(data)# 方式三稳健缩放用中位数和四分位距—— 适合有离群值的数据scaler_robustRobustScaler()data_robustscaler_robust.fit_transform(data)3.3 特征选择fromsklearn.feature_selectionimportSelectKBest,f_classif,mutual_info_classiffromsklearn.ensembleimportRandomForestClassifier# 方式一方差分析F检验选择 Top-K 特征selector_fSelectKBest(f_classif,k10)X_selected_fselector_f.fit_transform(X,y)selected_features_fdata.feature_names[selector_f.get_support()]print(F检验选出的特征:,list(selected_features_f))# 方式二随机森林特征重要性rfRandomForestClassifier(n_estimators100,random_state42)rf.fit(X,y)importancesrf.feature_importances_ top10_idxnp.argsort(importances)[::-1][:10]print(\n随机森林 Top10 重要特征:)foriintop10_idx:print(f{data.feature_names[i]:30s}{importances[i]:.4f})# 方式三互信息法能捕捉非线性关系selector_miSelectKBest(mutual_info_classif,k10)X_selected_miselector_mi.fit_transform(X,y)selected_features_midata.feature_names[selector_mi.get_support()]print(\n互信息选出的特征:,list(selected_features_mi))3.4 特征选择策略对比方法原理优势局限方差分析 F 检验线性相关性计算快只能发现线性关系互信息法信息论统计量能发现非线性关系计算量较大随机森林重要性分裂增益统计准确、通用需训练完整模型递归特征消除 RFE逐步剔除效果好计算开销最大四、综合实战完整 Pipeline 流程将上述知识整合为一个完整的机器学习 Pipeline这也是实际项目中的标准做法fromsklearn.pipelineimportPipelinefromsklearn.model_selectionimportcross_val_score,GridSearchCVfromsklearn.preprocessingimportStandardScalerfromsklearn.feature_selectionimportSelectKBest,f_classiffromsklearn.ensembleimportRandomForestClassifierfromsklearn.datasetsimportload_breast_cancerimportnumpyasnp# 加载数据dataload_breast_cancer()X,ydata.data,data.target# 构建 Pipeline标准化 - 特征选择 - 随机森林pipelinePipeline([(scaler,StandardScaler()),(feature_selection,SelectKBest(f_classif)),(classifier,RandomForestClassifier(random_state42))])# 网格搜索调参param_grid{feature_selection__k:[10,15,20,all],classifier__n_estimators:[50,100,200],classifier__max_depth:[4,6,8,None]}gridGridSearchCV(pipeline,param_grid,cv5,scoringf1,n_jobs-1)grid.fit(X,y)print(f最佳参数:{grid.best_params_})print(f最佳 F1 值:{grid.best_score_:.4f})# 查看参数组合的详细结果resultspd.DataFrame(grid.cv_results_)for_,rowinresults.nsmallest(5,rank_test_score).iterrows():print(fF1{row[mean_test_score]:.4f}| fk{row[params][feature_selection__k]}, fn_est{row[params][classifier__n_estimators]}, fdepth{row[params][classifier__max_depth]})五、小结模型评估不是可选项交叉验证是衡量模型泛化能力的标准方法学习曲线是诊断过拟合/欠拟合的第一工具比单纯看准确率更有价值特征工程决定模型上限三种缩放方式各有所长按数据特征选择Pipeline将预处理、特征选择、模型训练封装为整体既防止数据泄露又方便调参网格搜索 交叉验证是调参的黄金组合实际项目中几乎必用