深入解析:Python中的特征工程——从入门到精通

devtools/2024/11/7 16:16:31/

目录

一、特征工程概述

1.1 特征工程的定义

1.2 特征工程的重要性

1.3 特征工程的核心步骤

二、数据预处理

2.1 处理缺失值

2.2 异常值处理

2.3 标准化和归一化

三、特征选择与特征提取

3.1 特征选择

3.2 特征提取

四、特征编码与转换

4.1 独热编码(One-Hot Encoding)

4.2 标签编码(Label Encoding)

4.3 特征缩放

五、特征构造

5.1 基于现有特征的组合

5.2 多项式特征和交叉特征

六、模型调优与验证

6.1 网格搜索与交叉验证

6.2 集成方法

6.2.1 袋装(Bagging)

6.2.2 提升(Boosting)

6.2.3 堆叠(Stacking)

七、总结



特征工程是数据科学和机器学习中的关键环节,通过对原始数据进行处理和转换,生成对机器学习模型更有意义的新特征,从而提高模型的预测性能。本文将详细介绍Python中的特征工程,从基础概念到实际应用,帮助新手朋友全面掌握这一重要技能。

一、特征工程概述

1.1 特征工程的定义

特征工程是指通过对原始数据进行处理和转换,生成对机器学习模型更有意义的新特征的过程。一个好的特征可以大幅提高模型的预测能力,减少过拟合的风险,甚至在某些情况下,简单的模型加上优秀的特征工程也能胜过复杂的模型。

1.2 特征工程的重要性

特征工程在机器学习项目中起着至关重要的作用。通过特征工程,可以从原始数据中提取有用的信息,帮助模型更好地理解数据的内在结构,从而提高模型的性能。特征工程的目标是提高预测模型的性能,适用于分类任务、回归任务、聚类任务和推荐系统等。

1.3 特征工程的核心步骤

特征工程的核心步骤包括数据清洗、特征选择、特征转换和特征构造。

数据清洗:处理缺失值、异常值和重复值。
特征选择:选择最相关的特征,减少噪声。
特征转换:对特征进行标准化、归一化或编码。
特征构造:创建新的特征,增强模型的表达能力。

二、数据预处理

2.1 处理缺失值

缺失值是数据中常见的问题,需要通过适当的方法进行填充或删除。

python">import pandas as pd# 读取数据
df = pd.read_csv('data.csv')# 用0填充缺失值
df.fillna(0, inplace=True)
对于某些特征,可以使用均值、中位数或众数来填充缺失值。python
# 读取数据
df = pd.read_csv('purchase_data.csv')# 用均值填充年龄缺失值,用'unknown'填充性别缺失值
df.fillna({'age': df['age'].mean(), 'gender': 'unknown'}, inplace=True)

2.2 异常值处理

异常值可能是数据中的噪声,也可能是重要的信息。对于异常值的处理,可以根据具体情况选择删除或保留。

2.3 标准化和归一化

标准化和归一化是将特征缩放到相同的范围或单位,以消除量纲的影响。

python">from sklearn.preprocessing import StandardScaler# 标准化
scaler = StandardScaler()
df['feature'] = scaler.fit_transform(df[['feature']])

三、特征选择与特征提取

3.1 特征选择

特征选择是从原始特征中选择最相关的特征,以减少噪声和提高模型的性能。常用的特征选择方法包括方差过滤、相关性分析和基于模型的特征选择。

方差过滤:删除低方差特征,即特征值变化不大的特征。
相关性分析:计算特征与目标变量之间的相关性,删除相关性较低的特征。
基于模型的特征选择:使用机器学习模型来选择特征,通过逐步添加或删除特征来优化模型的性能。

python"># 假设我们已经选择了特征
features = ['age', 'amount', 'gender_unknown', 'gender_male', 'gender_female']
X = df[features]
y = df['rebuy']

3.2 特征提取

特征提取是从原始数据中提取新的特征,以增强模型的表达能力。常用的特征提取方法包括文本数据特征提取、时间序列数据特征提取和多项式特征生成。

文本数据特征提取:对于文本数据,可以使用词袋模型、TF-IDF、word2vec等方法来提取特征。

