机器学习中的特征工程(非常详细,Python实现)
特征工程是机器学习工作流程中的关键步骤,是指使用专业知识和技术,将原始数据转化为能更好地代表潜在问题的特征,从而提升机器学习模型的性能。
一个良好的特征工程可以显著提高模型的预测能力,降低模型的复杂性,并增强模型的可解释性。
特征工程主要包括特征选择、特征转换、特征缩放三个方面。下面将详细介绍特征工程的具体实现方法,并通过实例展示如何在 Python 中进行特征工程操作。
一个好的特征选择策略不仅能显著提升模型的性能,还能在一定程度上降低模型的复杂度,从而减少模型过拟合的风险。
特征选择的基本策略可以概括为三种:过滤方法(Filter Methods)、包装方法(Wrapper Methods)和嵌入方法(Embedded Methods)。
过滤方法的优点是简单、计算效率高,缺点是没有考虑特征之间的交互作用。常见的过滤方法包括以下几种:
① 相关系数法:通过测量每个特征与目标变量之间的相关性,选择最相关的特征。相关系数法通常使用相关系数的统计指标,量化特征和目标之间的关系。以下是一些常见的相关系数。
通过上述相关系数,可以找出与目标变量最相关的特征,并使用这些特征进行机器学习模型的训练,这样可以提高模型的性能,减少计算时间,防止过拟合。
② 互信息法:利用互信息衡量每个特征与目标变量之间的互信息量,并以此选择特征。
③ 方差阈值法:删除低方差的特征。一般认为,方差小的特征包含的信息量也少。
最常使用的包装方法为递归特征消除法(Recursive Feature Elimination,RFE)。RFE 方法首先使用所有的特征训练一个模型,然后移除表现最差的特征,再用剩下的特征训练新的模型,如此递归,直到达到预设的特征数量。
嵌入方法通常基于一些优化算法,这些优化算法的部分优化过程自然地包含了特征选择。例如,Lasso 回归通过在优化函数中加入 L1 正则项,使一部分特征的系数变为 0,从而实现特征选择。
在 Lasso 回归中,L1 正则化是一种使回归系数变稀疏的策略。这种稀疏性使一些系数变为 0,从而实现特征的选择。具体来说,L1 正则化在损失函数中添加了一个与特征权重绝对值相等的惩罚项,这使许多权重的参数变为 0,从而产生了稀疏解。
以下将介绍一些常用的特征转换方法。
下面是对数转换的代码:
下面是幂次转换的代码:
下面是分位数转换的代码:
data['quantile_feature']=qt.fit_transform(data[['feature']]) 首先使用 fit_transform 函数,在 feature 列上学习转换,计算该特征的分位数;然后应用分位数转换,所得到的结果是一个新的特征,其值在 0~1 均匀分布;最后将这个结果存储在 quantile_feature 列中。
下面是独热编码的代码:
下面是均值编码的代码:
以上是一些常用的特征转换方法。需要注意,特征转换不一定总是有效的,转换的效果取决于数据的具体情况及使用的模型。因此,用户在进行特征转换时,需要根据具体情况,通过实验选择最适合的转换方法。
例如,对于距离度量的算法(如 k-近邻、支持向量机等算法),如果特征的尺度不一致,则可能导致模型过于关注尺度较大的特征,从而忽视尺度较小的特征。
此外,在神经网络中,如果特征的尺度差异过大,则可能会导致梯度消失或爆炸,影响模型的训练。因此,进行特征缩放是必不可少的步骤。
下面介绍常见的特征缩放方法。
最小最大缩放的使用方法如下:
鲁棒缩放的使用方法如下:
以上就是常用的特征缩放方法。请注意,在应用这些缩放方法时,需要确保在训练集上进行拟合,并将转换应用于训练集和测试集,以防止信息泄露。
一个良好的特征工程可以显著提高模型的预测能力,降低模型的复杂性,并增强模型的可解释性。
特征工程主要包括特征选择、特征转换、特征缩放三个方面。下面将详细介绍特征工程的具体实现方法,并通过实例展示如何在 Python 中进行特征工程操作。
特征选择
特征选择是特征工程的重要环节之一,其目的在于从原始特征集合中选取对目标变量预测最有价值的特征。一个好的特征选择策略不仅能显著提升模型的性能,还能在一定程度上降低模型的复杂度,从而减少模型过拟合的风险。
特征选择的基本策略可以概括为三种:过滤方法(Filter Methods)、包装方法(Wrapper Methods)和嵌入方法(Embedded Methods)。
1) 过滤方法
过滤方法是一种最基础的特征选择方法,其主要思想是通过一些统计测试方法,评估每个特征与目标变量之间的关系,选出得分最高或最低的特征。过滤方法的优点是简单、计算效率高,缺点是没有考虑特征之间的交互作用。常见的过滤方法包括以下几种:
① 相关系数法:通过测量每个特征与目标变量之间的相关性,选择最相关的特征。相关系数法通常使用相关系数的统计指标,量化特征和目标之间的关系。以下是一些常见的相关系数。
- Pearson相关系数:最常用的相关系数之一,衡量两个变量之间的线性关系,值介于 -1~1,1表示完全正相关,-1 表示完全负相关,0 表示没有线性关系。
- Spearman相关系数:测量两个变量之间的等级相关性,即两个变量之间的关系是否随着一个变量的增加而单调增加或减少,是介于 -1~1 的值。
- Kendall相关系数:一种衡量变量之间等级相关性的方法,基于数据的顺序关系,而不是数据的实际值。Kendall 相关系数在处理有大量重复值的数据时特别有用。
通过上述相关系数,可以找出与目标变量最相关的特征,并使用这些特征进行机器学习模型的训练,这样可以提高模型的性能,减少计算时间,防止过拟合。
② 互信息法:利用互信息衡量每个特征与目标变量之间的互信息量,并以此选择特征。
③ 方差阈值法:删除低方差的特征。一般认为,方差小的特征包含的信息量也少。
2) 包装方法
包装方法是一种将模型性能作为特征选择依据的方法。包装方法会训练一系列模型,并根据模型的性能指标选择特征,如准确率、AUC 等。最常使用的包装方法为递归特征消除法(Recursive Feature Elimination,RFE)。RFE 方法首先使用所有的特征训练一个模型,然后移除表现最差的特征,再用剩下的特征训练新的模型,如此递归,直到达到预设的特征数量。
3) 嵌入方法
在模型训练过程中,嵌入方法会自动进行特征选择。嵌入方法通常基于一些优化算法,这些优化算法的部分优化过程自然地包含了特征选择。例如,Lasso 回归通过在优化函数中加入 L1 正则项,使一部分特征的系数变为 0,从而实现特征选择。
在 Lasso 回归中,L1 正则化是一种使回归系数变稀疏的策略。这种稀疏性使一些系数变为 0,从而实现特征的选择。具体来说,L1 正则化在损失函数中添加了一个与特征权重绝对值相等的惩罚项,这使许多权重的参数变为 0,从而产生了稀疏解。
特征转换
特征转换是特征工程中的一个重要步骤,主要通过一些数学方法,将原始特征进行转换,从而得到具有一定意义的新特征。以下将介绍一些常用的特征转换方法。
1) 对数转换
对数转换是最常见的特征转换方法之一。对于某些分布(如长尾分布)的特征,使用对数转换后,可以使数据接近正态分布,有利于后续的模型拟合。下面是对数转换的代码:
import numpy as np data['log_feature'] = np.log(1 + data['feature'])在上述代码中,通过使用对数转换,处理 feature 列中可能存在的偏态分布,并将转换后的数据存储在新的 log_feature 列中。
2) 幂次转换
幂次转换是一种有效的、处理偏态分布数据的方法。通过对原始数据进行幂次运算,可以将偏态分布转换为正态分布或接近正态分布。下面是幂次转换的代码:
data['power_feature'] = data['feature'] ** 0.2
3) 分位数转换
分位数转换的目的是将一组数值型特征转换为服从均匀分布或正态分布的特征。这种转换方法对处理有明显边界、有偏态分布的特征十分有效。下面是分位数转换的代码:
from sklearn.preprocessing import QuantileTransformer qt = QuantileTransformer(n_quantiles=10, random_state=42) data['quantile_feature'] = qt.fit_transform(data[['feature']])在上述代码中,QuantileTransformer(n_quantiles=10, random_state=42) 创建了一个 QuantileTransformer 对象,n_quantiles=10 定义了在进行量化转换时,要使用的分位数的数量,random_state=42 设置了随机种子,以确保结果的可重复性。
data['quantile_feature']=qt.fit_transform(data[['feature']]) 首先使用 fit_transform 函数,在 feature 列上学习转换,计算该特征的分位数;然后应用分位数转换,所得到的结果是一个新的特征,其值在 0~1 均匀分布;最后将这个结果存储在 quantile_feature 列中。
4) 独热编码
独热编码(One-Hot Encoding)主要用于处理类别型(Categorical)数据。通过独热编码,可以将一个类别型特征扩展为多个二元特征,每一个二元特征代表一种类别。当某个样本的类别为该类别时,该特征值为 1,否则为 0。下面是独热编码的代码:
data = pd.get_dummies(data, columns=['category_feature'])
5) 均值编码
均值编码(Mean Encoding)也称作目标编码(Target Encoding),这种方法主要是针对高基数离散特征进行的编码方式。对于某一个特征,均值编码计算每一个类别的目标变量均值,并用此均值代表这个类别。下面是均值编码的代码:
mean_encoding = data.groupby('category_feature')['target'].mean() data['mean_encoding_feature'] = data['category_feature'].map(mean_encoding)上述代码通过均值编码,将分类特征 category_feature 转换为新的数值特征 mean_encoding_feature。
以上是一些常用的特征转换方法。需要注意,特征转换不一定总是有效的,转换的效果取决于数据的具体情况及使用的模型。因此,用户在进行特征转换时,需要根据具体情况,通过实验选择最适合的转换方法。
特征缩放
特征缩放是一种将所有特征值规范化到同一尺度范围内的技术。在很多机器学习算法中,特征的尺度和分布对模型的性能有很大影响。例如,对于距离度量的算法(如 k-近邻、支持向量机等算法),如果特征的尺度不一致,则可能导致模型过于关注尺度较大的特征,从而忽视尺度较小的特征。
此外,在神经网络中,如果特征的尺度差异过大,则可能会导致梯度消失或爆炸,影响模型的训练。因此,进行特征缩放是必不可少的步骤。
下面介绍常见的特征缩放方法。
1) 最小最大缩放
最小最大缩放(Min-Max Scaling)是一种简单、常见的特征缩放方法,该方法将原始数据线性转换、映射到 [0,1] 范围内。最小最大缩放的使用方法如下:
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() data['scaled_feature'] = scaler.fit_transform(data[['feature']])上述代码对 feature 列进行最小最大缩放,并将结果保存在 scaled_feature 列中。
2) 标准化
标准化(Standardization)是另一种常见的特征缩放方法,该方法将数据转换为均值为 0、标准差为 1 的分布。标准化的使用方法如下:from sklearn.preprocessing import StandardScaler scaler = StandardScaler() data['standardized_feature'] = scaler.fit_transform(data[['feature']])上述代码对 feature 列进行标准化缩放,并将结果保存在 standardized_feature 列中。
3) 鲁棒缩放
相对于最小最大缩放和标准化,鲁棒缩放(Robust Scaling)是一种更为鲁棒的方法,该方法对异常值不敏感。鲁棒缩放基于中位数和四分位数,将数据缩放到中位数为 0、IQR 为 1 的范围内。鲁棒缩放的使用方法如下:
from sklearn.preprocessing import RobustScaler scaler = RobustScaler() data['robust_scaled_feature'] = scaler.fit_transform(data[['feature']])上述代码对 feature 列进行鲁棒缩放,并将结果保存在 robust_scaled_feature 列中。
以上就是常用的特征缩放方法。请注意,在应用这些缩放方法时,需要确保在训练集上进行拟合,并将转换应用于训练集和测试集,以防止信息泄露。