Pandas-特征工程详解

    • 一、特征工程的核心目标
    • 二、数据类型与基础转换
      • 1. 数值型特征:类型优化与异常处理
      • 2. 分类型特征:编码与规范化
        • (1)标签编码(Label Encoding)
        • (2)独热编码(One-Hot Encoding)
      • 3. 时间型特征:提取时间信息
    • 三、特征创建:从原始数据中挖掘新特征
      • 1. 数值型特征组合
      • 2. 分组统计特征
      • 3. 文本特征提取
    • 四、特征转换:优化特征分布
      • 1. 标准化与归一化
      • 2. 对数与幂转换
      • 3. 交互特征
    • 五、特征选择:保留关键信息
      • 1. 相关性分析
      • 2. 方差过滤
      • 3. 基于树模型的特征重要性
    • 六、实战案例:完整特征工程流程

特征工程其质量直接决定模型性能,优质的特征能让简单模型达到复杂模型的效果,而劣质特征则可能导致模型失效,Pandas提供了丰富的函数用于特征提取、转换和选择。本文我将系统讲解如何利用Pandas进行特征工程,从数据类型转换到高级特征创建,覆盖特征工程的全流程关键技术。

一、特征工程的核心目标

特征工程的本质是将原始数据转化为模型可理解的特征,核心目标包括:

  • 信息保留:最大限度保留原始数据中的有用信息
  • 噪声去除:减少冗余和干扰信息
  • 分布优化:调整特征分布以适应模型假设(如线性模型偏好正态分布)
  • 维度控制:在信息损失最小化的前提下降低特征维度

Pandas在特征工程中的核心作用是高效处理结构化数据,支持数值型、分类型、时间型等多种数据的特征转化。

二、数据类型与基础转换

原始数据的类型往往不符合建模要求,需先进行基础转换,为后续特征工程铺路。

1. 数值型特征:类型优化与异常处理

数值型特征(int/float)是模型最易处理的类型,但需确保数据范围合理:

import pandas as pd
import numpy as np# 示例数据
data = pd.DataFrame({'age': [25, 30, 35, 150, -5],  # 包含异常值'income': ['5000', '8000', '12000', '7500', 'NaN'],  # 字符串型数值'score': [85.5, 92.0, 78.3, 90.1, 88.7]
})# 1. 将字符串型数值转换为float
data['income'] = pd.to_numeric(data['income'], errors='coerce')  # 'NaN'转为NaN# 2. 处理异常值(年龄不可能超过120或为负)
data['age'] = data['age'].clip(lower=0, upper=120)  # 截断异常值# 3. 类型优化(减少内存占用)
data['age'] = data['age'].astype('int8')  # 年龄范围小,用int8足够

2. 分类型特征:编码与规范化

分类型特征(object/category)需转换为数值形式才能输入模型,常见方法包括:

(1)标签编码(Label Encoding)

适用于有序分类特征(如学历:小学<初中<高中):

# 定义有序类别
education_order = ['小学', '初中', '高中', '本科', '硕士', '博士']
data['education'] = pd.Categorical(data['education'], categories=education_order, ordered=True
)
# 转换为数值(0到n-1)
data['education_code'] = data['education'].cat.codes
(2)独热编码(One-Hot Encoding)

适用于无序分类特征(如颜色、城市):

