기계 학습 - 스케일링

特征缩放(Scale Features)

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

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

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

Car Model Volume Weight CO2
Toyota Aygo 1.0 790 99
Mitsubishi Space Star 1.2 1160 95
Skoda Citigo 1.0 929 95
Fiat 500 0.9 865 90
Mini Cooper 1.5 1140 105
VW Up! 1.0 929 105
Skoda Fabia 1.4 1109 90
Mercedes A-Class 1.5 1365 92
Ford Fiesta 1.5 1112 98
Audi A1 1.6 1150 99
Hyundai I20 1.1 980 99
Suzuki Swift 1.3 990 101
Ford Fiesta 1.0 1112 99
Honda Civic 1.6 1252 94
Hundai I30 1.6 1326 97
Opel Astra 1.6 1330 97
BMW 1 1.6 1365 99
Mazda 3 2.2 1280 104
Skoda Rapid 1.6 1119 104
Ford Focus 2.0 1328 105
Ford Mondeo 1.6 1584 94
Opel Insignia 2.0 1428 99
Mercedes C-Class 2.1 1365 99
Skoda Octavia 1.6 1415 99
Volvo S60 2.0 1415 99
Mercedes CLA 1.5 1465 102
Audi A4 2.0 1490 104
Audi A6 2.0 1725 114
Volvo V70 1.7 1523 109
BMW 5 2.0 1705 114
Mercedes E-Class 2.1 1605 115
Volvo XC70 2.0 1746 117
Ford B-Max 1.6 1235 104
BMW 2 1.6 1390 108
Opel Zafira 1.6 1405 109
Mercedes SLK 2.5 1395 120

디젤 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 열의 모든 값을 조정합니다:

import pandas
from sklearn import linear_model
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
df = pandas.read_csv("cars2.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 값 예측

다중 회귀이 장의 작업은 차량의 중량과 배기량만 알고 있을 때 차량이 배출하는二氧化碳를 예측하는 것입니다.

데이터 세트를 스케일링한 후 예측 값을 사용할 때는 스케일링 비율을 사용해야 합니다:

예제

2300 킬로그램 중량의 1.3 리터 엔진을 가진 차량의二氧化碳 배출량을 예측하십시오:

import pandas
from sklearn import linear_model
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
df = pandas.read_csv("cars2.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]

실행 예제