特征工程实战:数据预处理与特征选择完全指南 📅 2026/7/5 12:05:25 特征工程实战数据预处理与特征选择完全指南1. 特征工程的重要性数据和特征决定了机器学习的上限而模型和算法只是逼近这个上限 特征工程流程 ├── 数据清洗缺失值、异常值、重复值 ├── 特征变换标准化、归一化、编码 ├── 特征构造组合特征、交叉特征 ├── 特征选择过滤法、包裹法、嵌入法 └── 特征降维PCA、LDA2. 缺失值处理importpandasaspdimportnumpyasnpfromsklearn.imputeimportSimpleImputer,KNNImputer# 方法 1删除缺失值data.dropna(inplaceTrue)# 方法 2均值/中位数/众数填充imputerSimpleImputer(strategymean)# mean/median/most_frequentX_filledimputer.fit_transform(X)# 方法 3KNN 填充knn_imputerKNNImputer(n_neighbors5)X_filledknn_imputer.fit_transform(X)# 方法 4前向填充时间序列data.fillna(methodffill,inplaceTrue)# 方法 5插值填充data.interpolate(methodlinear,inplaceTrue)3. 异常值检测importnumpyasnp# 方法 1Z-Scoredefdetect_outliers_zscore(data,threshold3):z_scoresnp.abs((data-data.mean())/data.std())returnz_scoresthreshold# 方法 2IQR四分位距defdetect_outliers_iqr(data,factor1.5):Q1data.quantile(0.25)Q3data.quantile(0.75)IQRQ3-Q1 lowerQ1-factor*IQR upperQ3factor*IQRreturn(datalower)|(dataupper)# 方法 3孤立森林fromsklearn.ensembleimportIsolationForest isoIsolationForest(contamination0.1)outliersiso.fit_predict(X)# -1 为异常4. 特征编码importpandasaspdfromsklearn.preprocessingimportLabelEncoder,OneHotEncoder,OrdinalEncoder# 标签编码有序类别leLabelEncoder()data[size_encoded]le.fit_transform(data[size])# S2, M1, L0# 独热编码无序类别data_encodedpd.get_dummies(data,columns[color],drop_firstTrue)# 有序编码oeOrdinalEncoder(categories[[low,medium,high]])data[level_encoded]oe.fit_transform(data[[level]])# 目标编码高基数类别fromcategory_encodersimportTargetEncoder teTargetEncoder()data[city_encoded]te.fit_transform(data[city],data[target])5. 特征缩放fromsklearn.preprocessingimportStandardScaler,MinMaxScaler,RobustScaler# 标准化均值 0标准差 1scalerStandardScaler()X_scaledscaler.fit_transform(X)# 归一化0-1 范围scalerMinMaxScaler()X_scaledscaler.fit_transform(X)# 鲁棒缩放对异常值不敏感scalerRobustScaler()X_scaledscaler.fit_transform(X)6. 特征构造# 时间特征data[hour]pd.to_datetime(data[timestamp]).dt.hour data[day_of_week]pd.to_datetime(data[timestamp]).dt.dayofweek data[month]pd.to_datetime(data[timestamp]).dt.month data[is_weekend]data[day_of_week].isin([5,6]).astype(int)# 组合特征data[price_per_sqft]data[price]/data[area]data[bath_per_bed]data[bathrooms]/data[bedrooms]# 交互特征fromsklearn.preprocessingimportPolynomialFeatures polyPolynomialFeatures(degree2,interaction_onlyTrue)X_polypoly.fit_transform(X)# 文本特征fromsklearn.feature_extraction.textimportTfidfVectorizer tfidfTfidfVectorizer(max_features1000)X_texttfidf.fit_transform(data[text])7. 特征选择fromsklearn.feature_selectionimport(SelectKBest,f_classif,mutual_info_classif,RFE,SelectFromModel)# 方法 1过滤法 - 方差阈值fromsklearn.feature_selectionimportVarianceThreshold selectorVarianceThreshold(threshold0.01)X_selectedselector.fit_transform(X)# 方法 2过滤法 - 相关系数correlationsdata.corrwith(data[target]).abs()top_featurescorrelations.nlargest(10).index# 方法 3过滤法 - 互信息selectorSelectKBest(mutual_info_classif,k10)X_selectedselector.fit_transform(X,y)# 方法 4包裹法 - 递归特征消除fromsklearn.ensembleimportRandomForestClassifier rfeRFE(RandomForestClassifier(),n_features_to_select10)X_selectedrfe.fit_transform(X,y)# 方法 5嵌入法 - L1 正则化fromsklearn.linear_modelimportLassoCV lassoLassoCV()lasso.fit(X,y)importantnp.abs(lasso.coef_)0.018. 特征降维fromsklearn.decompositionimportPCAfromsklearn.discriminant_analysisimportLinearDiscriminantAnalysis# PCA无监督降维pcaPCA(n_components0.95)# 保留 95% 方差X_pcapca.fit_transform(X)print(f降维后维度:{X_pca.shape[1]})# LDA有监督降维ldaLinearDiscriminantAnalysis(n_components2)X_ldalda.fit_transform(X,y)总结技术方法适用场景缺失值均值/KNN/插值数据不完整编码OneHot/Label/Target分类特征缩放Standard/MinMax量纲不同选择过滤/包裹/嵌入特征过多降维PCA/LDA高维数据