数据预处理在建模中的重要性与常见方法(三):特征工程篇

数据预处理在建模中的重要性与常见方法):特征工程篇

特征工程是数据预处理中至关重要的一步,通过构建、转换和选择最能代表数据特性的特征,以提高模型的性能和准确性。常见的特征工程方法包括特征选择、特征提取和特征编码。

1. 特征选择

特征选择是从原始特征中选择最有用的特征,以减少模型的复杂性,防止过拟合,提高模型的泛化能力。常用的方法有过滤法、包裹法和嵌入法。

(1)过滤法

方差选择法:

·  应用场景:适用于特征数量较多且计算资源有限的场景,如文本分类和基因数据分析。

·  优点:简单高效,易于实现。

·  缺点:忽略了特征之间的相关性。

(2)包裹法

·  递归特征消除(RFE): 通过递归训练模型,消除权重最小的特征:

通过递归训练模型,消除权重最小的特征}通过递归训练模型,消除权重最小的特征

·  应用场景:适用于中小规模数据集的特征选择,如医疗数据和营销数据。

·  优点:考虑了特征之间的相互作用。

·  缺点:计算复杂度高,耗时较长。

(3)嵌入法

Lasso回归:

·  应用场景:适用于高维数据的特征选择,如金融数据和生物信息数据。

·  优点:能够同时进行特征选择和模型训练。

·  缺点:对参数的选择较为敏感。

2. 特征提取

特征提取是通过对原始数据进行变换,生成新的特征,以便更好地捕捉数据中的信息。常用的方法有主成分分析(PCA)和线性判别分析(LDA)。

(1)主成分分析(PCA)

·  其中,W是特征向量矩阵。

·  应用场景:适用于高维数据降维,如图像处理和信号处理。

·  优点:能够减少数据维度,保留数据的主要信息。

·  缺点:难以解释提取的特征,丢失部分信息。

(2)线性判别分析(LDA)

·  其中,W是最大化类间方差与类内方差比的投影矩阵。

·  应用场景:适用于带有类别标签的数据降维,如模式识别和图像分类。

·  优点:考虑了类别信息,提高了分类性能。

·  缺点:仅适用于线性可分的数据。

3. 特征编码

特征编码是将分类变量转换为数值变量,使其能够被机器学习算法处理。常用的方法有One-Hot编码和标签编码。

(1)One-Hot编码

·  其中,1的位置对应x_i的类别。

·  应用场景:适用于无序分类变量的编码,如颜色、城市等。

·  优点:简单直观,保留了类别的独立性。

·  缺点:对高基数特征会导致维度爆炸。

(2)标签编码

·  应用场景:适用于有序分类变量的编码,如评级、等级等。

·  优点:节省内存,适合树模型。

·  缺点:可能引入类别之间的顺序关系。

对应的具体代码实现

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from sklearn.feature_selection import VarianceThreshold, SelectFromModel

from sklearn.linear_model import Lasso

from sklearn.decomposition import PCA

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

from sklearn.preprocessing import OneHotEncoder, LabelEncoder



plt.rcParams['font.sans-serif']=['SimHei']

plt.rcParams['axes.unicode_minus']=False

# 生成示例数据

np.random.seed(0)

X = pd.DataFrame({

    'feature1': np.random.randn(100),

    'feature2': np.random.randn(100),

    'feature3': np.random.choice(['A', 'B', 'C'], 100)

})

y = np.random.choice([0, 1], 100)

# 特征选择 - 方差选择法

selector = VarianceThreshold(threshold=0.1)

X_var = selector.fit_transform(X[['feature1', 'feature2']])

# 特征提取 - PCA

pca = PCA(n_components=1)

X_pca = pca.fit_transform(X[['feature1', 'feature2']])

# 特征提取 - LDA

lda = LDA(n_components=1)

X_lda = lda.fit_transform(X[['feature1', 'feature2']], y)

# 特征编码 - One-Hot编码

encoder = OneHotEncoder()

X_onehot = encoder.fit_transform(X[['feature3']]).toarray()

# 特征编码 - 标签编码

label_encoder = LabelEncoder()

X_label = label_encoder.fit_transform(X['feature3'])

# 可视化

fig, axs = plt.subplots(2, 2, figsize=(12, 12))

# 方差选择法

axs[0, 0].scatter(X_var[:, 0], X_var[:, 1], c=y)

axs[0, 0].set_title('方差选择法')

# PCA

axs[0, 1].scatter(X_pca, np.zeros_like(X_pca), c=y)

axs[0, 1].set_title('主成分分析(PCA)')

# LDA

axs[1, 0].scatter(X_lda, np.zeros_like(X_lda), c=y)

axs[1, 0].set_title('线性判别分析(LDA)')

# One-Hot编码

axs[1, 1].imshow(X_onehot[:10], aspect='auto', cmap='viridis')

axs[1, 1].set_title('One-Hot编码')

plt.tight_layout()

plt.show()

对应的可视化结果

更多干货内容:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值