当前位置: 首页 > news >正文

用Python实现特征工程之特征变换——数值特征的归一化和标准化、类别特征的编码、特征组合和分解、特征缩放

特征工程中的特征变换是一个重要的步骤,旨在通过转换原始特征来提高模型的性能。特征变换主要包括数值特征的归一化和标准化、类别特征的编码、特征组合和分解、以及特征缩放等。下面将详细讲解这些内容,并提供相应的Python代码示例。

1. 数值特征的归一化和标准化

归一化(Normalization)

归一化是将特征的值缩放到一个固定的范围(通常是 [0, 1])内。归一化常用于在特征值范围差异较大的情况下,减小这种差异对模型的影响。

归一化的公式通常为:

X_{norm}=\frac{X-X_{min}}{X_{max}-X{_{min}}}

标准化(Standardization)

标准化是将特征的值转换为均值为0、标准差为1的正态分布。标准化在数据具有不同的度量单位或不同的范围时非常有用。

标准化的公式为:

X_{std}=\frac{X-\mu }{\sigma }

示例代码:
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, StandardScaler# 生成示例数据
data = {'feature1': np.random.rand(100) * 10, 'feature2': np.random.rand(100) * 100}
df = pd.DataFrame(data)# 归一化
scaler = MinMaxScaler()
df[['feature1_norm', 'feature2_norm']] = scaler.fit_transform(df[['feature1', 'feature2']])# 标准化
scaler = StandardScaler()
df[['feature1_std', 'feature2_std']] = scaler.fit_transform(df[['feature1', 'feature2']])print(df.head())
运行结果示例:
   feature1   feature2  feature1_norm  feature2_norm  feature1_std  feature2_std
0  5.371278  50.936181       0.537127       0.509362     0.177720     0.066669
1  1.122034  89.489587       0.112203       0.894896    -1.264731     1.370891
2  7.991217  16.046858       0.799122       0.160469     1.139588    -1.162611
3  4.543309  18.512042       0.454331       0.185120    -0.044308    -1.063248
4  6.940704   8.839065       0.694070       0.088391     0.718581    -1.480131

2. 类别特征的编码

类别特征编码是将离散的类别变量转换为数值变量,使其可以被模型理解。常见的类别编码方法包括独热编码、标签编码、频率编码和目标编码。

独热编码(One-Hot Encoding)

独热编码将每个类别转换为一个独立的二进制特征。每个特征只包含0或1,表示某个类别是否存在。

标签编码(Label Encoding)

标签编码将每个类别映射到一个唯一的整数。适用于具有顺序关系的类别变量。

示例代码:
from sklearn.preprocessing import OneHotEncoder, LabelEncoder# 生成示例数据
df = pd.DataFrame({'category': ['A', 'B', 'C', 'A', 'B', 'C']})# 独热编码
onehot_encoder = OneHotEncoder(sparse=False)
onehot_encoded = onehot_encoder.fit_transform(df[['category']])
onehot_df = pd.DataFrame(onehot_encoded, columns=onehot_encoder.get_feature_names_out(['category']))# 标签编码
label_encoder = LabelEncoder()
df['category_encoded'] = label_encoder.fit_transform(df['category'])print(df.head())
print(onehot_df.head())
运行结果示例:
  category  category_encoded
0        A                 0
1        B                 1
2        C                 2
3        A                 0
4        B                 1category_A  category_B  category_C
0         1.0         0.0         0.0
1         0.0         1.0         0.0
2         0.0         0.0         1.0
3         1.0         0.0         0.0
4         0.0         1.0         0.0

3. 特征组合和分解

特征组合和分解是通过组合现有特征或分解特征来创建新的特征,从而增加模型的表达能力。

特征组合

特征组合通过交互或多项式特征生成新的特征。例如,将两个数值特征相乘或取它们的平方。

特征分解

特征分解通过将一个复杂的特征分解成多个简单的特征。例如,将一个日期特征分解为年、月、日。