python">from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer# 词袋模型
corpus = ['UNC played Duke in basketball', 'Duke lost the basketball game, game over', 'I ate a sandwich']
vectorizer = CountVectorizer(stop_words='english')
X = vectorizer.fit_transform(corpus).todense()
print(vectorizer.vocabulary_)# TF-IDF
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus).toarray()
print(vectorizer.vocabulary_)

时间序列数据特征提取:对于时间序列数据,可以使用时间拆分、滑动窗口统计等方法来提取特征。

python"># 假设我们有一个包含用户行为日志的数据集
df = pd.read_csv('user_behavior.csv')# 时间特征提取
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['hour'] = df['timestamp'].dt.hour
df['day_of_week'] = df['timestamp'].dt.dayofweek# 聚合特征
agg_features = df.groupby('user_id').agg({'clicks': ['sum', 'mean', 'max'], 'duration': ['sum', 'mean', 'max'], 'page_views': ['sum', 'mean', 'max']}).reset_index()
agg_features.columns = ['user_id', 'total_clicks', 'avg_clicks', 'max_clicks', 'total_duration', 'avg_duration', 'max_duration', 'total_page_views', 'avg_page_views', 'max_page_views']# 特征交互
agg_features['clicks_per_page_view'] = agg_features['total_clicks'] / agg_features['total_page_views']
agg_features['duration_per_click'] = agg_features['total_duration'] / agg_features['total_clicks']# 特征选择
features = ['total_clicks', 'avg_clicks', 'max_clicks', 'total_duration', 'avg_duration', 'max_duration', 'total_page_views', 'avg_page_views', 'max_page_views', 'clicks_per_page_view', 'duration_per_click', 'hour', 'day_of_week']
X = agg_features[features]
y = agg_features['purchased']

四、特征编码与转换

4.1 独热编码(One-Hot Encoding)

独热编码是将分类特征转换为数值特征的一种常用方法。

python"># 独热编码
df = pd.get_dummies(df, columns=['category'])# 假设我们有一个包含用户购买记录的数据集
df = pd.read_csv('purchase_data.csv')
df = pd.get_dummies(df, columns=['gender'])

4.2 标签编码(Label Encoding)

标签编码是将分类特征转换为数值特征的另一种方法,但只适用于类别较少的特征。

python">from sklearn.preprocessing import LabelEncoder# 标签编码
le = LabelEncoder()
df['city'] = le.fit_transform(df['city'])

4.3 特征缩放

特征缩放是将特征缩放到相同的范围或单位,以消除量纲的影响。除了标准化之外,还可以使用归一化等方法。

python"># 标准化
scaler = StandardScaler()
df[['age', 'amount']] = scaler.fit_transform(df[['age', 'amount']])

五、特征构造

5.1 基于现有特征的组合

通过组合或转换现有特征来创建新的特征,可以增强模型的表达能力。

python"># 特征交互
agg_features['clicks_per_page_view'] = agg_features['total_clicks'] / agg_features['total_page_views']
agg_features['duration_per_click'] = agg_features['total_duration'] / agg_features['total_clicks']

5.2 多项式特征和交叉特征

多项式特征和交叉特征是通过将现有特征进行多项式组合或交叉组合来生成新的特征。

python">from sklearn.preprocessing import PolynomialFeatures# 多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)

六、模型调优与验证

特征工程和模型调优是提高模型性能的两个关键步骤。通过精心设计和调整特征,以及选择合适的模型和参数,可以显著提高模型的预测性能。

6.1 网格搜索与交叉验证

网格搜索通过遍历参数空间的所有可能组合来找到最佳参数,交叉验证则通过将数据分成多个子集来验证模型的性能。

python">from sklearn.model_selection import GridSearchCV, cross_val_score# 网格搜索
param_grid = {'n_estimators': [100, 200, 300], 'max_depth': [3, 4, 5]}
grid_search = GridSearchCV(estimator=RandomForestClassifier(), param_grid=param_grid, cv=5)
grid_search.fit(X, y)# 交叉验证
scores = cross_val_score(grid_search.best_estimator_, X, y, cv=5)
print(scores.mean())

6.2 集成方法

集成方法通过组合多个模型的预测结果来提高整体模型的性能和稳定性。常见的集成方法包括袋装(Bagging)、提升(Boosting)和堆叠(Stacking)。

