Python 机器学习 - 缩放

特征缩放(Scale Features)

当您的数据拥有不同的值,甚至使用不同的度量单位时,可能很难比较它们。与米相比,公斤是多少?或者海拔比较时间呢?

这个问题的答案是缩放。我们可以将数据缩放为易于比较的新值。

请看下表,它与我们在多元回归一章中使用的数据集相同,但是这次,Volume 列包含的单位是升,而不是 ccm(1.0 而不是 1000)。

车辆车型体积重量CO2排量
ToyotaAygo1.079099
MitsubishiSpace Star1.2116095
SkodaCitigo1.092995
Fiat5000.986590
MiniCooper1.51140105
VWUp!1.0929105
SkodaFabia1.4110990
MercedesA-Class1.5136592
FordFiesta1.5111298
AudiA11.6115099
HyundaiI201.198099
SuzukiSwift1.3990101
FordFiesta1.0111299
HondaCivic1.6125294
HundaiI301.6132697
OpelAstra1.6133097
BMW11.6136599
Mazda32.21280104
SkodaRapid1.61119104
FordFocus2.01328105
FordMondeo1.6158494
OpelInsignia2.0142899
MercedesC-Class2.1136599
SkodaOctavia1.6141599
VolvoS602.0141599
MercedesCLA1.51465102
AudiA42.01490104
AudiA62.01725114
VolvoV701.71523109
BMW52.01705114
MercedesE-Class2.11605115
VolvoXC702.01746117
FordB-Max1.61235104
BMW21.61390108
OpelZafira1.61405109
MercedesSLK2.51395120

很难将排量 1.0 与车重 790 进行比较,但是如果将它们都缩放为可比较的值,我们可以很容易地看到一个值与另一个值相比有多少。

缩放数据有多种方法,在本教程中,我们将使用一种称为标准化(standardization)的方法。标准化方法使用以下公式:

z = (x - u) / s

其中 z 是新值,x 是原始值,u 是平均值,s 是标准差。

如果从上述数据集中获取 weight 列,则第一个值为 790,缩放后的值为:

(790 - 1292.23) / 238.74 = -2.1

如果从上面的数据集中获取 volume 列,则第一个值为 1.0,缩放后的值为:

(1.0 - 1.61) / 0.38 = -1.59

现在,您可以将 -2.1 与 -1.59 相比较,而不是比较 790 与 1.0。

您不必手动执行此操作,Python sklearn 模块有一个名为 StandardScaler() 的方法,该方法返回带有转换数据集方法的 Scaler 对象。

缩放 Weight 和 Volume 列中的所有值:

  1. import pandas
  2. from sklearn import linear_model
  3. from sklearn.preprocessing import StandardScaler
  4. scale = StandardScaler()
  5. df = pandas.read_csv("cars2.csv")
  6. X = df[['Weight', 'Volume']]
  7. scaledX = scale.fit_transform(X)
  8. print(scaledX)

结果:请注意,前两个值是 -2.1 和 -1.59,与我们的计算相对应:

  1. [[-2.10389253 -1.59336644]
  2. [-0.55407235 -1.07190106]
  3. [-1.52166278 -1.59336644]
  4. [-1.78973979 -1.85409913]
  5. [-0.63784641 -0.28970299]
  6. [-1.52166278 -1.59336644]
  7. [-0.76769621 -0.55043568]
  8. [ 0.3046118 -0.28970299]
  9. [-0.7551301 -0.28970299]
  10. [-0.59595938 -0.0289703 ]
  11. [-1.30803892 -1.33263375]
  12. [-1.26615189 -0.81116837]
  13. [-0.7551301 -1.59336644]
  14. [-0.16871166 -0.0289703 ]
  15. [ 0.14125238 -0.0289703 ]
  16. [ 0.15800719 -0.0289703 ]
  17. [ 0.3046118 -0.0289703 ]
  18. [-0.05142797 1.53542584]
  19. [-0.72580918 -0.0289703 ]
  20. [ 0.14962979 1.01396046]
  21. [ 1.2219378 -0.0289703 ]
  22. [ 0.5685001 1.01396046]
  23. [ 0.3046118 1.27469315]
  24. [ 0.51404696 -0.0289703 ]
  25. [ 0.51404696 1.01396046]
  26. [ 0.72348212 -0.28970299]
  27. [ 0.8281997 1.01396046]
  28. [ 1.81254495 1.01396046]
  29. [ 0.96642691 -0.0289703 ]
  30. [ 1.72877089 1.01396046]
  31. [ 1.30990057 1.27469315]
  32. [ 1.90050772 1.01396046]
  33. [-0.23991961 -0.0289703 ]
  34. [ 0.40932938 -0.0289703 ]
  35. [ 0.47215993 -0.0289703 ]
  36. [ 0.4302729 2.31762392]]

预测 CO2 值

多元回归

一章的任务是在仅知道汽车的重量和排量的情况下预测其排放的二氧化碳。

缩放数据集后,在预测值时必须使用缩放比例:

预测一辆重 2300 公斤的 1.3 升汽车的二氧化碳排放量:

  1. import pandas
  2. from sklearn import linear_model
  3. from sklearn.preprocessing import StandardScaler
  4. scale = StandardScaler()
  5. df = pandas.read_csv("cars2.csv")
  6. X = df[['Weight', 'Volume']]
  7. y = df['CO2']
  8. scaledX = scale.fit_transform(X)
  9. regr = linear_model.LinearRegression()
  10. regr.fit(scaledX, y)
  11. scaled = scale.transform([[2300, 1.3]])
  12. predictedCO2 = regr.predict([scaled[0]])
  13. print(predictedCO2)

结果:

  1. [107.2087328]

分类导航