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
本文最后一次更新为 天前,文章中的某些内容可能已过时!