数据预处理是机器学习生命周期的十分重要的一个局部。特色工程又是数据预处理的一个重要组成, 最常见的特色工程有以下一些办法:

  • 编码
  • 缩放
  • 转换
  • 离散化
  • 拆散

等等

在本文中次要介绍特色缩放和特色编码的次要办法。

特色缩放

特色缩放是一种在固定范畴内对数据中存在的独立特色进行标准化的技术。有些机器学习模型是基于间隔矩阵的,例如:k - nearest - neighbors, SVM和Neural Network。对于这些模型来说,个性缩放是十分重要的,特地是当个性的范畴十分不同的时候。范畴较大的特色对间隔计算的影响较大。

标准化 Standarization

数据的标准化是将数据按比例缩放,使之落入一个小的特定区间,把数据转换为统⼀的规范。z-score标准化,即零-均值标准化(罕用办法)

  • 标准化(或z分数归一化)缩放后,特色就变为具备规范正态分布,具备= 0和= 1,其中均值,是平均值的标准差。
  • 通过标准化约68%的值介于-1和1之间。

from sklearn.preprocessing import StandardScalerscale = StandardScaler().fit(data)scaled_data = scale.transform(data)

规范化(归一化)Normalization

规范化是把数据变为(0,1)之间的小数。次要是为了不便数据处理,将数据映射到0~1范畴之内,能够使处理过程更加便捷、疾速。

规范化常常被用作机器学习数据筹备的一部分。规范化的指标是更改数据集中数值列的值,以应用通用的刻度,而不会扭曲值范畴的差别或失落信息

最常见的办法是最小-最大缩放,公式如下:

from sklearn.preprocessing import MinMaxScaler norm = MinMaxScaler().fit(data)transformed_data = norm.transform(data)

将特色的每个值除以最大值是规范化的另一种办法。它通常与稠密数据一起应用(例如图像)。

data_norm = data['variable']/np.max(data['variable'])

另一种规范化办法是RobustScalar,用于解决异样值问题。RobustScalar应用四分位范畴(IQR),因而它对异样值是持重的。

from sklearn.preprocessing import RobustScalerrob = RobustScaler().fit(data)data_norm = rob.transform(data)

标准化与规范化的区别

  • 在规范化中只更改数据的范畴,而在标准化中会更改数据分布的形态。
  • 规范化将这些值从新缩放到[0,1]的范畴内。在所有参数都须要具备雷同的正刻度的状况下是十分无效的。然而数据集中的异样值会失落。
  • 而在标准化中,数据被缩放到平均值()为0,标准差()为1(单位方差)。
  • 规范化在0到1之间缩放数据,所有数据都为正。标准化后的数据以零为核心的正负值。

如何抉择应用哪种缩放办法呢?

  • 当数据具备辨认量表并且应用的算法不会对数据的散布,比方K-Nearealt街坊和人工神经网络时,规范化是有用的。
  • 当数据是辨认量表时,并且应用的算法的确对具备高斯(正态)散布的数据进行假如,例如如线性回归,逻辑回归和线性判别分析标准化很有用。

尽管是这么说,然而应用那种缩放来解决数据还须要理论的验证,在实践中能够用原始数据拟合模型,而后进行标准化和规范化并进行比拟,那个体现好就是用那个,下图是须要应用特色缩放的算法列表:

特色编码

下面咱们曾经介绍了针对数值变量的特色缩放,本节将介绍针对分类变量的特色编码,在进入细节之前,让咱们理解一下特色编码的不同类型。

NOMINAL CATEGORICAL是咱们不须要关怀排列或程序的分类变量。例如性别,产品类别,国家地区,这些分类变量没有程序的概念。

ORDINAL CATEGORICAL是序数类别,这里的类别还蕴含了程序的信息,比方咱们考试的分数 ,优、良、中、差,优是最好的,差是最不好的。或者是咱们的教育水平,小学,中学,大学,硕士,也是依照顺序排列的。

理解了下面的类型后,咱们开始进行特色编码的介绍:

独热编码(ONE HOT)

咱们有一个蕴含3个分类变量的列,那么将在一个热编码中为一个分类变量创立每个热量编码3列。

独热编码又称一位无效编码。其办法是应用 N位 状态寄存器来对 N个状态 进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位无效。

哑变量陷阱

哑变量陷阱是指个别在引入虚构变量时要求如果有m个定性变量,在模型中引入m-1个虚构变量。否则如果引入m个虚构变量,就会导致模型解释变量间呈现齐全共线性的状况。

所以下面的例子中,咱们能够跳过任何列咱们这里抉择跳过第一列“red”

独热编码尽管简略,然而页有非常明显的毛病:

假如一列有100个分类变量。当初如果试着把分类变量转换成哑变量,咱们会失去99列。这将减少整个数据集的维度,从而导致维度咒骂。

所以基本上,如果一列中有很多分类变量咱们就不应该用这种办法。这里有一个简略的解决办法,只思考那些反复次数最多的类别,例如只思考前10个数量最多的类别,并只对这些类别利用编码。

from sklearn.preprocessing import OneHotEncoderohe = OneHotEncoder(drop='first',sparse=False,dtype=np.int32)counts = df['brand'].value_counts()df['brand'].nunique()threshold = 100repl = counts[counts <= threshold].indexpd.get_dummies(df['brand'].replace(repl, 'uncommon')).sample(5)

序列化标签编码(ORDINAL ENCODING)

这种编码方式仅用于序数类别,因为排名是依据类别的重要性来提供的。例如下表PHD被认为是最高的学位,所以给了它最高的标签。

from sklearn.preprocessing import OrdinalEncoderoe = OrdinalEncoder(categories=[['Poor','Average','Good'],['School','UG','PG']])oe.fit(X_train)X_train = oe.transform(X_train)

标签编码(LABEL ENCODING)

标签编码与序列化标签编码是雷同的,然而它编码后的数字并不蕴含序列的含意。

from sklearn.preprocessing import LabelEncoderle = LabelEncoder()le.fit(y_train)le.classes_

指标领导的序列化编码

这种办法依据输入计算每个分类变量的平均值,而后对它们进行排名。如下表所示

在序数类别中,咱们能够利用这项技术,因为咱们最初输入的后果蕴含了程序的信息。

平均数编码(MEAN ENCODING)

在这种办法将依据输入将类别转换为其平均值。在有很多特定列的分类变量的状况下,能够利用这种类型的办法。

例如,上面的表中,咱们依据特色的类别进行分组,而后求其平均值,并且应用所得的平均值来进行替换该类别

https://avoid.overfit.cn/post/04540fdca7cc4374864728cc4787ed14

作者:sumit sah