# 对城市进行独热编码
city_dummies = pd.get_dummies(data['city'], prefix='city', drop_first=True)
# 合并到原数据
data = pd.concat([data, city_dummies], axis=1)
  • prefix:为新列名添加前缀(如city_北京
  • drop_first=True:删除第一列以避免多重共线性

3. 时间型特征:提取时间信息

时间特征(datetime)蕴含丰富的模式(如季节性、周期性),需提取关键信息:

# 转换为datetime类型
data['order_time'] = pd.to_datetime(data['order_time'])# 提取时间组件
data['hour'] = data['order_time'].dt.hour  # 小时(0-23)
data['dayofweek'] = data['order_time'].dt.dayofweek  # 星期几(0=周一)
data['is_weekend'] = data['dayofweek'].isin([5, 6]).astype(int)  # 是否周末
data['month'] = data['order_time'].dt.month  # 月份(1-12)
data['is_holiday'] = data['order_time'].dt.date.isin(holiday_list).astype(int)  # 是否节假日

三、特征创建:从原始数据中挖掘新特征

基于业务逻辑创建新特征,是提升模型性能的关键。Pandas的apply()transform()函数是特征创建的利器。

1. 数值型特征组合

通过算术运算生成新特征(如比率、总和):

# 示例:电商数据
data['total_price'] = data['quantity'] * data['unit_price']  # 总价=数量×单价
data['price_per_weight'] = data['total_price'] / data['weight']  # 单位重量价格
data['discount_rate'] = data['actual_price'] / data['original_price']  # 折扣率

2. 分组统计特征

通过分组聚合创建统计特征(如用户平均消费):

# 按用户ID分组,计算每个用户的消费统计量
user_stats = data.groupby('user_id')['total_price'].agg(['mean', 'sum', 'max', 'count']
).rename(columns={'mean': 'user_avg_spend','sum': 'user_total_spend','max': 'user_max_spend','count': 'user_purchase_count'
})
# 合并回原数据(每个用户的统计量广播到其所有订单)
data = data.merge(user_stats, on='user_id', how='left')

3. 文本特征提取

对文本字段(如商品描述)提取关键词或长度特征:

# 商品标题长度
data['title_length'] = data['product_title'].str.len()# 标题是否包含特定关键词(如"促销")
data['has_promotion'] = data['product_title'].str.contains('促销', na=False).astype(int)# 分割并提取类别(如"男装-T恤"→提取"T恤")
data['sub_category'] = data['category'].str.split('-', expand=True)[1]

四、特征转换:优化特征分布

原始特征的分布可能不符合模型要求(如偏态分布),需通过转换使其更接近理想分布。

1. 标准化与归一化

  • 标准化(Standardization):将特征转换为均值0、标准差1,适用于正态分布特征:

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    data['amount_standardized'] = scaler.fit_transform(data[['amount']])
    
  • 归一化(Normalization):将特征缩放到[0,1]区间,适用于均匀分布特征:

    data['amount_normalized'] = (data['amount'] - data['amount'].min()) / (data['amount'].max() - data['amount'].min()
    )
    

2. 对数与幂转换

适用于右偏分布特征(如收入、消费金额):

# 对数转换(处理右偏分布)
data['income_log'] = np.log1p(data['income'])  # log1p = log(1+x),避免x=0时出错# 平方根转换(轻度偏态)
data['price_sqrt'] = np.sqrt(data['price'])

3. 交互特征

通过特征间的乘法/加法创建交互项,捕捉变量间的协同效应:

# 价格×数量=总价(已在特征创建中体现)
# 年龄×消费金额:捕捉不同年龄的消费能力差异
data['age_spend_interaction'] = data['age'] * data['total_price']

五、特征选择:保留关键信息

过多的特征会导致维度灾难,需筛选出与目标变量相关性高的特征。

1. 相关性分析

通过皮尔逊相关系数筛选数值特征:

# 计算特征与目标变量的相关性
corr = data.corr()['target'].abs().sort_values(ascending=False)
# 选择相关性Top20的特征
top_features = corr[1:21].index  # 排除目标变量自身
data_selected = data[top_features]

2. 方差过滤

删除方差接近0的特征(几乎无变化,无预测价值):

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.01)  # 方差低于0.01的特征将被删除
data_high_variance = selector.fit_transform(data)

3. 基于树模型的特征重要性

利用随机森林等模型评估特征重要性:

from sklearn.ensemble import RandomForestClassifier
# 假设X是特征,y是目标变量
rf = RandomForestClassifier()
rf.fit(X, y)
# 提取特征重要性
importance = pd.Series(rf.feature_importances_, index=X.columns)
# 选择重要性Top10的特征
top10_features = importance.sort_values(ascending=False).head(10).index
X_selected = X[top10_features]

六、实战案例:完整特征工程流程

def build_features(raw_data):"""特征工程流水线函数"""data = raw_data.copy()# 1. 数据类型转换data['order_date'] = pd.to_datetime(data['order_date'])data['price'] = pd.to_numeric(data['price'], errors='coerce')# 2. 异常值处理data['price'] = data['price'].clip(lower=0)# 3. 时间特征data['order_hour'] = data['order_date'].dt.hourdata['is_weekend'] = data['order_date'].dt.dayofweek.isin([5,6]).astype(int)# 4. 分类型特征编码data = pd.get_dummies(data, columns=['category'], drop_first=True)# 5. 分组统计特征user_stats = data.groupby('user_id')['price'].agg(['mean', 'sum']).rename(columns={'mean': 'user_avg_price', 'sum': 'user_total_spend'})data = data.merge(user_stats, on='user_id', how='left')# 6. 特征转换data['price_log'] = np.log1p(data['price'])# 7. 特征选择(删除低方差和冗余特征)data = data.drop(columns=['order_id', 'user_id', 'order_date'])  # 非特征列return data# 加载原始数据并执行特征工程
raw_data = pd.read_csv('raw_orders.csv')
features = build_features(raw_data)

