Feature Engineering 实战:Pandas + Scikit-learn的机器学习特征工程的完整代码示例

简介: 本文详解机器学习中至关重要的特征工程(Feature Engineering)全流程,涵盖EDA探索、缺失值处理(均值/众数/KNN填补)、类别编码(Label/One-Hot)、异常值检测(IQR/Winsorize)、特征缩放(Standard/MinMax/RobustScaler)、特征构造(日期解析、多项式、分箱)及特征选择(SelectKBest/RFE),并用Scikit-learn+Pandas构建端到端Pipeline,显著提升模型性能与鲁棒性。

Feature engineering 是机器学习 pipeline 里最关键的一环。算法再好,如果输入数据噪声大、不一致或者缺乏有意义的特征,模型表现都不会很好

这篇文章用 Pandas和 Scikit-learn,把一条完整的 feature engineering pipeline 做个完整的介绍

什么是 Feature Engineering

把原始数据转换成有意义的输入变量(特征),让机器学习模型表现更好——这就是 feature engineering。

Step 1 — 探索性数据分析(EDA)

动手做特征之前,先把数据看明白。

 import pandas as pd  
import numpy as np  

np.random.seed(42)  

df = pd.DataFrame({  
    'Age': [25, 30, np.nan, 40, 35, 120, 28],  
    'Salary': [50000, 60000, 55000, 80000, np.nan, 1000000, 62000],  
    'Gender': ['Male', 'Female', 'Female', np.nan, 'Male', 'Male', 'Female'],  
    'City': ['NY', 'LA', 'NY', 'SF', np.nan, 'LA', 'SF'],  
    'Experience': [1, 3, 2, 10, 7, 25, 4],  
    'Date': pd.date_range(start='2024-01-01', periods=7),  
    'Target': [0, 1, 0, 1, 0, 1, 0]  
})  

print(df)  
print(df.head())  
print(df.info())  
 print(df.describe())

检查缺失值

 print(df.isnull().sum())

查看分布

 import matplotlib.pyplot as plt  
 df.hist(figsize=(12, 10))  
 plt.show()

Step 2 — 缺失值填补

缺失值会拉低模型准确率。

均值 / 中位数填补

 from sklearn.impute import SimpleImputer  
 imputer = SimpleImputer(strategy='median')  
 df['Age'] = imputer.fit_transform(df[['Age']])

众数填补

 cat_imputer = SimpleImputer(strategy='most_frequent')  
 df['City'] = cat_imputer.fit_transform(df[['City']])

KNN 填补

 from sklearn.impute import KNNImputer  
 knn_imputer = KNNImputer(n_neighbors=5)  
 numeric_cols = df.select_dtypes(include=['int64', 'float64'])  
 df[numeric_cols.columns] = knn_imputer.fit_transform(numeric_cols)

Step 3 — 类别编码

模型只认数字,不认文本。

Label Encoding

 from sklearn.preprocessing import LabelEncoder  
 encoder = LabelEncoder()  
 df['Gender'] = encoder.fit_transform(df['Gender'])

One-Hot Encoding

 df = pd.get_dummies(df, columns=['City'], drop_first=True)

使用 Scikit-learn OneHotEncoder

 from sklearn.preprocessing import OneHotEncoder  
 ohe = OneHotEncoder(handle_unknown='ignore')

Step 4 — 异常值检测与处理

异常值会扭曲模型的学习过程。

用 IQR 检测异常值

 Q1 = df['Salary'].quantile(0.25)  
 Q3 = df['Salary'].quantile(0.75)  
 IQR = Q3 - Q1  
 lower = Q1 - 1.5 * IQR  
 upper = Q3 + 1.5 * IQR  
 outliers = df[(df['Salary'] < lower) | (df['Salary'] > upper)]  
 print(outliers)

移除异常值

 df = df[(df['Salary'] >= lower) & (df['Salary'] <= upper)]

Winsorization

 from scipy.stats.mstats import winsorize  
 df['Salary'] = winsorize(df['Salary'], limits=[0.05, 0.05])

Step 5 — 特征缩放与归一化

不同量纲的特征会影响模型表现。

StandardScaler

 from sklearn.preprocessing import StandardScaler  
 scaler = StandardScaler()  
 df[['Age', 'Salary']] = scaler.fit_transform(df[['Age', 'Salary']])

