特征选择(超通俗完整版)
机器学习核心特征选择超通俗完整版特征选择 从一堆特征里挑出最有用、不冗余、能让模型又快又准的关键特征是数据预处理必做步骤本科/研究生面试、论文、项目都高频用到。一、先搞懂什么是特征什么是特征选择1. 特征是什么用来描述一个样本的属性/变量。预测房价面积、房间数、地段、年份预测疾病年龄、血压、血糖、肿瘤大小预测用户购买性别、收入、浏览记录、消费频次2. 特征选择是什么从全部特征里筛选出对预测目标最有价值的子集。去掉没用的噪声特征去掉高度重复的冗余特征保留关键、高区分度的特征3. 为什么一定要做特征选择降维提速特征越少模型训练越快、占用资源越少提升精度去掉干扰项模型更专注真实规律防止过拟合避免模型“死记硬背”训练数据可解释性更强知道模型到底靠什么做判断二、3大类特征选择方法最核心所有特征选择都归为三类Filter、Wrapper、Embedded。 1. Filter 过滤法最快、最简单、不依赖模型核心思想先筛选特征再训练模型完全独立于模型靠统计指标打分。常用方法方差选择方差接近0 → 全样本几乎一样 → 没用直接删皮尔逊相关系数看特征与标签的线性相关程度互信息MI看特征给标签带来多少信息量非线性也能测卡方检验 / F检验分类任务常用衡量相关性优点速度极快通用、不挑模型适合高维数据粗筛缺点不考虑特征之间互相影响可能保留冗余特征 2. Wrapper 包装法最准、最贴合模型核心思想把特征选择当成“试错”用模型性能直接评价一组特征好不好。代表算法RFE 递归特征消除用全部特征训练模型删掉最不重要的特征重复训练→删除→直到保留指定数量优点考虑特征组合效果选出的特征最贴合你的模型效果通常最好缺点非常慢容易过拟合高维数据扛不住 3. Embedded 嵌入法训练时自动选兼顾速度与效果核心思想特征选择 模型训练 一起做模型自带筛选能力。常用方法L1正则Lasso自动把不重要特征的权重压为0树模型重要性决策树、随机森林、XGBoost自带特征重要度深度学习权重靠网络权重自动筛选优点速度快、效率高不易过拟合工业界最常用缺点依赖模型本身线性模型对非线性关系筛选较弱三、3大类方法一张表看懂类型代表方法是否依赖模型速度效果适用场景Filter互信息、相关系数、方差❌ 不依赖⚡ 最快⭐⭐高维粗筛、快速预处理WrapperRFE递归消除✅ 强依赖 最慢⭐⭐⭐⭐⭐特征少、追求极致精度EmbeddedLasso、树模型重要性✅ 依赖⚡⚡ 快⭐⭐⭐⭐工业项目、常规建模首选四、必须掌握的5个核心指标通俗解释1. 方差 Variance含义数据波动大不大规则方差≈0 → 全一样 → 删掉2. 皮尔逊相关系数范围[-1,1]越接近±1 → 线性相关性越强3. 互信息 Mutual Information含义特征能给标签带来多少信息量优点能捕捉非线性关系4. mRMR最小冗余最大相关既要和标签相关又要特征之间不重复5. L1正则Lasso自动把不重要特征权重变0自带“特征筛选”功能五、完整实战代码乳腺癌数据集可直接复制运行包含数据加载 → 可视化 → 3种特征选择 → 模型对比importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.feature_selectionimportSelectKBest,mutual_info_classif,RFEfromsklearn.linear_modelimportLogisticRegression,LassoCVfromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportaccuracy_score,roc_auc_score# 加载数据dataload_breast_cancer()Xpd.DataFrame(data.data,columnsdata.feature_names)ydata.target# 标准化scalerStandardScaler()X_scaledscaler.fit_transform(X)# # 1. Filter 法互信息# mi_selectorSelectKBest(score_funcmutual_info_classif,k10)X_mimi_selector.fit_transform(X_scaled,y)mi_selectedX.columns[mi_selector.get_support()]# 可视化得分mi_scoresmi_selector.scores_ mi_dfpd.DataFrame({Feature:X.columns,Score:mi_scores})mi_dfmi_df.sort_values(Score,ascendingFalse).head(15)plt.figure(figsize(10,5))sns.barplot(xScore,yFeature,datami_df)plt.title(Top 15 互信息得分)plt.show()# # 2. Wrapper 法RFE# modelLogisticRegression(max_iter5000)rfeRFE(estimatormodel,n_features_to_select10)X_rferfe.fit_transform(X_scaled,y)rfe_selectedX.columns[rfe.support_]# # 3. Embedded 法Lasso# lassoLassoCV(cv5)lasso.fit(X_scaled,y)lasso_selectedX.columns[lasso.coef_!0]# # 模型效果对比# deftest_features(features,name):X_subX_scaled[:,[X.columns.get_loc(f)forfinfeatures]]X_train,X_test,y_train,y_testtrain_test_split(X_sub,y,test_size0.3,random_state42)clfRandomForestClassifier(random_state42)clf.fit(X_train,y_train)accaccuracy_score(y_test,clf.predict(X_test))aucroc_auc_score(y_test,clf.predict_proba(X_test)[:,1])print(f[{name}] 准确率{acc:.4f}AUC{auc:.4f})print(\n 特征选择效果对比 )test_features(X.columns,全部特征)test_features(mi_selected,Filter(互信息))test_features(rfe_selected,Wrapper(RFE))test_features(lasso_selected,Embedded(Lasso))六、哪些模型特别需要特征选择✅ 必须做KNN、SVM、K-Means距离敏感线性回归、逻辑回归神经网络、PCA✅ 自带筛选可做可不做决策树、随机森林、XGBoost、LightGBM七、特征选择常见误区特征越多越好❌冗余噪声 → 过拟合 → 精度下降只看单个特征相关性❌要考虑组合与冗余训练集筛选完直接用❌必须先分训练集/测试集只在训练集上做筛选归一化/标准化可以省❌线性模型、Lasso、RFE 都对尺度敏感必须先缩放八、总结面试/论文万能背诵版特征选择 去噪、去冗余、保关键三大流派Filter快、Wrapper准、Embedded稳常规项目首选 EmbeddedLasso / 树重要性高维粗筛用 Filter小数据、高精度用 WrapperRFE先划分数据集 → 再做特征选择 → 最后训练模型