总结:特征工程的核心原则
好的特征往往比复杂模型更重要

  1. 业务驱动:特征创建需基于对业务的理解(如电商的复购率、金融的还款能力)。
  2. 迭代优化:先构建基础特征,结合模型反馈逐步添加复杂特征。
  3. 避免信息泄露:特征工程需在训练集上拟合,再应用到验证集/测试集(如分组统计不能用测试集数据)。
  4. 平衡复杂度:并非特征越多越好,过多特征会导致过拟合和计算成本上升。

That’s all, thanks for reading~~
觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91086.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91086.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91086.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pip install torch各种版本的命令及地址

一、遇到的问题&#xff1a;cuda和torch编译时的版本不一致 在安装mmcv时遇到error MMCV_WITH_OPS1 python setup.py develo RuntimeError: The detected CUDA version (11.3) mismatches the version that was used to compile PyTorch (10.2). Please make sure to use th…

【spring boot】三种日志系统对比:ELK、Loki+Grafana、Docker API

文章目录**方案 1&#xff1a;使用 ELK&#xff08;Elasticsearch Logstash Kibana&#xff09;****适用场景****搭建步骤****1. 修改 Spring Boot 日志输出****2. 创建 Docker Compose 文件****3. 配置 Logstash****4. 启动服务****方案 2&#xff1a;使用 Loki Grafana***…

Cesium加载3DTiles模型并且重新设置3DTiles模型的高度

代码&#xff1a; 使用的时候&#xff0c;直接调用 load3DTiles() 方法既可。 // 加载3Dtiles const load3DTiles async () > {let tiles_url "/3DTiles2/Production_1.json";let tileset await Cesium.Cesium3DTileset.fromUrl(tiles_url, {enableCollision: …

Matlab批量转换1km降水数据为tiff格式

1km降水数据处理- 制作数据裁剪掩膜 0 引言1 示例程序2 结语0 引言 本篇介绍用Matlab工具将中国1km分辨率逐月降水量数据集(1901-2024)批量转为tiff格式的过程。下面为具体内容: 1 示例程序 下载得到的nc数据(如pre_2001.nc)包含4个字段,其中降水数据的第1个维度为1-12,…

HandyJSON使用详情

注意事项:Model 需要实现 HandyJSON 协议&#xff0c;对于简单情况&#xff0c;只需声明 class/struct 并添加 HandyJSON 协议即可1.简单 JSON 结构JSON 数据:{"name": "John","age": 30,"isStudent": false }Model 类:struct Person:…

comfyUI-IPApterfaceID人脸特征提取

1.基础节点 以Checkpoint、CLIP、空Latent、K采样器、VAE解码、预览图像为基础节点。 2.人脸特征获取节点 IPAdapter FaceID节点专用于将特定人脸特征&#xff08;通过参考图提取&#xff09;融入生成图像。 参考图像&#xff0c;正面图像是想要参考人物的人像&#xff0c;最…

【React Native】Switch、Alert、Dimensions、StatusBar、Image组件

其他常用组件 swich https://reactnative.dev/docs/next/switch alert Alert React Native 如果想增加里面的按钮&#xff0c;就往这个数组里&#xff0c;按照这个格式不断的加东西就行了。但是&#xff1a; 在iOS上&#xff0c;里面多少个都有问题&#xff0c;3 个以上它…

渗透笔记1-4

一、HTTPS安全机制 1. HTTP的安全风险 窃听风险&#xff1a;明文传输导致通信内容可被直接截获&#xff08;如Wireshark抓包获取密码&#xff09;。篡改风险&#xff1a;中间人可修改传输内容&#xff08;如注入恶意脚本&#xff09;。冒充风险&#xff1a;攻击者伪造服务端身份…

《星盘接口6:星际联盟》

《星盘接口6&#xff1a;星际联盟》⚡ 第一章&#xff1a;新的黎明地球历2097年&#xff0c;陈欣和她的团队成功地将“数据之神”封印在一个独立的数据维度中&#xff0c;暂时解除了对银河系的威胁。然而&#xff0c;这场胜利并没有带来长久的和平。随着人类文明不断扩展至更遥…

【安卓笔记】进程和线程的基础知识