示例代码:
from sklearn.preprocessing import PolynomialFeatures# 生成示例数据
df = pd.DataFrame({'feature1': [1, 2, 3, 4, 5], 'feature2': [10, 20, 30, 40, 50]})# 特征组合(多项式特征)
poly = PolynomialFeatures(degree=2, include_bias=False)
poly_features = poly.fit_transform(df)
poly_df = pd.DataFrame(poly_features, columns=poly.get_feature_names_out(['feature1', 'feature2']))# 特征分解(日期分解)
df['date'] = pd.to_datetime(['2022-01-01', '2022-02-01', '2022-03-01', '2022-04-01', '2022-05-01'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.dayprint(df.head())
print(poly_df.head())
运行结果示例:
   feature1  feature2  year  month  day
0         1        10  2022      1    1
1         2        20  2022      2    1
2         3        30  2022      3    1
3         4        40  2022      4    1
4         5        50  2022      5    1feature1  feature2  feature1^2  feature1 feature2  feature2^2
0         1        10           1           10         100
1         2        20           4           40         400
2         3        30           9           90         900
3         4        40          16          160        1600
4         5        50          25          250        2500

4. 特征缩放

特征缩放是指将特征数据进行比例调整,以便它们位于一个更合理的范围内,通常在应用梯度下降类算法时尤为重要。

常见方法:
  • 最小-最大缩放(Min-Max Scaling):将数据缩放到指定范围内,通常是[0, 1]。
  • Z-Score缩放:将数据缩放为均值为0,标准差为1的分布。
示例代码:
from sklearn.preprocessing import MinMaxScaler, StandardScaler# 生成示例数据
data = {'feature1': [1, 2, 3, 4, 5], 'feature2': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)# 最小-最大缩放
scaler = MinMaxScaler()
df[['feature1_minmax', 'feature2_minmax']] = scaler.fit_transform(df[['feature1', 'feature2']])# Z-Score缩放
scaler = StandardScaler()
df[['feature1_zscore', 'feature2_zscore']] = scaler.fit_transform(df[['feature1', 'feature2']])print(df.head())
运行结果示例:
   feature1  feature2  feature1_minmax  feature2_minmax  feature1_zscore  feature2_zscore
0         1        10              0.0              0.0        -1.414214        -1.414214
1         2        20              0.25             0.25        -0.707107        -0.707107
2         3        30              0.5              0.5          0.000000         0.000000
3          4        40              0.75             0.75         0.707107         0.707107
4          5        50              1.0              1.0          1.414214         1.414214

5. 总结

  • 归一化标准化 是数值特征变换中的常用方法,可以使特征更适合用于模型训练。
  • 类别特征编码 通过将类别数据转换为数值数据,使模型能够理解类别特征。
  • 特征组合和分解 通过生成新的特征或分解复杂特征来增加模型的表达能力。
  • 特征缩放 通过调整特征的比例,使其更适合于模型训练,特别是在应用梯度下降等算法时。

这些特征变换方法在特定的场景下能够显著提高模型的性能,是特征工程中不可忽视的重要步骤。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 谈谈docker的四种网络模式
  • JavaDS —— 位图(BitSet)与 布隆过滤器
  • 数据结构总体概述
  • 三大科技看点引领奥运新风潮,你是否准备好迎接科技的未来?
  • write_sdc和write_script区别
  • 【gcc】基于gpt和python的流程和延迟梯度分析
  • C语言典型例题31
  • EXPLAIN和ANALYZE
  • PostgreSQL JSON 字段操作指南
  • JavaWeb——CSS的使用
  • 【Python第三方库】Requests全面解析
  • C++ | Leetcode C++题解之第332题重新安排行程
  • 历史库,成本与性能如何兼得?| OceanBase应用实践
  • 【数据结构七夕专属版】单链表及单链表的实现【附源码和源码讲解】
  • 【SpringBoot系列】接口参数的默认值与必要性
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 230. Kth Smallest Element in a BST
  • Docker 笔记(2):Dockerfile
  • Docker入门(二) - Dockerfile
  • es的写入过程
  • Go 语言编译器的 //go: 详解
  • jquery cookie
  • JS 面试题总结
  • Magento 1.x 中文订单打印乱码
  • MySQL的数据类型
  • MySQL主从复制读写分离及奇怪的问题
  • Python打包系统简单入门
  • rabbitmq延迟消息示例
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • windows-nginx-https-本地配置
  • 彻底搞懂浏览器Event-loop
  • - 概述 - 《设计模式(极简c++版)》
  • 记一次和乔布斯合作最难忘的经历
  • 力扣(LeetCode)56
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • (1)Hilt的基本概念和使用
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (回溯) LeetCode 46. 全排列
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)库存超卖案例实战——优化redis分布式锁
  • (四)事件系统
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)Linux网络编程入门
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET与 java通用的3DES加密解密方法
  • .Net中wcf服务生成及调用
  • .ui文件相关
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • [20171102]视图v$session中process字段含义