1. 序章

このチュートリアルでは、さまざまな特徴スケーリング方法が線形回帰の予測力にどのように影響するかを調査します。

最初に、広く採用されている2つの機能スケーリング方法について学習します。 次に、これらの機能スケーリング手法をおもちゃのデータセットに適用します。 最後に、結果を比較対照します。

2. 機能のスケーリング

機械学習では、特徴スケーリングとは、特徴値を同じ範囲に配置することを指します。スケーリングは、k最近傍のような観測間の距離を考慮するアルゴリズムにとって非常に重要です。 一方、決定木のようなルールベースのアルゴリズムは、機能のスケーリングの影響を受けません。

データをスケーリングする手法は、事前定義された間隔にデータを圧縮することです。 正規化では、最小の特徴値を0に、最大の特徴値を1にマップします。 したがって、機能値は[0、1]の範囲にマップされます。

   

標準化では、データを明確な範囲に強制しません。 代わりに、平均が0、標準偏差が1になるように変換します。

   

スケーリングに役立つだけでなく、データを一元化します。

一般に、ほとんどの場合、標準化は正規化よりも適しています。

3. Pythonでの機能のスケーリング

機能スケーリングの使用法をわかりやすく説明するために、これまでに学習した内容を適用してみましょう。 Pythonでは、前処理を含むすべての機械学習タスクにscikit-learnライブラリを使用できます。

このセクションでは、コンクリート圧縮強度データセットを使用します。 回帰問題は、7つのコンポーネントの量とコンクリートの古さを考慮して、コンクリートの圧縮強度を予測することです。 このデータセットには、8つの数値入力変数と1030のインスタンスがあります。

箱ひげ図は、中央値、四分位数、および数値データの範囲をグラフで示します。 箱ひげ図を使用して、コンクリート圧縮強度データセットからの入力特徴を分析してみましょう。

この図では、入力フィーチャのさまざまな範囲が示されています。 また、データの大部分と外れ値がどこにあるかもわかります。

3.1. 正規化

正規化には、scikit-learnのmin-maxスケーラーを利用します。

from sklearn.preprocessing import MinMaxScaler

min_max_scaler = MinMaxScaler().fit(X_test)
X_norm = min_max_scaler.transform(X)

経験則として、スケーラーをテストデータに適合させ、それを使用してデータセット全体を変換します。 これにより、モデルの構築中にテストデータセットを完全に無視します。

具体的なデータセットを正規化すると、次のようになります。

約束どおり、さまざまなドメインのすべての値が[0、1]の範囲に変換されます。 最後の機能を注意深く観察すると、極端な外れ値は、観測値の大部分をさらに狭い範囲に強制することがわかります。 さらに、新しい観測値の極端な外れ値は失われます。

3.2. 標準化

機能を標準化するために、標準のスケーラーを使用します。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler().fit(X_train)
X_std = scaler.transform(X)

ここでも、テストデータセットからの観測値のみを使用してスケーラーを適合させます。 具体的なデータセットを標準化した結果の箱ひげ図は、機能がどのように影響を受けるかを示しています。

もう一度8番目の機能を見てみましょう。 外れ値は、値の大部分がどのように変換されるかに影響しません。 さらに、新しい観測値の極値は引き続き表示されます。

先に進む前に、正規化と標準化によってデータがどのように変化するかを視覚的に比較してみましょう。 そのために、4番目の機能と5番目の機能をプロットしてみましょう。

青い点は、入力フィーチャの実際の値を表します。 赤い点は標準化された値であり、緑の点は正規化された値です。 予想どおり、正規化はデータポイントを互いに近づけます。 結果の範囲は、標準化されたデータセットと比較して非常に小さくなります。

4. Pythonでの線形回帰

機能スケーリングを適用する方法を学習したので、機械学習モデルのトレーニングに進むことができます。 線形回帰モデルを作成しましょう。

from sklearn import linear_model

# Create linear regression object
regr = linear_model.LinearRegression()

# Train the model using the training sets
regr.fit(X_train, y_train)

# Make predictions using the testing set
y_pred = regr.predict(X_test)

モデルをトレーニングした後、切片と係数を報告できます。

# The intercept
print('Interccept: \n', regr.intercept_)
# The coefficients
print('Coefficients: \n', regr.coef_)

この例では、出力は次のようになります。

Intercept: 
 -59.61868838556004
Coefficients: 
 [ 0.12546445  0.11679076  0.09001377 -0.09057971  0.39649115  0.02810985
  0.03637553  0.1139419 ]

さらに、平均二乗誤差とR二乗メトリックを報告できます。

print('MSE: %.2f' % mean_squared_error(y_test, y_pred))
print('R^2: %.2f' % r2_score(y_test, y_pred))

これにより、スコアが得られます。

MSE: 109.75
R^2: 0.59

特徴スケーリングされたデータセットで線形回帰モデルをトレーニングするには、fit関数の入力を変更するだけです。

同様の方法で、正規化および標準化されたデータセットで線形回帰モデルを簡単にトレーニングできます。 次に、このモデルを使用して、テストセットの結果を予測し、そのパフォーマンスを測定します。

具体的なデータセットの場合、結果は次のとおりです。

驚くべきことに、この場合、機能のスケーリングによって回帰パフォーマンスが向上することはありません。実際、有名なおもちゃのデータセットで同じ手順を実行しても、モデルの成功は向上しません。

ただし、これは線形回帰に特徴のスケーリングが不要であることを意味するものではありません。 sci-kitの実装でさえ、 True に設定すると、入力を自動的に正規化するブール値のnormalizeパラメーターがあります。

代わりに、この結果は、機械学習のすべての前処理方法に適合しないことを思い出させます。データセットを注意深く調べ、カスタマイズされた方法を適用する必要があります。

5. 結論

この記事では、正規化と標準化という2つのよく知られた機能スケーリング方法について説明しました。 これらのメソッドをPythonに適用して、コンクリートの圧縮強度データセットの機能をどのように変換するかを確認しました。

次に、このデータセットとその正規化および標準化されたコピーを使用して線形回帰モデルをトレーニングしました。 この例では、これによってモデルの成功が変わることはありませんでした。