Python 机器学习特征工程实战:从原始数据到模型输入

Nina Santos | 2026-08-26T23:03:22 | Python, AI

系统介绍特征工程中的缺失值处理、类别编码、特征缩放、特征交叉和特征选择五大核心技术。

# Python 机器学习特征工程实战 ## 一、缺失值处理 ```python import pandas as pd import numpy as np from sklearn.impute import SimpleImputer, KNNImputer # 查看缺失值情况 print(df.isnull().sum()) print(df.isnull().mean() * 100) # 缺失率 # 数值型:中位数填充(对异常值鲁棒) num_imputer = SimpleImputer(strategy='median') df[num_cols] = num_imputer.fit_transform(df[num_cols]) # 类别型:众数填充 cat_imputer = SimpleImputer(strategy='most_frequent') df[cat_cols] = cat_imputer.fit_transform(df[cat_cols]) # 高级:KNN 填充(利用相似样本) knn_imputer = KNNImputer(n_neighbors=5) df[num_cols] = knn_imputer.fit_transform(df[num_cols]) ``` ## 二、类别编码 ```python from sklearn.preprocessing import LabelEncoder, OneHotEncoder, OrdinalEncoder # 有序类别 -> OrdinalEncoder education_order = ['高中', '本科', '硕士', '博士'] ordinal_enc = OrdinalEncoder(categories=[education_order]) df['education_encoded'] = ordinal_enc.fit_transform(df[['education']]) # 无序类别(低基数) -> OneHotEncoder ohe = OneHotEncoder(sparse_output=False, drop='first') # drop='first' 避免多重共线性 encoded = ohe.fit_transform(df[['city']]) # 高基数类别 -> Target Encoding from category_encoders import TargetEncoder te = TargetEncoder() df['zipcode_encoded'] = te.fit_transform(df['zipcode'], df['target']) ``` ## 三、特征缩放 ```python from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler # StandardScaler:均值为0,标准差为1(适合正态分布) scaler = StandardScaler() # MinMaxScaler:缩放到 [0, 1](适合神经网络) scaler = MinMaxScaler() # RobustScaler:使用中位数和四分位距(对异常值鲁棒) scaler = RobustScaler() df[num_cols] = scaler.fit_transform(df[num_cols]) ``` ## 四、特征交叉 ```python # 多项式特征 from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False) crossed = poly.fit_transform(df[['age', 'income']]) # 生成:age, income, age*income # 手动构造业务特征 df['income_per_age'] = df['income'] / (df['age'] + 1) df['is_high_income_young'] = ((df['income'] > 100000) & (df['age'] < 30)).astype(int) ``` ## 五、特征选择 ```python from sklearn.feature_selection import mutual_info_classif, SelectKBest # 互信息法 mi_scores = mutual_info_classif(X, y) mi_df = pd.DataFrame({'feature': X.columns, 'mi_score': mi_scores}) mi_df = mi_df.sort_values('mi_score', ascending=False) print(mi_df.head(20)) # 基于模型的特征重要性 from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X, y) importances = pd.Series(rf.feature_importances_, index=X.columns) top_features = importances.nlargest(20).index.tolist() ``` ## Pipeline 整合 ```python from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer preprocessor = ColumnTransformer([ ('num', Pipeline([ ('imputer', SimpleImputer(strategy='median')), ('scaler', StandardScaler()), ]), num_cols), ('cat', Pipeline([ ('imputer', SimpleImputer(strategy='most_frequent')), ('encoder', OneHotEncoder(handle_unknown='ignore')), ]), cat_cols), ]) ```

← Back to Blog