SVMで機能スケーリングを行う理由
1. 序章
このチュートリアルでは、サポートベクターマシン(SVM)での機能スケーリングの効果を調査します。
最初に、SVMと機能のスケーリングについて学習します。 次に、Pythonの例を使用して、SVMでの機能スケーリングの効果を説明します。 最後に、分類子の成功を比較して結論を出します。
2. SVMと機能のスケーリング
SVM は、分類および回帰タスクに使用する教師あり学習アルゴリズムです。これは、高次元空間に適用できる効果的でメモリ効率の高いアルゴリズムです。
SVM分類器のトレーニングには、クラス間の決定境界の決定が含まれます。 この境界は、各データクラスの最も近いポイントからの最大距離を持つことが知られています。 この特性により、SVMは最大マージン分類器とも呼ばれます。
SVMは、マルチクラス分類を暗黙的にサポートしていません。 マルチクラスSVM分類器をトレーニングするために、1対1または1対残りのアプローチを使用します。
特徴のスケーリングは、データセットの特徴値を同じ範囲にマッピングします。特徴のスケーリングは、2つの観測値間の距離がスケーリングされていない場合とスケーリングされた場合で異なるため、観測値間の距離を考慮する一部の機械学習アルゴリズムにとって重要です。 。
すでに述べたように、決定境界は、さまざまなクラスからの最も近いデータポイントまでの距離を最大化します。 したがって、データポイント間の距離は、SVMが選択する決定境界に影響します。 言い換えると、スケーリングされたデータとスケーリングされていないデータに対してSVMをトレーニングすると、さまざまなモデルが生成されます。
機能スケーリングに最も広く採用されている2つのアプローチは、正規化と標準化です。 正規化は、値を[0、1]間隔にマップします:
標準化により、特徴値が平均ゼロになるようにシフトされ、標準偏差が1になるような範囲にマッピングされます。
データを中央に配置し、データセットにまだ表示されていない新しい値に対してより柔軟に対応します。 それが私たちが一般的に標準化を好む理由です。
3. PythonのSVM
理論的な概念を学習したので、Pythonでこれを実装する方法を見てみましょう。 scikit learn ライブラリの関数を使用して、前処理とモデル構築を行います。
ワインデータセットを使用してモデルをトレーニングします。 データは、3種類のワインの化学分析によって生成されます。 このデータセットには、13の実数値の特徴と3つの出力クラスがあります。
数値機能は、さまざまな範囲の値をカバーします。 箱ひげ図を使用して入力データを視覚化してみましょう。
次に、デフォルトのパラメーターを使用して機能スケーリングなしでSVMをトレーニングしましょう。適用する SVC 分類器は、1対1のスキームに従ってマルチクラスを処理します。
clf = svm.SVC()
clf.fit(X_train, y_train)
次に、テストセットの結果を予測します。
y_pred = clf.predict(X_test)
その後、分類パフォーマンスを測定するために、精度とF-1スコアメトリックを計算してみましょう。
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
print("F-1 Score:", metrics.f1_score(y_test, y_pred, average=None))
これは値を与えます:
Accuracy: 0.7592592592592593
F-1 Score: [1. 0.74509804 0.31578947]
したがって、デフォルトのパラメーターでトレーニングされたSVMモデルの精度は75%です。 F-1スコアの値は、クラスの予測の成功が異なることを示しています。精度、そして最後のクラスが最低です。
4. Pythonでの機能のスケーリング
別のアプローチとして、スケーリングされた機能を使用して別のSVMモデルをトレーニングしてみましょう。 標準スケーラーを使用してデータセットを標準化します。
scaler = StandardScaler().fit(X_train)
X_std = scaler.transform(X)
常にスケーラーをトレーニングセットに適合させてから、データセット全体に変換を適用する必要があります。 そうしないと、テストセットからトレーニングセットに知識が漏れてしまいます。
予想どおり、結果として得られる標準化された機能の平均は0、標準偏差は1です。
次に、スケーリングされたデータを使用して新しいモデルをトレーニングしましょう。 上記で使用したのと同じコードスニペットが機能し、入力データのみを変更します。
特徴スケーリングを適用するとデータポイント間の距離が変化するため、新しくトレーニングされたSVMモデルは完全に異なります。モデルパラメータを比較して違いを強調できます。 たとえば、 n_support は、各クラスのサポートベクターの数を報告します。
print(clf.n_support_)
スケーリングされていないデータセットでトレーニングされた最初のSVMモデルには、サポートベクターの数があります。
[15 34 34]
一方、標準化されたデータでトレーニングされた2番目のモデルには次のものがあります。
[15 27 18]
数字は、2番目と3番目のクラスのモデルが異なることを示しています。
ここでも、精度とF-1スコアを計算して、分類のパフォーマンスを測定します。
Accuracy: 0.9814814814814815
F-1 Score: [1. 0.97674419 0.96296296]
標準化されたデータでトレーニングされた新しいSVMモデルの精度は98%とはるかに高くなっています。さらに、特に3番目のクラスでF-1スコアの大幅な増加が見られます。
初期モデルとは異なるF-1スコアを持つ2番目と3番目のクラスは、サポートベクターの数で観測を検証します。 これらのクラス用に設定されたモデルは同じではありません。
その結果、機能のスケーリングがSVM分類器の結果に影響を与えることがわかります。 その結果、機能値を標準化すると、分類器のパフォーマンスが大幅に向上します。
5. 結論
この記事では、SVMアルゴリズムと、特徴のスケーリングが分類の成功にどのように影響するかについて学習しました。
SVMについて簡単に説明し、機能のスケーリングを定義した後、Pythonの例を使用して違いを説明しました。