特征构造和降维

特征构造(Feature Engineering)

特征构造是从现有数据中创建新的特征,以揭示数据中的隐藏关系,从而提高模型表现。这是数据预处理中一个关键步骤,可以显著提升模型的性能。

原理

通过特征构造,我们可以利用现有特征之间的关系来创建新的特征。例如,对于两个特征 x1 和 x2,我们可以构造它们的交互特征 x1× x2:

此外,可以使用各种数学运算、统计量或领域知识来构造新的特征,以揭示数据中的隐藏关系。

案例:在线购物平台数据

假设我们有一个在线购物平台的用户行为数据集,其中包含用户的基本信息和购买行为数据,如访问次数、购买次数、平均购买金额等。我们将通过特征构造,创建一些新的特征,如每次访问的平均购买金额和购买率,并进行可视化分析。

数据描述

  • user_id:用户ID
  • visits:访问次数
  • purchases:购买次数
  • total_spent:总消费金额

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({
    'user_id': range(1, 101),
    'visits': np.random.randint(1, 20, 100),
    'purchases': np.random.randint(0, 10, 100),
    'total_spent': np.random.uniform(10, 1000, 100)
})

# 构造新特征
data['avg_spent_per_visit'] = data['total_spent'] / data['visits']
data['purchase_rate'] = data['purchases'] / data['visits']

# 显示前几行数据
print("数据集前几行:")
print(data.head())

# 绘制图形
plt.figure(figsize=(14, 6))

# 图形1:每次访问的平均购买金额与总消费金额的关系
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['avg_spent_per_visit'], y=data['total_spent'])
plt.title('Avg Spent per Visit vs Total Spent')
plt.xlabel('Avg Spent per Visit ($)')
plt.ylabel('Total Spent ($)')

# 图形2:购买率与总消费金额的关系
plt.subplot(1, 2, 2)
sns.scatterplot(x=data['purchase_rate'], y=data['total_spent'])
plt.title('Purchase Rate vs Total Spent')
plt.xlabel('Purchase Rate')
plt.ylabel('Total Spent ($)')

plt.tight_layout()
plt.show()

# 更多图形
plt.figure(figsize=(14, 6))

# 图形3:访问次数与总消费金额的关系
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['visits'], y=data['total_spent'])
plt.title('Visits vs Total Spent')
plt.xlabel('Visits')
plt.ylabel('Total Spent ($)')

# 图形4:每次访问的平均购买金额的分布
plt.subplot(1, 2, 2)
sns.histplot(data['avg_spent_per_visit'], kde=True)
plt.title('Distribution of Avg Spent per Visit')
plt.xlabel('Avg Spent per Visit ($)')
plt.ylabel('Frequency')

plt.tight_layout()
plt.show()

代码解析

  1. 生成示例数据:创建一个包含用户访问和购买行为的示例数据集,包括用户ID、访问次数、购买次数和总消费金额。
  2. 构造新特征
    • avg_spent_per_visit:每次访问的平均购买金额,通过总消费金额除以访问次数计算得到。
    • purchase_rate:购买率,通过购买次数除以访问次数计算得到。
  1. 显示前几行数据:输出数据集的前几行,以便检查数据和新特征的正确性。
  2. 绘制图形
    • 图形1:展示每次访问的平均购买金额与总消费金额的关系。使用散点图来观察不同用户的购买行为。
    • 图形2:展示购买率与总消费金额的关系。使用散点图来观察购买率对总消费金额的影响。

    • 图形3:展示访问次数与总消费金额的关系。使用散点图来观察不同访问次数用户的消费情况。
    • 图形4:展示每次访问的平均购买金额的分布。使用直方图和核密度估计(KDE)来观察每次访问的平均购买金额的分布情况。

通过这个生活场景的案例,我们可以看到特征构造如何揭示数据中的隐藏关系,并帮助我们更好地理解和分析数据。构造的新特征不仅可以提高模型的表现,还可以为数据分析提供更多有价值的视角。

降维(Dimensionality Reduction)

