Python数据分析

主题4:特征工程

特征工程是数据科学中至关重要的一步,目的是从原始数据中提取有意义的特征,以提高模型的表现和预测能力。好的特征能够使模型更容易学习到数据中的规律,而不好的特征则会增加模型的复杂性并可能导致过拟合。

特征工程的过程通常包括:特征选择、特征提取、特征转换和特征构建等。


1. 特征选择

特征选择是从现有的特征中选择最相关、最重要的特征来训练模型,去除冗余的、不相关的特征。这有助于减少计算复杂性,提高模型的泛化能力。

1.1 相关性分析

相关性分析是特征选择中最常用的一种方法,特别适用于数值型特征。可以计算各个特征之间的相关性矩阵,去除相关性较高的特征,避免多重共线性问题。

方法 功能 参数 返回值
corr() 计算数值型特征之间的相关性矩阵 method='pearson'(默认为皮尔逊相关) 相关性矩阵

示例:

correlation_matrix = df.corr()  # 计算相关性矩阵
print(correlation_matrix)
1.2 卡方检验

卡方检验是用于选择分类变量的特征的常见方法,特别适用于类别型数据。卡方检验衡量的是分类变量与目标变量之间的独立性,能够帮助我们找到和目标变量关系最紧密的特征。

方法 功能 参数 返回值
chi2() 计算卡方检验统计量及p值 df, target(输入特征和目标变量) 卡方统计量和p值

示例:

from sklearn.feature_selection import chi2
from sklearn.preprocessing import LabelEncoder

# 对分类变量进行编码
le = LabelEncoder()
target = le.fit_transform(df['target_column'])

# 进行卡方检验
chi2_stat, p_val = chi2(df.drop('target_column', axis=1), target)
1.3 L1 正则化(Lasso)

Lasso(L1 正则化)回归方法通过加上 L1 正则化项来约束模型,能够实现特征选择。通过调整正则化参数,Lasso 可以将一些不重要的特征的系数压缩为零,从而自动进行特征选择。

方法 功能 参数 返回值
Lasso() 使用 L1 正则化进行特征选择 alpha=1.0(正则化参数) 模型系数

示例:

from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.01)
lasso.fit(X_train, y_train)
print(lasso.coef_)  # 输出选择的特征系数

2. 特征提取

特征提取是将原始数据通过某些算法或方法转化为新的特征,从而帮助模型更好地理解数据。常见的特征提取方法有主成分分析(PCA)、线性判别分析(LDA)等。

2.1 主成分分析(PCA)

PCA 是一种常用的降维技术,通过线性变换将高维数据映射到低维空间,提取出数据中最重要的主成分。PCA 可以帮助我们去除冗余信息,降低特征空间的维度,从而加速训练过程。

方法 功能 参数 返回值
PCA() 使用主成分分析降维,提取主要特征 n_components=2(目标维度) 转换后的数据

示例:

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(df)
2.2 线性判别分析(LDA)

LDA 是一种监督学习的降维方法,旨在通过寻找最优的特征组合来最大化类间的分离。与 PCA 不同,LDA 考虑到了数据的标签信息,因此更适用于分类问题。

方法 功能 参数 返回值
LDA() 使用线性判别分析降维,提取最佳分类特征 n_components=2(目标维度) 转换后的数据

示例:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
lda_components = lda.fit_transform(X_train, y_train)

3. 特征转换

特征转换是通过对特征数据的数学处理来增强数据的表现能力。例如,可以对数值特征进行标准化、归一化,或者对类别特征进行编码。

3.1 标准化

标准化是将数据缩放到均值为 0,标准差为 1 的分布,通常用于对数值型特征进行处理。标准化有助于提升某些模型(如支持向量机、k-近邻算法)的性能。

方法 功能 参数 返回值
StandardScaler() 对特征进行标准化处理 with_mean=True(是否去均值) 标准化后的数据

示例:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df[['A', 'B']])
3.2 归一化

