特征缩放是把数据 (各个特征) 变换到同一个尺度。两种常见的缩放方法:
标准化
归一化
标准化
标准化是对列中的每个值减去均值后再除以方差,即数据被转换为均值为0,标准差为1。在Python中,假设在 df 中有一列叫 height。可以用以下语句,创建一个标准化的高度:
df["height_standard"] = (df["height"] - df["height"].mean()) / df["height"].std()
这将创建一个新的 “标准化” 列 。新列中的每一项都是原列值减去列均值后再除以列方差,新的标准化值可以解释为,原高度与平均高度之间相差多少个标准差。这是最常见的一种特征缩放技术。
归一化
第二种特征缩放方法是著名的归一化。归一化将数据压缩到0和1之间。仍使用上面标准化的例子,可以用下面的 Python 语句归一化数据:
df["height_normal"] = (df["height"] - df["height"].min()) / (df["height"].max() - df['height'].min())
什么时候做特征缩放?
在许多机器学习算法中,数据缩放对预测结果的影响很大。尤其是在以下两个具体案例中:
使用基于距离的特征做预测
加入正则化
基于距离的特征
在后面的课程中,你将看到一种基于距离点的常见监督学习技术支持向量机 (SVMs)。另一个用基于距离的方法是k近邻算法 (也称 k-nn)。当使用两种技术中的任何一种时,如果不对数据做特征缩放,可能会导致完全不同(也可能会误导)的预测结果。
因此,用这些基于距离的技术做预测时,必须先进行特征缩放。
正则化
当你开始在模型中使用正则化时,你将再次需要做特征缩放。特征的尺度对正则化线性回归技术中,正则化对特定系数的惩罚的影响很大。如果一个特征的取值区间是从0 到10,而另一个特征的取值区间是 0 到1000000, 不做特征缩放预处理,就应用正则化将不公平地惩罚小尺度的特征。相比大尺度特征,小尺度特征需要用更大的系数,才能对结果产生相同的影响(思考怎样让两个数 aaa 和 bbb 满足交换律,即 ab=baab = baab=ba)。因此,在两个特征的净误差的增量相同情况下,正则化会删除那个系数大的小尺度特征,因为这将最大程度地减少正则化项。
这再次说明,正则化前要先做特征缩放。
关于使用正则化时特征缩放的重要性的一篇有用的文章。
这个文章中提到,特征缩放可以加快机器学习算法的收敛速度,这是扩展机器学习应用的一个重要的考虑因素。
用下面的小测验练习特征缩放。
执行以下步骤:
-
加载数据
数据保存在 ‘data.csv’ 文件中。注意数据文件有一个标题行。
把数据拆分为6个预测器变量(前6列)存储在X和1个结果变量(最后一列)存储在y。 -
特征缩放之标准化
创建一个sklearn 的 StandardScaler 的实例,并把它赋值给变量scaler。
用 .fit_transform() 方法计算预测器特征数组的缩放参数,它还返回标准化值中的预测变量。把这些标准化值存储在X_scaled。 -
用Lasso 正则化线性回归拟合数据
创建一个sklearn的 Lasso 类的实例,并把它赋值给变量lasso_reg。你不需要设置任何参数值: 使用练习的默认值。
用 Lasso 对象的 .fit() 方法去拟合回归模型。确保你是在上一步生成的标准化的数据上做拟合(X_scaled),不要用原始数据。 -
检验回归模型的系数
用 Lasso 对象的 .coef_ 属性获取拟合回归模型的系数。
把回归模型的系数存储在变量reg_coef
点击测试按钮,运行练习后,将会打印出这些参数,请根据你的观察结果回答后面的问题。
# TODO: Add import statements
import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
# Assign the data to predictor and outcome variables
# TODO: Load the data
train_data = pd.read_csv('data.csv', header = None)
X = train_data.iloc[:,:-1]
y = train_data.iloc[:,-1]
# TODO: Create the standardization scaling object.
scaler = StandardScaler()
# TODO: Fit the standardization parameters and scale the data.
X_scaled = scaler.fit_transform(X)
# TODO: Create the linear regression model with lasso regularization.
lasso_reg = Lasso()
# TODO: Fit the model.
lasso_reg.fit(X_scaled, y)
# TODO: Retrieve and print out the coefficients from the regression model.
reg_coef = lasso_reg.coef_
print(reg_coef)
1.25664,2.04978,-6.23640,4.71926,-4.26931,0.20590,12.31798
-3.89012,-0.37511,6.14979,4.94585,-3.57844,0.00640,23.67628
5.09784,0.98120,-0.29939,5.85805,0.28297,-0.20626,-1.53459
0.39034,-3.06861,-5.63488,6.43941,0.39256,-0.07084,-24.68670
5.84727,-0.15922,11.41246,7.52165,1.69886,0.29022,17.54122
-2.86202,-0.84337,-1.08165,0.67115,-2.48911,0.52328,9.39789
-7.09328,-0.07233,6.76632,13.06072,0.12876,-0.01048,11.73565
-7.17614,0.62875,-2.89924,-5.21458,-2.70344,-0.22035,4.42482
8.67430,2.09933,-11.23591,-5.99532,-2.79770,-0.08710,-5.94615
-6.03324,-4.16724,2.42063,-3.61827,1.96815,0.17723,-13.11848
8.67485,1.48271,-1.31205,-1.81154,2.6