機械学習-スケール
スケール機能
データの値が異なり、測定単位が異なる場合でも、それらを比較するのは難しい場合があります。メートルと比較してキログラムとは何ですか?または時間と比較した高度?
この問題の答えはスケーリングです。データを、比較しやすい新しい値にスケーリングできます。
下の表を見てください。これは 重回帰の章で使用したものと同じデータセットですが、今回はボリューム列にcm 3ではなくリットル(1000ではなく1.0)の値が含まれています。
このファイルはテストのみを目的としており、 cars2.csvからダウンロードできます。
車両 | モデル | 音量 | 重さ | CO2 |
トヨタ | アイゴ | 1.0 | 790 | 99 |
三菱 | スペーススター | 1.2 | 1160 | 95 |
シュコダ | シティゴ | 1.0 | 929 | 95 |
フィアット | 500 | 0.9 | 865 | 90 |
ミニ | クーパー | 1.5 | 1140 | 105 |
VW | 上! | 1.0 | 929 | 105 |
シュコダ | ファビア | 1.4 | 1109 | 90 |
メルセデス | Aクラス | 1.5 | 1365 | 92 |
フォード | フィエスタ | 1.5 | 1112 | 98 |
アウディ | A1 | 1.6 | 1150 | 99 |
ヒュンダイ | I20 | 1.1 | 980 | 99 |
鈴木 | 迅速 | 1.3 | 990 | 101 |
フォード | フィエスタ | 1.0 | 1112 | 99 |
ホンダ | シビック | 1.6 | 1252 | 94 |
ヒュンダイ | I30 | 1.6 | 1326 | 97 |
オペル | アストラ | 1.6 | 1330 | 97 |
BMW | 1 | 1.6 | 1365 | 99 |
マツダ | 3 | 2.2 | 1280 | 104 |
シュコダ | 急速 | 1.6 | 1119 | 104 |
フォード | 集中 | 2.0 | 1328 | 105 |
フォード | モンデオ | 1.6 | 1584 | 94 |
オペル | 記章 | 2.0 | 1428 | 99 |
メルセデス | Cクラス | 2.1 | 1365 | 99 |
シュコダ | オクタビア | 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 |
BMW | 5 | 2.0 | 1705 | 114 |
メルセデス | Eクラス | 2.1 | 1605 | 115 |
ボルボ | XC70 | 2.0 | 1746年 | 117 |
フォード | B-Max | 1.6 | 1235 | 104 |
BMW | 2 | 1.6 | 1390 | 108 |
オペル | ザフィーラ | 1.6 | 1405 | 109 |
メルセデス | SLK | 2.5 | 1395 | 120 |
ボリューム1.0とウェイト790を比較するのは難しい場合がありますが、両方を比較可能な値にスケーリングすると、一方の値がもう一方の値とどの程度比較されているかを簡単に確認できます。
データをスケーリングする方法はいくつかありますが、このチュートリアルでは、標準化と呼ばれる方法を使用します。
標準化方法では、次の式を使用します。
z = (x - u) / s
ここz
で、は新しい値、
x
は元の値、
u
は平均、s
は標準偏差です。
上記のデータセットから重み列を取得すると、最初の値は790になり、スケーリングされた値は次のようになります。
(790 - ) / = -2.1
上記のデータセットからボリューム列を取得する場合、最初の値は1.0であり、スケーリングされた値は次のようになります。
(1.0 - ) / = -1.59
これで、790と1.0を比較する代わりに、-2.1と-1.59を比較できます。
これを手動で行う必要はありません。Pythonsklearnモジュールには、StandardScaler()
データセットを変換するためのメソッドを持つScalerオブジェクトを返すというメソッドがあります。
例
[重量]列と[体積]列のすべての値をスケーリングします。
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つの値は-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排出量を予測することでした。
データセットをスケーリングする場合、値を予測するときにスケールを使用する必要があります。
例
重量2300キログラムの1.3リッター車からのCO2排出量を予測します。
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]