归一化是将数据缩放到指定的范围(通常是 0 到 1),适用于那些不具备正态分布的数据。归一化对于需要计算距离的模型(如 k-近邻算法)非常重要。

方法 功能 参数 返回值
MinMaxScaler() 将特征缩放到指定的最小值和最大值之间 feature_range=(0, 1) 归一化后的数据

示例:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
X_normalized = scaler.fit_transform(df[['A', 'B']])
3.3 类别特征编码

对于类别变量,机器学习模型通常不能直接处理,需要将类别特征转化为数值型特征。常见的编码方法有独热编码(One-Hot Encoding)和标签编码(Label Encoding)。

方法 功能 参数 返回值
get_dummies() 对类别变量进行独热编码 drop_first=True(是否删除首列) 编码后的数据
LabelEncoder() 对类别变量进行标签编码 编码后的数据

示例:

# 独热编码
df_encoded = pd.get_dummies(df['category_column'])

# 标签编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['category_column'] = le.fit_transform(df['category_column'])

4. 特征构建

特征构建是根据现有数据创建新的、更有表现力的特征。这一步可以提高模型的表现,并为模型提供更多的信息。

4.1 数学运算构建新特征

通过对已有的数值型特征进行加、减、乘、除等运算,创造出新的特征。例如,计算两个特征的差值、比例等。

方法 功能 参数 返回值
df['new_feature'] = df['A'] - df['B'] 通过加减法构建新特征 新构建的特征

示例:

df['new_feature'] = df['A'] / df['B']  # 构建一个新的比例特征
4.2 时间特征构建

你说得对,表格中的内容应该有些调整。提取日期和时间特征时,dt 属性用于访问日期和时间相关的信息,但它的使用方式应该更具体。下面是修改后的正确表格:

时间特征构建

方法 功能 参数 返回值
df['year'] = pd.to_datetime(df['date']).dt.year 从时间戳中提取年份 dt.year 提取的年份特征
df['month'] = pd.to_datetime(df['date']).dt.month 从时间戳中提取月份 dt.month 提取的月份特征
df['day'] = pd.to_datetime(df['date']).dt.day 从时间戳中提取日期 dt.day 提取的日期特征
df['hour'] = pd.to_datetime(df['date']).dt.hour 从时间戳中提取小时 dt.hour 提取的小时特征
df['minute'] = pd.to_datetime(df['date']).dt.minute 从时间戳中提取分钟 dt.minute 提取的分钟特征
df['weekday'] = pd.to_datetime(df['date']).dt.weekday 从时间戳中提取星期几 (0-6, 0表示周一) dt.weekday 提取的星期几特征
df['quarter'] = pd.to_datetime(df['date']).dt.quarter 从时间戳中提取季度 dt.quarter 提取的季度特征

说明:

  • pd.to_datetime(df['date']):将 date 列转换为日期时间格式(如果已经是日期时间格式,可以省略这一步)。
  • dt.year:提取日期中的年份。
  • dt.month:提取日期中的月份。
  • dt.day:提取日期中的天数。
  • dt.hour:提取小时。
  • dt.minute:提取分钟。
  • dt.weekday:提取星期几(0为周一,6为周日)。
  • dt.quarter:提取季度(1-4)。

这些时间特征可以帮助模型理解周期性的信息,如季节性变化、周末效应等,从而提升预测能力。

示例:

df['year'] = pd.to_datetime(df['date']).dt.year  # 提取年份
df['month'] = pd.to_datetime(df['date']).dt.month  # 提取月份

通过对特征进行选择、提取、转换和构建,我们可以为模型提供更有效、更有信息量的特征,帮助模型更好地学习数据中的模式,从而提高预测效果。特征工程的质量直接影响着机器学习模型的表现,因此在实际应用中需要仔细进行每个步骤的选择和调整。

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 Python特征工程 》

本文链接:http://0.0.0.0:3015/ai/Python%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B.html

本文最后一次更新为 天前,文章中的某些内容可能已过时!