特征缩放
因为对于大多数的机器学习算法和优化算法来说,将特征值缩放到相同区间可以使得获取性能更好的模型。就梯度下降算法而言,例如有两个不同的特征,第一个特征的取值范围为1——10,第二个特征的取值范围为1——10000。在梯度下降算法中,代价函数为最小平方误差函数,所以在使用梯度下降算法的时候,算法会明显的偏向于第二个特征,因为它的取值范围更大。在比如,k近邻算法,它使用的是欧式距离,也会导致其偏向于第二个特征。对于决策树和随机森林以及XGboost算法而言,特征缩放对于它们没有什么影响。
常用的特征缩放算法有两种,归一化(normalization)和标准化(standardization)。归一化算法是通过特征的最大最小值将特征缩放到[0,1]区间范围
归一化(Normalization)
归一化是利用特征的最大最小值,为了方便数据处理,将特征的值缩放到[0,1]区间,对于每一列的特征使用min-max函数进行缩放,可以使处理过程更加便捷、快速,计算。
特征归一化的优势
提升收敛速度 :对于线性model来说,数据归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。
造成图像的等高线为类似椭圆形状,最优解的寻优过程图像如下:
两个特征区别相差特别大。所形成的等高线比较尖锐。当时用梯度下降法时,很可能要垂直等高线走,需要很多次迭代才能收敛。
而数据归一化之后,损失函数的表达式可以表示为:
其中变量的前面系数几乎一样,则图像的等高线为类似圆形形状,最优解的寻优过程图像如下:
- 提升模型精度:如果我们选用的距离度量为欧式距离,如果数据预先没有经过归一化,那么那些绝对值大的features在欧式距离计算的时候起了决定性作用。 从经验上说,归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。
特征归一化方法MinMaxScaler
from sklearn.preprocessing import MinMaxScaler x=[[10001,2],[16020,4],[12008,6],[13131,8]] min_max_scaler = MinMaxScaler() X_train_minmax = min_max_scaler.fit_transform(x)#归一化后的结果 X_train_minmax
MinMaxScaler的实现
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) X_scaled = X_std * (max - min) + min
这是向量化的表达方式,说明X是矩阵,其中
- X_std:将X归一化到[0,1]之间
- X.min(axis=0)表示列最小值
- max,min表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围
以下例说明计算过程(max=1,min=0)
S11=(10001-10001)/(16020-10001)=0 S21=(16020-10001)/(16020-10001)=1 S31=(12008-10001)/(16020-10001)=0.333444 S41=(13131-10001)/(16020-10001)=0.52002 S12=(2-2)/(8-2)=0 S22=(4-2)/(8-2)=0.33 S32=(6-2)/(8-2)=0.6667 S42=(8-2)/(8-2)=1
数据的标准化
和0-1标准化不同,Z-score标准化利用原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。同样是逐列进行操作,每一条数据都减去当前列的均值再除以当前列的标准差,在这种标准化操作下,如果原数据服从正态分布,处理之后的数据服从标准正态分布。Z-Score标准化计算公式如下:
我们也可通过如下方式对张量进行Z-Score标准化处理。
from sklearn.preprocessing import StandardScaler x=[[10001,2],[16020,4],[12008,6],[13131,8]] ss = StandardScaler() X_train = ss.fit_transform(x) X_train array([[-1.2817325 , -1.34164079], [ 1.48440157, -0.4472136 ], [-0.35938143, 0.4472136 ], [ 0.15671236, 1.34164079]])
和0-1标准化不同,Z-Score标准化并不会将数据放缩在0-1之间,而是均匀地分布在0的两侧
特征编码
我们拿到的数据通常比较脏乱,特征变量除了数值外可能还会包括带有各种非数字特殊符号等特征值,比如中文。但一般的机器学习模型一般都是处理数值型的特征值,因此需要将一些非数值的特殊特征值转为为数值,因为只有数字类型才能进行计算。因此,对于各种特殊的特征值,我们都需要对其进行相应的编码,也是量化的过程,这就要用到特征编码。
编码方法
- LabelEncoder :适合处理字符型数据或label类,一般先用此方法将字符型数据转换为数值型,然后再用以下两种方法编码;
- get_dummies :pandas 方法,处理DataFrame 数据更便捷
- OneHotEncoder :更普遍的编码方法
LabelEncoder🏖️
label-encoding就是用标签进行编码的意思,即我们给特征变量自定义数字标签,量化特征。
将离散的数值或字符串,转化为连续的数值型数据。n个类别就用0到n-1个数表示。没有扩维,多用于标签列的编码(如果用于特征的编码,那编码后还要用get_dummies或OneHotEncoder进行再编码,才能实现扩维)。
import pandas as pd Class=['大一','大二','大三','大四'] df = pd.DataFrame({'Class':Class}) classMap = {'大一':1,'大二':2,'大三':3,'大四':4} df['Class'] = df['Class'].map(classMap)
上面就将Class特征进行相应的编码。其实,Label encoding并没有任何限制,你也可以将Class定义为10,20,30,40,只不过1,2,3,4看起来比较方便。因此总结概括,Label encoding就是将原始特征值编码为自定义的数字标签完成量化编码过程。
get_dummies🏖️
pandas编码工具,直接将数据扩维
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
import pandas as pd data = {'Color': ['Red', 'Blue', 'Green', 'Red', 'Blue']} df = pd.DataFrame(data) print("原始 DataFrame:") print(df) df_dummies = pd.get_dummies(df) print("\n独热编码后的 DataFrame:") print(df_dummies) 原始 DataFrame: Color 0 Red 1 Blue 2 Green 3 Red 4 Blue 独热编码后的 DataFrame: Color_Blue Color_Green Color_Red 0 0 0 1 1 1 0 0 2 0 1 0 3 0 0 1 4 1 0 0
同时在pandas可以指定 columns参数,pd.get_dummies(df,columns=[“length”,“size”])指定被编码的列,返回被编码的列和不被编码的列
df_4 =pd.get_dummies(df,columns=["length","size"])
机器学习归一化特征编码(二)+https://developer.aliyun.com/article/1544816?spm=a2c6h.13148508.setting.18.22454f0e4mZEBN