MinMaxScaler

 from sklearn.preprocessing import MinMaxScaler  
 minmax = MinMaxScaler()  
 df[['Age', 'Salary']] = minmax.fit_transform(df[['Age', 'Salary']])

RobustScaler

数据里有异常值时使用。

 from sklearn.preprocessing import RobustScaler  
 robust = RobustScaler()  
 df[['Age', 'Salary']] = robust.fit_transform(df[['Age', 'Salary']])

Step 6 — 特征构造与变换

构造出有意义的特征,往往是准确率拉升最明显的一步。

日期特征抽取

 df['Date'] = pd.to_datetime(df['Date'])  
 df['Year'] = df['Date'].dt.year  
 df['Month'] = df['Date'].dt.month  
 df['Day'] = df['Date'].dt.day

多项式特征

 from sklearn.preprocessing import PolynomialFeatures  
 poly = PolynomialFeatures(degree=2)  
 poly_features = poly.fit_transform(df[['Age', 'Experience']])

数值变量分箱

 df['Age_Group'] = pd.cut(  
     df['Age'],  
     bins=[0, 18, 35, 60, 100],  
     labels=['Teen', 'Young', 'Adult', 'Senior']  
 )

Step 7 — 特征选择

挑出真正重要的特征,可以减少过拟合,也能让模型跑得更快。

基于相关系数的选择

 import seaborn as sns  
 corr = df.corr(numeric_only=True)  
 sns.heatmap(corr, annot=True)

SelectKBest

 from sklearn.feature_selection import SelectKBest, f_classif  
 X = df.drop('Target', axis=1)  
 y = df['Target']  
 selector = SelectKBest(score_func=f_classif, k=5)  
 X_new = selector.fit_transform(X, y)

递归特征消除(RFE)

 from sklearn.feature_selection import RFE  
 from sklearn.linear_model import LogisticRegression  
 model = LogisticRegression()  
 rfe = RFE(model, n_features_to_select=5)  
 X_rfe = rfe.fit_transform(X, y)

Pipeline 把预处理自动化,也能降低数据泄露的风险。

完整 Pipeline 示例

 from sklearn.pipeline import Pipeline  
from sklearn.compose import ColumnTransformer  
from sklearn.preprocessing import StandardScaler, OneHotEncoder  
from sklearn.impute import SimpleImputer  
from sklearn.linear_model import LogisticRegression  
from sklearn.model_selection import train_test_split  

X = df.drop('Target', axis=1)  
y = df['Target']  

numeric_features = ['Age', 'Salary', 'Experience']  
categorical_features = ['Gender', 'City']  

numeric_transformer = Pipeline(steps=[  
    ('imputer', SimpleImputer(strategy='median')),  
    ('scaler', StandardScaler())  
])  

categorical_transformer = Pipeline(steps=[  
    ('imputer', SimpleImputer(strategy='most_frequent')),  
    ('onehot', OneHotEncoder(handle_unknown='ignore'))  
])  

preprocessor = ColumnTransformer(  
    transformers=[  
        ('num', numeric_transformer, numeric_features),  
        ('cat', categorical_transformer, categorical_features)  
    ]  
)  

model_pipeline = Pipeline(steps=[  
    ('preprocessor', preprocessor),  
    ('classifier', LogisticRegression(max_iter=1000))  
])  

X_train, X_test, y_train, y_test = train_test_split(  
    X, y, test_size=0.2, random_state=42  
)  

model_pipeline.fit(X_train, y_train)  

 print("Model trained successfully")

总结

Feature engineering 是机器学习项目能否成立的基石。干净、变换过、有意义的特征,往往胜过用劣质数据训练的复杂算法。

上面把这些步骤都做扎实,模型的准确率和稳健性都会上一个台阶。

在真实的机器学习项目里,feature engineering 往往比挑哪个模型更决定胜负。特征做得好,预测自然好。

https://avoid.overfit.cn/post/188a618a76db427191da88bb4a7aba5c

by Dhivakar