6.2.1 袋装(Bagging)

袋装方法通过从原始训练集中随机抽取多个子集来训练多个模型,最终的预测结果是这些模型预测结果的平均或投票。随机森林(Random Forest)就是一种典型的袋装方法。

python">from sklearn.ensemble import RandomForestClassifier训练随机森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)
6.2.2 提升(Boosting)

提升方法通过顺序训练多个模型,每个模型都尝试纠正前一个模型的错误。梯度提升决策树(Gradient Boosting Decision Trees, GBDT)和XGBoost是提升方法的代表。

python">from sklearn.ensemble import GradientBoostingClassifier#训练梯度提升决策树模型
gbc = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
gbc.fit(X, y)
6.2.3 堆叠(Stacking)

堆叠方法通过训练多个基模型,然后将这些基模型的预测结果作为新的特征输入到一个元学习器(meta-learner)中进行最终预测。堆叠模型通常需要两层或更多层的模型。

python">from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression#定义基模型
base_learners = [
('rf', RandomForestClassifier(n_estimators=100, random_state=42)),
('gbc', GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42))
]#定义元学习器
meta_learner = LogisticRegression()#训练堆叠模型
stacking_clf = StackingClassifier(estimators=base_learners, final_estimator=meta_learner)
stacking_clf.fit(X, y)

七、总结

特征工程是机器学习项目中不可或缺的一部分,它涉及数据预处理、特征选择、特征提取、特征编码与转换以及特征构造等多个环节。通过精心设计和调整特征,可以显著提高模型的预测性能和稳定性。同时,特征工程和模型调优是相互关联的,通过网格搜索、交叉验证和集成方法等手段,可以进一步优化模型性能。


http://www.ppmy.cn/devtools/132053.html

相关文章

[SWPUCTF 2021 新生赛]fakebase

python逆向 先看源代码 这段代码是一个简单的加密算法,通过将给定的字符串转换为二进制形式,然后将二进制数转换为一个整数,再将这个整数不断地除以31取余数,并根据余数映射到s_box中的字符来实现加密。最后,输出加密…

从底层技术到实际应用:Claude与ChatGPT谁更适合学术写作?

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 使用大模型智能AI进行学术写作和科研已经成为学者、研究人员和高校学生的强大助手。Anthropic的Claude和OpenAI的ChatGPT作为该领域的两个主要参与者,正在不断发展和完善。随…

C++ 文件操作详解

C 文件操作详解 在C中,文件操作分为文本文件和二进制文件的操作,通过文件流类(ifstream、ofstream、fstream)进行文件的读写。这些类封装了文件的输入和输出操作,并继承了istream和ostream的功能,使得流对…

ubuntu 22.04 server 安装 anaconda3

ubuntu 22.04 server 安装 anaconda3 https://www.anaconda.com/download/success Anaconda Installers wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh 其他的是 默认 Executing transaction: done installation finished. Do you wish to…

Unity网络开发基础(part5.网络协议)

目录 前言 网络协议概述 OSI模型 OSI模型的规则 第一部分 物理层 数据链路层 网络层 传输层 第二部分 ​编辑 应用层 表示层 会话层 每层的职能 TCP/IP协议 TCP/IP协议的规则 TCP/IP协议每层的职能 TCP/IP协议中的重要协议 TCP协议 三次握手 四次挥手 U…

数据转换 | Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法 符号递归图(Symbolic recurrence plots)是一种一维时间序列转图像的技术,可用于平稳和非平稳数据集;对噪声具有…

Bypassuac之白名单结合注册表方式

参考 Bypass UAC 原来这么简单 本章记录一下系统白名单文件结合注册表bypassuac,uac这个东西并不是Windows设置的防御机制而是相当于保护机制,只是用来控制用户行为的,弹个窗来提醒一下用户的行为,和直接的杀软是不一样的性质&am…

AnaTraf | 网络性能监控系统保障音视频质量的秘籍

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 一、网络性能监控系统:音视频质量的幕后守护者 在当今数字化的世界里,音视频应用无处不在,无论是在线会议、远程教育还是娱乐直播。然而,这些流畅精彩的音视频…