降维是减少特征数量的技术,旨在保留数据的主要信息。常用的方法包括主成分分析(PCA)和线性判别分析(LDA)。通过降维,可以减少数据的复杂性,消除噪声,并提高模型的性能。

原理

  • 主成分分析(PCA)
    1. 数据中心化:将数据集的每个特征减去其均值。
    2. 计算协方差矩阵:描述数据的协方差信息。
    3. 特征值分解:对协方差矩阵进行特征值分解,得到特征值和特征向量。
    4. 选择前k个最大特征值对应的特征向量构成变换矩阵。
    5. 变换数据:用变换矩阵将原始数据投影到低维空间。

核心公式:

案例:客户购买行为数据

假设我们有一个大型超市的客户购买行为数据集,其中包含多个特征,如客户年龄、月均购买次数、月均消费金额、购买种类数等。我们将通过PCA和t-SNE降维方法,将数据从高维降到二维,以便可视化分析。

数据描述

  • customer_id:客户ID
  • age:年龄
  • avg_purchases_per_month:月均购买次数
  • avg_spent_per_month:月均消费金额
  • purchase_variety:购买种类数

Python代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE

# 生成示例数据
np.random.seed(42)
data = pd.DataFrame({
    'customer_id': range(1, 101),
    'age': np.random.randint(18, 70, 100),
    'avg_purchases_per_month': np.random.randint(1, 30, 100),
    'avg_spent_per_month': np.random.uniform(100, 5000, 100),
    'purchase_variety': np.random.randint(1, 20, 100)
})

# 提取特征列
features = data[['age', 'avg_purchases_per_month', 'avg_spent_per_month', 'purchase_variety']]

# 使用PCA将数据降到2维
pca = PCA(n_components=2)
data_pca = pca.fit_transform(features)

# 使用t-SNE将数据降到2维
tsne = TSNE(n_components=2, random_state=42)
data_tsne = tsne.fit_transform(features)

# 绘制PCA降维后的数据
plt.figure(figsize=(14, 6))

plt.subplot(1, 2, 1)
scatter = plt.scatter(data_pca[:, 0], data_pca[:, 1], c=data['age'], cmap='viridis', alpha=0.7)
plt.colorbar(scatter, label='Age')
plt.title('PCA of Customer Data')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')

# 绘制t-SNE降维后的数据
plt.subplot(1, 2, 2)
scatter = plt.scatter(data_tsne[:, 0], data_tsne[:, 1], c=data['age'], cmap='viridis', alpha=0.7)
plt.colorbar(scatter, label='Age')
plt.title('t-SNE of Customer Data')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')

plt.show()

# 计算PCA的前两个主成分的解释方差比
explained_variance = pca.explained_variance_ratio_
print(f'Explained variance by the first two principal components: {explained_variance[0]:.2f}, {explained_variance[1]:.2f}')

# 用Seaborn绘制Pairplot图(可以绘制更多维度,但这里只选前两个维度示范)
df_pca = pd.DataFrame(data_pca, columns=['PC1', 'PC2'])
df_pca['age'] = data['age']

sns.pairplot(df_pca, hue='age', palette='viridis')
plt.suptitle('Pairplot of PCA Components', y=1.02)
plt.show()

代码解析

  1. 生成示例数据:创建一个包含客户购买行为的示例数据集,包括客户ID、年龄、月均购买次数、月均消费金额和购买种类数。
  2. 提取特征列:从数据集中提取用于降维的特征列。
  3. 使用PCA降维:将数据降到二维,方便可视化分析。绘制PCA降维后的散点图,以客户年龄为颜色。
  4. 使用t-SNE降维:同样将数据降到二维,并绘制t-SNE降维后的散点图,以客户年龄为颜色。

  1. 解释方差比:计算PCA前两个主成分的解释方差比,展示降维后的信息保留程度。
  2. 绘制Pairplot图:使用Seaborn绘制PCA主成分的成对关系图,以客户年龄为颜色。

通过这个生活场景的案例,我们可以看到降维如何帮助我们减少数据的复杂性,同时保留主要信息,从而更好地理解和分析数据。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值