目录
相关文章
|
5月前
|
JSON 前端开发 测试技术
Kimi-k2.6 流式回包乱序后,我这样接入 ​D​М‌X​Α‌РΙ
kimi-k2.6 不止于聊天,其核心价值在于“可执行交付”:统一支持代码生成、长时程任务、Agent协作、文档→技能复用及多格式输出,具备工程级组合能力。它契合企业对“单模型多工位”的刚需——在研发、内容中台等场景中,稳定闭环完成需求拆解、编码、文档整理等多步任务。真正落地需依托DMXAPI网关实现标准化API集成,解决Web路径的不确定性,让模型能力成为可度量、可审计、可持续的生产基础执行层。(239字)
|
5月前
|
云安全 存储 弹性计算
【省钱必看】阿里云优惠券领取教程及使用指南
阿里云优惠券是上云省钱利器!本文详解代金券、满减券、折扣券三类优惠,覆盖通用及指定商品,并提供权益中心等四大领取入口,以及支付抵扣、账单自动抵扣等实用指南,助力大家低成本高效上云!
408 13
|
4月前
|
设计模式 人工智能 数据可视化
Agentic 设计模式拆解:6 种结构的优缺点与应用场景
本文系统梳理Agentic AI六大核心设计模式:单一、顺序、并行智能体,循环评审,协调者与子智能体,以及作为工具的子智能体。聚焦智能体、用户、模型与工具间的结构化交互,提炼可复用的工程骨架,助力规模化落地。
410 5
Agentic 设计模式拆解:6 种结构的优缺点与应用场景
|
6月前
|
人工智能 自然语言处理 安全
(包含最新安装包)10 分钟搭建 OpenClaw 本地 AI 智能体完整流程
OpenClaw(小龙虾)是开源桌面智能体,支持Windows一键部署,10分钟即可拥有可执行文件整理、办公自动化等任务的“数字员工”。本地运行、零代码、纯中文界面,兼顾安全与易用性。
|
6月前
|
人工智能 机器人 中间件
LangChain 生态里的三层抽象:LangGraph、create_agent、Deep Agents
本文对比LangChain生态中三层智能体方案:`create_agent`(开箱即用、适合单轮工具调用)、Deep Agents(预装记忆/沙箱/子Agent,面向复杂长链路任务)和LangGraph(底层图编排引擎,支持分支、中断、持久化等深度定制)。推荐“从高抽象起步,遇瓶颈再下沉”。
685 6
LangChain 生态里的三层抽象:LangGraph、create_agent、Deep Agents
|
4月前
|
存储 人工智能 自然语言处理
大模型应用:智能体知识库动态迭代架构与大模型数据集全链路版本管理实战.135
本文详解大模型时代智能体知识库动态迭代与数据集版本管理双引擎体系:前者实现知识实时增量更新、自动清洗与冷热分层,保障RAG时效性;后者依托DVC+Git、数据指纹与分支快照,确保训练数据可追溯、可回滚、合规稳定。二者协同构建“知识更新→样本沉淀→模型优化”闭环,兼顾实时性、准确性与工程可靠性。
607 4
|
5月前
|
存储 人工智能 固态存储
阿里云4核云服务器租用价格解析:4核8G、4核16G、4核32G配置最新收费标准与活动价格
本文介绍了阿里云4核云服务器的配置选择、价格体系及购买策略。4核配置涵盖经济型e实例、通用算力型u2i/u2a、计算型c9i/c9a、通用型g9及内存型r9等多个实例族,分别适用于个人博客、企业Web应用、AI推理及大数据处理等场景。同时,文中列出了4核8G、16G、32G在各实例下的官方标准价及2026年活动价(如u2i实例4核8G低至1252.63元/年起)。建议用户根据业务需求选型,结合优惠券实现折上折,有效降低上云成本。
|
6月前
|
存储 设计模式 缓存
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
LLM Agent需持久化记忆以支撑连续对话、用户画像、知识沉淀与崩溃恢复。但满上下文方案成本高、延迟大、易出错。本文提出五阶段流水线(抽取→整合→存储→检索→遗忘)与四种记忆类型(工作/情景/语义/过程记忆),结合结构化状态+向量搜索等设计模式,实现高效、可控、可审计的生产级记忆系统。
1550 9
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
|
5月前
阿里云无影云电脑个人版——无影灵豆详解、费率、灵豆包购买及抵扣规则全解析
无影灵豆是阿里云无影云电脑个人版专属计费单位,衡量云电脑/云游戏每小时资源消耗量(如经济模式4豆/小时,电竞模式60豆/小时),支持按需购买灵豆包,优先抵扣套餐内额度,过期作废。阿里云无影云电脑官方链接:https://t.aliyun.com/U/Qlbmzx
896 2

热门文章

最新文章