機器學習 - 縮放
縮放特徵
當您的資料具有不同的值,甚至不同的測量單位時,很難進行比較。公斤與米相比如何?或者海拔與時間相比?
解決這個問題的辦法就是縮放。我們可以將資料縮放到更容易比較的新值。
請看下面的表格,它與我們在多元迴歸章節中使用的相同資料集,但這次volume列中的值是以升而不是cm3(1.0 而不是 1000)。
汽車 | Model | 音量 | Weight | CO2 |
豐田 | Aygo | 1.0 | 790 | 99 |
Mitsubishi | Space Star | 1.2 | 1160 | 95 |
Skoda | Citigo | 1.0 | 929 | 95 |
Fiat | 500 | 0.9 | 865 | 90 |
迷你 | Cooper | 1.5 | 1140 | 105 |
VW | Up! | 1.0 | 929 | 105 |
Skoda | Fabia | 1.4 | 1109 | 90 |
賓士 | A-Class | 1.5 | 1365 | 92 |
福特 | Fiesta | 1.5 | 1112 | 98 |
奧迪 | A1 | 1.6 | 1150 | 99 |
Hyundai | I20 | 1.1 | 980 | 99 |
Suzuki | Swift | 1.3 | 990 | 101 |
福特 | Fiesta | 1.0 | 1112 | 99 |
本田 | Civic | 1.6 | 1252 | 94 |
Hundai | I30 | 1.6 | 1326 | 97 |
Opel | Astra | 1.6 | 1330 | 97 |
寶馬 | 1 | 1.6 | 1365 | 99 |
Mazda | 3 | 2.2 | 1280 | 104 |
Skoda | Rapid | 1.6 | 1119 | 104 |
福特 | Focus | 2.0 | 1328 | 105 |
福特 | Mondeo | 1.6 | 1584 | 94 |
Opel | Insignia | 2.0 | 1428 | 99 |
賓士 | C-Class | 2.1 | 1365 | 99 |
Skoda | Octavia | 1.6 | 1415 | 99 |
沃爾沃 | S60 | 2.0 | 1415 | 99 |
賓士 | CLA | 1.5 | 1465 | 102 |
奧迪 | A4 | 2.0 | 1490 | 104 |
奧迪 | A6 | 2.0 | 1725 | 114 |
沃爾沃 | V70 | 1.6 | 1523 | 109 |
寶馬 | 5 | 2.0 | 1705 | 114 |
賓士 | E-Class | 2.1 | 1605 | 115 |
沃爾沃 | XC70 | 2.0 | 1746 | 117 |
福特 | B-Max | 1.6 | 1235 | 104 |
寶馬 | 2 | 1.6 | 1390 | 108 |
Opel | Zafira | 1.6 | 1405 | 109 |
賓士 | SLK | 2.5 | 1395 | 120 |
很難比較體積 1.0 和重量 790,但如果我們都將它們縮放到可比較的值,我們就可以輕鬆地看到一個值與另一個值相比的量。
有不同的縮放資料的方法,在本教程中我們將使用一種稱為標準化的方法。
標準化方法使用此公式
z = (x - u) / s
其中 z
是新值,x
是原始值,u
是平均值,s
是標準差。
如果您從上面的資料集中獲取weight列,第一個值是 790,縮放後的值將是
(790 - 1292.23) / 238.74 = -2.1
如果您從上面的資料集中獲取volume列,第一個值是 1.0,縮放後的值將是
現在您可以比較 -2.1 和 -1.59,而不是比較 790 和 1.0。
您不必手動執行此操作,Python sklearn 模組有一個名為 StandardScaler()
的方法,該方法返回一個具有轉換資料集方法的 Scaler 物件。
示例
縮放 Weight 和 Volume 列中的所有值
import pandas
from sklearn import linear_model
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
df = pandas.read_csv("data.csv")
X = df[['Weight', 'Volume']]
scaledX = scale.fit_transform(X)
print(scaledX)
結果
請注意,前兩個值是 -2.1 和 -1.59,這與我們的計算相符
[[-2.10389253 -1.59336644] [-0.55407235 -1.07190106] [-1.52166278 -1.59336644] [-1.78973979 -1.85409913] [-0.63784641 -0.28970299] [-1.52166278 -1.59336644] [-0.76769621 -0.55043568] [ 0.3046118 -0.28970299] [-0.7551301 -0.28970299] [-0.59595938 -0.0289703 ] [-1.30803892 -1.33263375] [-1.26615189 -0.81116837] [-0.7551301 -1.59336644] [-0.16871166 -0.0289703 ] [ 0.14125238 -0.0289703 ] [ 0.15800719 -0.0289703 ] [ 0.3046118 -0.0289703 ] [-0.05142797 1.53542584] [-0.72580918 -0.0289703 ] [ 0.14962979 1.01396046] [ 1.2219378 -0.0289703 ] [ 0.5685001 1.01396046] [ 0.3046118 1.27469315] [ 0.51404696 -0.0289703 ] [ 0.51404696 1.01396046] [ 0.72348212 -0.28970299] [ 0.8281997 1.01396046] [ 1.81254495 1.01396046] [ 0.96642691 -0.0289703 ] [ 1.72877089 1.01396046] [ 1.30990057 1.27469315] [ 1.90050772 1.01396046] [-0.23991961 -0.0289703 ] [ 0.40932938 -0.0289703 ] [ 0.47215993 -0.0289703 ] [ 0.4302729 2.31762392]]
預測 CO2 值
在多元迴歸章節中的任務是預測汽車的 CO2 排放量,而您只知道其重量和體積。
當資料集被縮放時,您必須在使用值進行預測時使用縮放值
示例
預測一輛 1.3 升、重 2300 公斤的汽車的 CO2 排放量
import pandas
from sklearn import linear_model
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
df = pandas.read_csv("data.csv")
X = df[['Weight', 'Volume']]
y = df['CO2']
scaledX = scale.fit_transform(X)
regr = linear_model.LinearRegression()
regr.fit(scaledX, y)
scaled = scale.transform([[2300, 1.3]])
predictedCO2 = regr.predict([scaled[0]])
print(predictedCO2)
結果
[107.2087328]