机器学习的特征预处理
在这篇中,我将介绍针对各种类型的特征和各种类型的机器学习模型进行特征预处理的基本方法。现在,让我们将所有机器学习模型划分为基于树和非树的模型。例如,决策树分类器尝试为每个特征找到最有用的分割,并且它不会改变其行为及其预测,这些是基于树的模型。另一方面,存在非基于树的模型,其依赖于这些变换,例如最近邻,线性模型和神经网络。我们还有不同类型的特征,即数字特征,分类特征和日期时间特征。首先,让我们从数字特征开始。
数字特征
用于数字特征的预处理技术是:
缩放:
在非基于树的模型的情况下,几乎总是需要重新缩放数据。对于数值变量,通常会对数据进行归一化或标准化。这些术语是什么意思?
1.归一化:它意味着通过将每个要素缩放到给定范围来转换要素。转型由下式给出:
X_norm =(X - X.min)/(X.max - X.min)
Scikit-learn提供了sklearn.preprocessing.MinMaxScaler 函数。
2. Stardardization:数据集的标准化是许多机器学习估计器的一个常见要求:如果单个特征看起来不像标准正态分布数据(例如均值为0的高斯分布和单位方差),它们的性能可能会很差。表示数据中心在0左右,相对于标准差进行缩放:
X_stand =(X-μ)/σ
Scikit-learn提供了sklearn.preprocessing.StandardScaler函数。
使用异常值缩放数据:如果您的数据包含许多异常值,则使用数据的均值和方差进行缩放可能不会很好。在这些情况下,您可以使用robust_scale和RobustScaler替代插入替换。他们对数据的中心和范围使用更可靠的估计。
秩(Rank):
在这里,数据值被转换为一个索引数组。如果我们没有时间手动处理异常值,线性模型、KNN和神经网络可以从这种转换中获益。
Scipy函数 scipy.stats.rankdata用于此目的。
基于对数变换:这通常有助于非树木,特别是神经网络模型。它就是简单的对数变换。它可以用numpy log函数来实现
np.log(1+x)
升幂:它可以用来提取数据的平方根。这可能是有用的,因为它使太大的值更接近特征的平均值。与此同时,接近于零的值变得更容易区分。尽管很简单,但是这种转换可以显著改善神经网络的结果。
为此,我们讨论了数字特征预处理,模型选择如何影响特征预处理,以及最常用的预处理方法是什么。现在让我们转到分类和顺序特征。
分类和序数特征
现在,问题出现了 - 什么是分类和序数特征?分类特征是具有两个或更多类别的特征,但对类别没有内在排序。例如,性别(男性和女性)和头发颜色(金发,棕色,黑发,红色等)。虽然序数特征类似于分类变量,但两者之间的差异在于变量有明确的排序。例如,假设您有一个变量,经济状态,有三个类别(低,中,高)或教育经验(具有小学毕业生,高中毕业生,大学等)。用于这些函数的预处理方法是
标签编码:
这可以通过几种方式完成。一种是按字母顺序或排序顺序编码。这可以通过使用scikit-learn函数来完成另一种方法是使用pandas函数按照它们的外观顺序对类别进行编码 - 。它用于基于树的模型。sklearn.preprocessing.LabelEncoder. pandas.factorize
频率编码:
顾名思义它是根据特征的出现频率进行编码。这适用于基于树的模型。
One hot编码:
在此方法中,为每个类别创建一个新列,然后将其放在适当的位置,其他所有列都将为零。这适用于线性方法,kNN或神经网络。它有一个好处,即这里的值是缩放的,因为最小值为0,最大值为1. 函数可用sklearn.preprocessing.OneHotEncoder
接下来转到日期时间函数。
日期时间函数
日期和时间是机器学习的一个重要特征。这是周期性的,可以是星期几、月、季、年、分钟和小时。分析特定时间段或计算两个时间戳之间的差异可能很有用。Python有一个内置模块datetime,可以轻松处理日期和时间功能。