体系化特性工程全流程:基于Scikit-Learn的实战指南与模型优化剖析 ...

打印 上一主题 下一主题

主题 1002|帖子 1002|积分 3006

特性工程流程图

  1. 数据清洗 → 特征编码 → 特征转换 → 特征生成 → 特征选择 → 数据整合
  2.       ↑           ↓
  3.       └─数据探索───┘
复制代码

各步骤详解、注意事项及Scikit-learn函数

1. 数据清洗



  • 目标:处理缺失值、异常值、重复数据。
  • 注意事项

    • 缺失值填充需根据数据分布选择方法(均值、中位数、众数)。
    • 异常值需结合业务逻辑判断是否删除或修正。

  • Scikit-learn函数

    • SimpleImputer:填充缺失值。
      1. from sklearn.impute import SimpleImputer
      2. imputer = SimpleImputer(missing_values=np.nan, strategy='mean')  # strategy: mean/median/most_frequent
      复制代码

2. 特性编码



  • 目标:将分类特性(字符串或类别)转换为数值形式。
  • 注意事项

    • 类别特性需区分有序(如等级)和无序(如颜色)。
    • 制止“类别陷阱”(如One-Hot编码后最后一列冗余)。

  • Scikit-learn函数

    • LabelEncoder:将标签编码为0,1,2,…。
      1. from sklearn.preprocessing import LabelEncoder
      2. encoder = LabelEncoder()
      复制代码
    • OneHotEncoder:将无序分类特性转为二进制特性。
      1. from sklearn.preprocessing import OneHotEncoder
      2. encoder = OneHotEncoder(drop='first', sparse_output=False)  # drop参数避免多重共线性
      复制代码

3. 特性转换



  • 目标:缩放或变换特性分布(如尺度化、归一化)。
  • 注意事项

    • 尺度化恰当高斯分布数据,归一化恰当非高斯分布或极端值。
    • 需对训练集和测试集使用相同的转换参数(均值、方差)。

  • Scikit-learn函数

    • StandardScaler:尺度化(零均值,单元方差)。
      1. from sklearn.preprocessing import StandardScaler
      2. scaler = StandardScaler(with_mean=True, with_std=True)
      复制代码
    • MinMaxScaler:归一化到[0,1]。
      1. from sklearn.preprocessing import MinMaxScaler
      2. scaler = MinMaxScaler(feature_range=(0, 1))
      复制代码

4. 特性生成



  • 目标:创建新特性(如多项式特性、交互项)。
  • 注意事项

    • 过度生成大概导致维度爆炸,需结合模型复杂度。

  • Scikit-learn函数

    • PolynomialFeatures:生成多项式特性。
      1. from sklearn.preprocessing import PolynomialFeatures
      2. poly = PolynomialFeatures(degree=2, include_bias=False)  # degree为多项式阶数
      复制代码

5. 特性选择



  • 目标:选择与目标变量相干性高的特性。
  • 注意事项

    • 嵌入式方法(如Lasso回归)或包装法(如递归特性消除RFE)需结合模型。

  • Scikit-learn函数

    • SelectKBest:基于统计检验选择前K个特性。
      1. from sklearn.feature_selection import SelectKBest, f_regression
      2. selector = SelectKBest(score_func=f_regression, k=3)  # k为保留特征数
      复制代码
    • RFE:递归特性消除。
      1. from sklearn.feature_selection import RFE
      2. from sklearn.linear_model import LinearRegression
      3. estimator = LinearRegression()
      4. selector = RFE(estimator, n_features_to_select=2)
      复制代码

6. 数据整合



  • 目标:将不同预处理步骤组合为流水线(Pipeline)。
  • 注意事项

    • 使用ColumnTransformer处理混合类型数据(数值+类别)。

  • Scikit-learn函数

    • ColumnTransformer:按列应用不同转换器。
      1. from sklearn.compose import ColumnTransformer
      2. numerical_cols = ['age', 'income']
      3. categorical_cols = ['gender', 'education']
      4. preprocessor = ColumnTransformer(
      5.     transformers=[
      6.         ('num', StandardScaler(), numerical_cols),
      7.         ('cat', OneHotEncoder(), categorical_cols)
      8.     ])
      复制代码


完整实例:房价猜测

  1. import numpy as np
  2. import pandas as pd
  3. from sklearn.datasets import fetch_california_housing
  4. from sklearn.model_selection import train_test_split
  5. from sklearn.pipeline import Pipeline
  6. from sklearn.compose import ColumnTransformer
  7. from sklearn.preprocessing import StandardScaler, OneHotEncoder
  8. from sklearn.impute import SimpleImputer
  9. from sklearn.ensemble import RandomForestRegressor
  10. from sklearn.metrics import mean_squared_error
  11. # 加载数据
  12. data = fetch_california_housing(as_frame=True)
  13. X = data.data
  14. y = data.target
  15. # 模拟缺失值(示例)
  16. X['HouseAge'] = X['HouseAge'].mask(np.random.random(len(X)) < 0.1, np.nan)
  17. # 分割数据
  18. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  19. # 定义预处理流水线
  20. numerical_cols = ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup']
  21. categorical_cols = ['OceanProximity']  # 假设有一个分类特征
  22. preprocessor = ColumnTransformer(
  23.     transformers=[
  24.         ('num', Pipeline([
  25.             ('imputer', SimpleImputer(strategy='median')),
  26.             ('scaler', StandardScaler())
  27.         ]), numerical_cols),
  28.         
  29.         ('cat', Pipeline([
  30.             ('imputer', SimpleImputer(strategy='most_frequent')),
  31.             ('encoder', OneHotEncoder(drop='if_binary'))
  32.         ]), categorical_cols)
  33.     ])
  34. # 构建完整Pipeline(预处理 + 模型)
  35. pipeline = Pipeline([
  36.     ('preprocessor', preprocessor),
  37.     ('regressor', RandomForestRegressor(n_estimators=100, random_state=42))
  38. ])
  39. # 训练模型
  40. pipeline.fit(X_train, y_train)
  41. # 预测与评估
  42. y_pred = pipeline.predict(X_test)
  43. mse = mean_squared_error(y_test, y_pred)
  44. print(f"Mean Squared Error: {mse:.2f}")
复制代码

关键注意事项


  • Pipeline的紧张性:将预处理步骤与模型训练组合为Pipeline,确保流程可重复且制止数据泄漏。
  • 特性工程与模型选择:线性模型(如Logistic Regression)对特性缩放敏感,树模型(如Random Forest)则相对不敏感。
  • 交叉验证:特性选择(如SelectKBest)应嵌入交叉验证中,制止过拟合。
通过以上流程,可以体系化地优化数据质量并提升模型性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表