数据预处理方法—特征选择、特征缩放、特征构造

devtools/2024/11/30 7:21:46/

特征选择

1.1 原理

特征选择是选择对模型训练最重要的特征,减少数据维度,去除冗余或不相关特征,提高模型性能的性能和训练速度,减少过拟合。

1.2 核心公式

  可以使用基于树模型的特征重要性度量,如在随机森林中计算特征的重要性:

其中,Ii,j是第j棵树中特征Xi的重要性度量。

假设使用基于Gini系数的特征重要性计算方法,单棵树的特征重要性可以表示为:

其中,T是所有包含特征Xi的节点,Nt是节点t的样本数量,N是总样本数量,\Delta Ginit是节点t上的Ginit系数变化。

1.3 Python案列

python">import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, f_classif,␣
,
→mutual_info_classif
from sklearn.preprocessing import StandardScaler
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 特征选择方法
selectors = [
('SelectKBest_f_classif', SelectKBest(score_func=f_classif, k=2)),
('SelectKBest_mutual_info_classif',␣
,
→SelectKBest(score_func=mutual_info_classif, k=2))
]
# 绘制图形
plt.figure(figsize=(14, 6))
for i, (name, selector) in enumerate(selectors):
plt.subplot(1, 2, i + 1)
X_new = selector.fit_transform(X_scaled, y)
mask = selector.get_support()
plt.scatter(X_new[:, 0], X_new[:, 1], c=y, edgecolor='k', s=50)
plt.title(f'{name} Feature Selection')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.tight_layout()
plt.show()

 

特征缩放 

2.1 原理 

减少特征值范围的差异,帮助某些算法更快收敛,常用于标准化和归一化之外的方法。

2.2 核心公式

  最大最小缩放

其中,Xmax和Xmin分别是特征的最大值和最小值。

  对数变换

其中,加1是为了避免对数零或负值问题。

2.3 Python案例

python">import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 加载Iris数据集
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target
# 原始数据集的散点图
sns.pairplot(df, hue='species', markers=['o', 's', 'D'])
plt.suptitle('Original Data', y=1.02)
plt.show()
# 标准化
scaler = StandardScaler()
#data_standardized = scaler.fit_transform(df.iloc[:,:-1])
#df_standardized = pd.DataFrame(data_standardized, columns=iris.feature_names)
df_standardized = pd.DataFrame(scaler.fit_transform(df.iloc[:, :-1]),␣
,
→columns=iris.feature_names)
df_standardized['species'] = df['species']
# 标准化数据集的散点图
sns.pairplot(df_standardized, hue='species', markers=['o', 's', 'D'])
plt.suptitle('Standardized Data', y=1.02)
plt.show()
# 最小最大缩放
scaler = MinMaxScaler()
df_minmax = pd.DataFrame(scaler.fit_transform(df.iloc[:, :-1]), columns=iris.
,
→feature_names)
df_minmax['species'] = df['species']
# 最小最大缩放数据集的散点图
sns.pairplot(df_minmax, hue='species', markers=['o', 's', 'D'])
plt.suptitle('Min-Max Scaled Data', y=1.02)
plt.show()

 

 

特征构造

3.1 原理

特征构造可以中的隐藏关系,提升模型表现。

3.2 Python案例

python">import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 生成示例数据
np.random.seed(42)
data = pd.DataFrame({
'area': np.random.randint(1000, 3500, 100),
'bedrooms': np.random.randint(1, 5, 100),
'bathrooms': np.random.randint(1, 3, 100),
'price': np.random.randint(100000, 500000, 100)
})
# 构造新特征
data['price_per_sqft'] = data['price'] / data['area']
data['bed_bath_ratio'] = data['bedrooms'] / data['bathrooms']
# 绘制图形
plt.figure(figsize=(14, 6))
# 图形1:价格与每平方英尺价格的关系
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['area'], y=data['price_per_sqft'])
plt.title('Price per Square Foot vs Area')
plt.xlabel('Area (sqft)')
plt.ylabel('Price per Square Foot ($)')
# 图形2:价格与卧室-浴室比例的关系
plt.subplot(1, 2, 2)
sns.scatterplot(x=data['bed_bath_ratio'], y=data['price'])
plt.title('Price vs Bedroom-Bathroom Ratio')
plt.xlabel('Bedroom-Bathroom Ratio')
plt.ylabel('Price ($)')
plt.tight_layout()
plt.show()
# 更多图形
plt.figure(figsize=(14, 6))
# 图形3:面积与价格的关系
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['area'], y=data['price'])
plt.title('Area vs Price')
plt.xlabel('Area (sqft)')
plt.ylabel('Price ($)')
# 图形4:每平方英尺价格的分布
plt.subplot(1, 2, 2)
sns.histplot(data['price_per_sqft'], kde=True)
plt.title('Distribution of Price per Square Foot')
plt.xlabel('Price per Square Foot ($)')
plt.ylabel('Frequency')
plt.tight_layout()
plt.show()

 

 

 

 

 

     


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

相关文章

Git 的使用

Git 初始 个人本机使用:Git 基础命令和概念 多人共享使用:团队开发同一个项目的代码版本管理 Git 安装 检验安装是否成功: 打开 bash 终端(git 专用) 命令:git -v(查看版本号)…

ScratchLLMStepByStep——从零一步一步构建大语言模型

前言 在学习大语言模型的时候,总会遇到各种各样的名词,像自注意力、多头、因果、自回归、掩码、残差连接、归一化等等。这些名词会让学习者听的云里雾里,觉得门槛太高而放弃。 本教程将会带你从零开始,一步一步的去构建每一个组…

社群赋能电商:小程序 AI 智能名片与 S2B2C 商城系统的整合与突破

摘要:本文聚焦于社群在电商领域日益凸显的关键地位,深入探讨在社群粉丝经济迅猛发展背景下,小程序 AI 智能名片与 S2B2C 商城系统如何与社群深度融合,助力电商突破传统运营局限,挖掘新增长点。通过分析社群对电商的价值…

计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Next.js -服务端组件如何渲染

#题引:我认为跟着官方文档学习不会走歪路 服务器组件渲染到客户端发生了什么? 请求到达服务器 用户在浏览器中请求一个页面。 Next.js 服务器接收到这个请求,并根据路由找到相应的页面组件。服务器组件的渲染 Next.js 识别出请求的页面包含…

stm32单片机个人学习笔记13(USART串口协议)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

IDEA Mac快捷键(自查询使用)

Editing(编辑) Control Space 基本的代码补全(补全任何类、方法、变量)Control Shift Space 智能代码补全(过滤器方法列表和变量的预期类型)Command Shift Enter 自动结束代码,行末自动添…

python 基础语法

标识符 定义 类,变量,模块,函数的名称定义 规定 1.必须是字母或者_开头 2.其他组成必须是数字,_或者大小写字母开头 3,会区分大小写 保留字 定义 可以理解为此前已经被系统或库定义好的变量名称,我们不能…