特徴量エンジニアリングってなんで必要なの?
データのスケール変換ってどんな種類があるの?
今回は、これらの疑問に答えるため特徴量エンジニアリングのスケール変換について解説していきます。
この記事を書いた人
特徴量エンジニアリングのスケール変換とは?
スケール変換とは、異なる尺度を持つデータを特定の尺度に統一することです。
異なる尺度を持つデータを、統一した基準で公平に評価したいに活用されます。
特に線形回帰や機械学習、ディープラーニングのモデル学習において、一部のデータに重みが偏らないようにスケール変換が活用されることが多いです。
必要性をより理解するため、1つ具体的な例を紹介します。
スケール変換の必要性
あなたはPython高校の教師で、期末試験で「国語、数学、英語」3科目のテストを実施しました。
その結果から生徒の成績を評価し、順位をつけようと考えています。
生徒名 | 国語(50点満点) | 数学(100点満点) | 英語(120点満点) | 合計 |
---|---|---|---|---|
スタン ダード | 10 | 60 | 90 | 160 |
ミン マックス | 25 | 40 | 120 | 185 |
ノーマ ライザー | 40 | 30 | 100 | 170 |
ロバスト スケーラ | 30 | 80 | 110 | 220 |
山田 太郎 | 50 | 100 | 20 | 170 |
テスト結果を集めましたが、なんと科目ごとに満点の尺度がバラバラ!
こんな状態で合計点で成績を評価してしまうと、英語の点数が全体の評価に強く影響してしまいます。
この事例の解決策として、「国語、数学、英語」を統一した1つの尺度に変換し正当な評価をすることを考えるでしょう。
これが、特徴量エンジニアリングのスケール変換の必要性です!
この前提を踏まえて、スケール変換を勉強していきましょう。
スケール変換の種類(4種類)
スケール変換は主に4種類あります。
ポイント
StandardScaler:平均0・分散1に変換
MinMaxScaler:0~1の間に収まるように変換
RobustScaler:四分位範囲に収まるように変換
Normalizer:ユークリッド長1になるように変換
いずれも特徴があり、目的によって使い分ける必要があります。
先ほどの成績の例では、偏差値に使われるStandardScalerを使うのが良いでしょう!
それでは、実際にPythonをつかってスケール変換の動きを確認していきましょう。
Pythonを使ったことがない方は、こちらも併せてご覧下さい。
>>知識0から1週間でPythonを習得する教材
利用データの準備
実際にスケール変換を適用するために利用するデータを準備しましょう。
今回は、先ほどの3教科の点数を利用します。
data = [[10,60,90],[25,40,120],[40,30,100],[30,80,110],[50,100,20]]
実際に各スケール変換を適用していきましょう。
StandardScaler(平均0,分散1に変換)
StandardScalerは、個々の特徴量の平均が0で分散が1になるように変換する手法です。
この方法は特徴量の最大値や最小値がある範囲に入ることを保証するものではないので、完全には外れ値の影響は排除できません。
外れ値がないかを事前に確認してから利用しましょう。
変換に利用するコードはこちらです。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(data)
scaler.transform(data)
#StandardScalerを戻す場合
#result = scaler.transform(data)
#scaler.inverse_transform(result)
教科ごとに、平均0・分散1に標準化されました!
上記の"各値×10+50"することで、学生時代に見慣れた偏差値を作ることができます。
MinMaxScaler(0~1の間に収まるように変換)
MinMaxScalerは、データの最小値を0、最大値を1としその範囲に収まるように変換する手法です。
変換に利用するコードはこちらです。
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(data)
scaler.transform(data)
#MinMaxScalerを戻す場合
#result = scaler.transform(data)
#scaler.inverse_transform(result)
教科ごとに、最大値が1最小値が0になるようスケール変換されました!
RobustScaler(四分位範囲に収まるように変換)
RobustScalerは、四分位範囲に収まるように変換する手法です。
RobustScalerの場合は、外れ値の影響を完全に排除することができます。
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
scaler.fit(data)
scaler.transform(data)
#RobustScalerを戻す場合
#result = scaler.transform(data)
#scaler.inverse_transform(result)
教科ごとに、四分位範囲に収まるようスケール変換されました!
Normalizer(ユークリッド長1になるように変換)
Normalizerは、個々のデータを特徴量ベクトルがユークリッド長1になるように変換します。
少しわかりやすい表現をすると、各データを半径1の円に投射します。
この変換はベクトルの大きさではなく、方向だけが問題になる場合に用いられます。
from sklearn.preprocessing import Normalizer
scaler = Normalizer()
scaler.fit(data)
scaler.transform(data)
教科ごとに、ユークリッド長1になるようスケール変換されました!
まとめ
今回は「特徴量エンジニアリングのスケール変換」について解説しました。
予測モデルの中には、データのスケール(範囲、外れ値)の違いに大きく影響を受け、精度を悪化させるものが多くあります。
機械学習やディープラーニングのモデルでは、そのモデルがデータスケールによる影響を受けるかを事前に確認し、必要に応じてスケール変換を施しましょう。
モデルのパラメータを調整するよりも、学習データをエンジニアリングする方が精度向上は期待できます。
実際に高度な予測モデルを、作ってみたい方はこちらの記事がオススメです。
-
コピペで動くLightGBM |Pythonで最強予測モデルの実装
Pythonで予測モデル作りたいけど、結局何を使うのがいいの? 高度なモデルって高スペックなPCじゃないと動かない? 今回はそんな疑問を解決する、LightGBMによる予測モデルの実装を解説していきま ...
それでは、また次の記事でお会いしましょう。
最近のコメント