机器学习特征预处理之删移除无关特征

📅 2026/7/19 3:26:33
机器学习特征预处理之删移除无关特征
示例def remove_irrelevant(X_train, y_train, X_test): 删除无关特征 rf RandomForestClassifier(n_estimators100, random_state42, n_jobs-1) rf.fit(X_train, y_train) importance_df pd.DataFrame({ feature: X_train.columns, importance: rf.feature_importances_ }).sort_values(importance, ascendingFalse) cols_to_keep importance_df[importance_df[importance] 0][feature].tolist() dropped_cols importance_df[importance_df[importance] 0][feature].tolist() print(f 删除 {len(dropped_cols)} 个无关特征) print(f 保留 {len(cols_to_keep)} 个特征) return X_train[cols_to_keep], X_test[cols_to_keep]改进版def remove_irrelevant(X_train, y_train, X_test, thresholdcumulative, # zero, cumulative, percentile cum_ratio0.95, min_features10): 智能特征选择 threshold: zero 删除重要性0; cumulative 保留累积贡献达cum_ratio的特征 rf RandomForestClassifier(n_estimators100, random_state42, n_jobs-1) rf.fit(X_train, y_train) importance_df pd.DataFrame({ feature: X_train.columns, importance: rf.feature_importances_ }).sort_values(importance, ascendingFalse) if threshold zero: cols_to_keep importance_df[importance_df[importance] 0][feature].tolist() elif threshold cumulative: # 计算累积重要性 importance_df[cum_importance] importance_df[importance].cumsum() cols_to_keep importance_df[ importance_df[cum_importance] cum_ratio ][feature].tolist() # 确保至少保留 min_features 个特征 if len(cols_to_keep) min_features: cols_to_keep importance_df.head(min_features)[feature].tolist() dropped_cols [col for col in X_train.columns if col not in cols_to_keep] print(f 删除 {len(dropped_cols)} 个特征保留重要性前{len(cols_to_keep)}个) print(f 保留特征: {cols_to_keep[:5]}... if len(cols_to_keep)5 else f 保留特征: {cols_to_keep}) # 返回裁剪后的数据 被删特征便于审计 return X_train[cols_to_keep], X_test[cols_to_keep], dropped_cols说明如果数据特征数量100且特征间相关性低当前代码可用。但对于生产环境或高维数据建议采用累积重要性阈值结合交叉验证的改进版本。调用示例import pandas as pd from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 准备数据 X, y make_classification( n_samples1000, n_features20, n_informative10, n_redundant5, n_repeated0, random_state42 ) # 转为DataFrame便于查看特征名 feature_names [ffeature_{i} for i in range(20)] X_df pd.DataFrame(X, columnsfeature_names) y_series pd.Series(y, nametarget) # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X_df, y_series, test_size0.2, random_state42 ) print(f原始训练集形状: {X_train.shape}) print(f原始测试集形状: {X_test.shape}) # 调用特征选择函数 X_train_selected, X_test_selected,dropped_cols remove_irrelevant(X_train, y_train, X_test, thresholdcumulative, cum_ratio0.95, min_features10) print(f筛选后训练集形状: {X_train_selected.shape}) print(f筛选后测试集形状: {X_test_selected.shape}) print(f保留的特征列: {X_train_selected.columns.tolist()})输出原始训练集形状: (800, 20) 原始测试集形状: (200, 20) 删除 4 个特征保留重要性前16个 保留特征: [feature_11, feature_14, feature_17, feature_15, feature_7]... 筛选后训练集形状: (800, 16) 筛选后测试集形状: (200, 16) 保留的特征列: [feature_11, feature_14, feature_17, feature_15, feature_7, feature_2, feature_18, feature_16, feature_9, feature_1, feature_3, feature_12, feature_4, feature_0, feature_8, feature_10] Process finished with exit code 0