0. 环境&#xff1a; 电脑&#xff1a;Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 先熟悉JVM虚拟机的线程 ----------以下都是系统线程&#xff0c;由JV…

26-计组-多处理器

多处理器的基本概念1. 计算机体系结构分类依据&#xff1a;根据指令流和数据流的数量关系&#xff0c;计算机体系结构可分为四种类型&#xff1a;SISD、SIMD、MISD、MIMD。&#xff08;1&#xff09;SISD 单指令流单数据流定义&#xff1a;任意时刻计算机只能执行单一指令操作单…

vscode 插件开发activityba

在 VS Code 插件开发中&#xff0c;**Activity Bar&#xff08;活动栏&#xff09;**是左侧垂直导航栏的核心组成部分&#xff0c;它为用户提供了快速访问插件功能的入口。通过自定义 Activity Bar&#xff0c;开发者可以显著提升插件的可见性和用户体验。以下是关于 Activity …

【橘子分布式】Thrift RPC(理论篇)

一、简介 首先还是那句话&#xff0c;概念网上已经很多了&#xff0c;我们就不多逼逼了。我来大致介绍一下。 Thrift是一个RPC框架可以进行异构系统(服务的提供者 和 服务的调用者 不同编程语言开发系统)的RPC调用为什么在当前的系统开发中&#xff0c;会存在着异构系统的RPC…

项目进度依赖纸面计划,如何提升计划动态调整能力

项目进度依赖纸面计划会导致实际执行中的调整能力不足。提升计划动态调整能力的方法包括&#xff1a;建立动态进度管理系统、强化团队沟通与协作、定期开展风险评估与进度复盘。特别是建立动态进度管理系统&#xff0c;通过信息技术工具实现实时跟踪和反馈&#xff0c;使计划能…

递推预处理floor(log_2{n})

在C中&#xff0c;除了使用<cmath>中的log或log2函数求对数&#xff0c;也可以通过递推求出所有可能用到的⌊log⁡2i⌋,i∈[1,n]\lfloor \log_2i\rfloor, i\in[1, n]⌊log2​i⌋,i∈[1,n] 证明&#xff1a;⌊log⁡2i⌋⌊log⁡2⌊i2⌋⌋1\lfloor \log_2i \rfloor\lfloor \…

【AI智能体】智能音视频-搭建可视化智能体

可视化智能体是语音小伴侣智能体的升级版&#xff0c;支持语音与视频的双模态交互。本文详细介绍了音视频交互的实现原理、智能体搭建方法及效果测试&#xff0c;帮助开发者快速构建支持音视频交互的智能体。 应用场景 可视化智能体适用于多种场景&#xff0c;举例如下&#…

Sensoglove推出新一代外骨骼力反馈手套:主动力反馈+亚毫米级手指追踪,助力机器人操控与虚拟仿真

在工业自动化、虚拟现实和医疗康复等领域&#xff0c;高精度手部交互设备的需求日益增长。Sensoglove推出的Rembrandt外骨骼力反馈手套&#xff0c;结合主动力反馈、触觉反馈与亚毫米级追踪技术&#xff0c;为用户提供更自然、更安全的操作体验。Sensoglove外骨骼力反馈手套核心…

AutoMapper入门

在 ASP.NET Core 开发中&#xff0c;我们经常需要在不同层之间传递数据&#xff1a;比如从数据库模型&#xff08;Entity&#xff09;转换到 DTO&#xff0c;再从 DTO 转换为前端视图模型。这些转换代码大量重复、冗长、容易出错。为了解决这个问题&#xff0c;AutoMapper 诞生…

PyTorch武侠演义 第一卷:初入江湖 第1章:武林新秀遇Tensor - 张量基础

第一卷&#xff1a;初入江湖 第1章&#xff1a;武林新秀遇Tensor - 张量基础晨起码农村 鸡鸣三声&#xff0c;林小码已经收拾好了行囊。他最后看了眼床头那本翻旧的《Python入门心法》&#xff0c;轻轻抚平卷起的书角。 "小码&#xff0c;路上小心。"父亲将一把青铜匕…

Python进阶(4):类与面向对象程序设计

面向对象OOPOOP:Object Oriented Programming,面向对象编程,面向对象中的对象(Obiect)&#xff0c;通常是指客观世界中存在的对象&#xff0c;这个对象具有唯一性&#xff0c;对象之间各不相同&#xff0c;各有各的特点&#xff0c;每个对象都有自己的运动规律和内部状态;对象与…