线性回归--特征缩放

特征缩放是把数据 (各个特征) 变换到同一个尺度。两种常见的缩放方法:

标准化
归一化

标准化

标准化是对列中的每个值减去均值后再除以方差,即数据被转换为均值为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)。因此,在两个特征的净误差的增量相同情况下,正则化会删除那个系数大的小尺度特征,因为这将最大程度地减少正则化项。

这再次说明,正则化前要先做特征缩放。

关于使用正则化时特征缩放的重要性的一篇有用的文章。

这个文章中提到,特征缩放可以加快机器学习算法的收敛速度,这是扩展机器学习应用的一个重要的考虑因素。

用下面的小测验练习特征缩放。

执行以下步骤:

  1. 加载数据

    数据保存在 ‘data.csv’ 文件中。注意数据文件有一个标题行。
    把数据拆分为6个预测器变量(前6列)存储在X和1个结果变量(最后一列)存储在y。

  2. 特征缩放之标准化

    创建一个sklearn 的 StandardScaler 的实例,并把它赋值给变量scaler。
    用 .fit_transform() 方法计算预测器特征数组的缩放参数,它还返回标准化值中的预测变量。把这些标准化值存储在X_scaled。

  3. 用Lasso 正则化线性回归拟合数据

    创建一个sklearn的 Lasso 类的实例,并把它赋值给变量lasso_reg。你不需要设置任何参数值: 使用练习的默认值。
    用 Lasso 对象的 .fit() 方法去拟合回归模型。确保你是在上一步生成的标准化的数据上做拟合(X_scaled),不要用原始数据。

  4. 检验回归模型的系数

    用 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值