Python 主な教師あり学習 K近傍法、SVM、決定木

AI
スポンサーリンク

教師あり学習の主なモデル(ロジスティック回帰は別の記事で解説)

教師あり学習は、入力データと対応する正解ラベルを用いて、モデルがデータからパターンを学習する機械学習の一種です。教師あり学習の主なアルゴリズムには以下のようなものがあります。

  1. 線形回帰: 連続値を予測するタスクで、特徴量と目的変数の間に線形関係があると仮定し、最小二乗法などを用いてモデルを学習させます。
  2. ロジスティック回帰: 二値分類問題に適用される線形モデルで、シグモイド関数を使用して確率を予測します。ロジスティック回帰はこちらで解説
  3. 決定木: データを階層的に分割していく木構造のモデルで、分類・回帰問題に対応できます。
  4. ランダムフォレスト: 複数の決定木を組み合わせたアンサンブル学習手法で、決定木の過学習を抑制し、汎化性能を向上させます。
  5. k近傍法: 入力データに最も近いk個のトレーニングデータを探し、それらの多数決や平均値を予測結果として出力するアルゴリズムです。
  6. サポートベクトルマシン: データを最適に分割する境界線(超平面)を見つけることで、分類・回帰問題を解決します。非線形問題にもカーネルトリックを用いることで対応可能です。
  7. ニューラルネットワーク: 複数の層とノードで構成されるモデルで、ディープラーニングの基本構造です。非線形問題や高次元データに適用可能で、分類・回帰問題に対応できます。

K-近傍法とは

k近傍法(k-Nearest Neighbors, k-NN)は、教師あり学習の一種で、分類や回帰問題に用いられるシンプルなアルゴリズムです。k近傍法の主なポイントは以下の通りです。

  1. インスタンスベースの学習: k近傍法はインスタンスベースの学習アルゴリズムであり、訓練データを暗記することでモデルを構築します。そのため、訓練フェーズではほとんど計算が必要ありません。

  2. 距離尺度: k近傍法は、距離尺度を用いて入力データと訓練データ間の類似性を測ります。一般的な距離尺度には、ユークリッド距離、マンハッタン距離、マハラノビス距離などがあります。

  3. kの選択: kは近傍の数を表し、アルゴリズムの性能に大きく影響します。kの値が小さいと過学習になりやすく、大きすぎると未学習になりやすいです。kの適切な値は、交差検証などの手法を用いて選択することが一般的です。

  4. 投票による分類・回帰: k近傍法では、新しいデータポイントに対して、k個の最も近い訓練データのラベルや値を用いて分類や回帰を行います。分類では、k個の近傍データの最も多いクラスが選ばれ、回帰ではk個の近傍データの平均値が予測値となります。

  5. 非線形問題への適用: k近傍法は、線形問題だけでなく非線形問題にも適用できる柔軟性があります。

  6. スケーリングの重要性: k近傍法は距離尺度に依存するため、特徴量のスケーリングが重要です。データの前処理として、特徴量の正規化や標準化を行うことで、性能が向上することがあります。

  1. 計算負荷: k近傍法は、すべての訓練データと新しいデータポイント間の距離を計算する必要があるため、予測フェーズの計算負荷が高くなります。大規模データセットに対しては、効率的なデータ構造(例:KD木、Ball-tree)や近似アルゴリズムを利用して計算コストを削減することができます。

  2. 欠損値への対処: k近傍法は、欠損値が含まれるデータに対しても適用可能です。欠損値の扱い方として、欠損値を無視して距離を計算する方法や、欠損値を代理値(例:平均値、中央値)で埋める方法などがあります。

  3. クラスの不均衡: クラスが不均衡なデータセットに対しては、k近傍法の性能が低下することがあります。この問題に対処するために、適切なサンプリング手法(例:過剰サンプリング、欠損サンプリング)を用いたり、重み付き投票を行うことで改善が可能です。

  4. ハイパーパラメータ調整: k近傍法では、kの値以外にも距離尺度や重み付けなどのハイパーパラメータを調整することで性能が向上することがあります。ハイパーパラメータの最適な組み合わせを見つけるために、グリッドサーチやランダムサーチなどの手法が用いられます。

 

サポートベクトルマシン (SVM)について

サポートベクトルマシン(Support Vector Machine, SVM)は、教師あり学習の一種で、主に二値分類問題に用いられる強力なアルゴリズムです。サポートベクトルマシンの主なポイントは以下の通りです。

  1. 最大マージン分類器: SVMは、クラスを分割する決定境界(超平面)を見つける際、最大のマージン(最も近いデータポイントまでの距離)を持つものを選びます。この最大マージンが汎化性能を向上させる理由とされています。

  2. サポートベクトル: サポートベクトルは、決定境界に最も近いデータポイントで、最大マージンを決定する上で重要な役割を果たします。実際、SVMの学習は、これらのサポートベクトルに関連する最適化問題として定式化されます。

  3. カーネルトリック: 非線形分類問題に対処するために、SVMではカーネルトリックと呼ばれる手法が用いられます。カーネル関数を用いて、入力データを高次元空間に変換し、線形分類器を適用することで、元の空間での非線形分類が可能となります。一般的なカーネル関数には、多項式カーネル、RBF(Radial Basis Function)カーネル、シグモイドカーネルなどがあります。

  4. 正則化: SVMでは、正則化パラメータCを導入し、過学習を防ぐことができます。Cは、誤分類の許容度を制御し、小さい値ではより柔軟な境界が、大きい値ではより厳密な境界が求められます。適切なCの値は、交差検証などの手法を用いて選択することが一般的です。

  1. 多クラス分類: SVMは基本的に二値分類器ですが、一対一法(One-vs-One)や一対他法(One-vs-All)といった手法を用いて多クラス分類に拡張することができます。一対一法では、各クラスのペアごとにSVMを学習し、最終的なクラスは複数のSVMの結果を基に決定されます。一対他法では、各クラスに対して、そのクラスと他のすべてのクラスを分類するSVMを学習し、最終的なクラスは最も高い信頼度を持つSVMに基づいて決定されます。

  2. スケーリングの重要性: SVMは、特徴量のスケールに敏感です。データの前処理として、特徴量の正規化や標準化を行うことで、性能が向上することがあります。これにより、各特徴量が同等の重要性を持つように調整されます。

  3. ハイパーパラメータ調整: SVMの性能は、ハイパーパラメータの選択に大きく依存します。主要なハイパーパラメータには、正則化パラメータCとカーネル関数のパラメータがあります。適切なハイパーパラメータの組み合わせを見つけるために、グリッドサーチやランダムサーチなどの手法が用いられます。

  4. 計算負荷: SVMは、計算負荷が高いアルゴリズムとなることがあります。特に、データセットのサイズが大きくなると、学習に要する時間が増加します。そのため、大規模データセットに対しては、線形SVMや確率的勾配降下法(SGD)などのより効率的な手法を検討することが望ましいです。

決定木について

決定木 (Decision Tree) は、教師あり学習の一種で、分類や回帰問題を解決するためのシンプルで強力な手法です。決定木のポイントをまとめると以下のとおりです。

  1. 階層的構造: 決定木は、ルートノードから始まり、内部ノードと葉ノードで構成されています。各内部ノードは、特徴に関する条件で分割され、葉ノードは最終的なクラスラベルや回帰値を表します。

  2. 分割基準: 分割基準は、最も情報量が高い特徴を選択し、データを分割する方法です。一般的な分割基準には、情報利得、ジニ不純度、エントロピーなどがあります。

  3. 再帰的分割: 決定木は、再帰的にデータを分割していき、各ノードで最適な特徴に基づいて分割を行います。プロセスは、停止条件が満たされるか、すべての葉ノードが純粋になるまで続きます。

  4. 過学習のリスク: 決定木は、データに過度に適合する傾向があるため、過学習が発生しやすいです。過学習を防ぐために、木の深さの制限、葉ノードの最小サンプル数、枝刈りなどの手法があります。

  5. 可視化と解釈性: 決定木は、分類や回帰のルールを明確に表現できるため、高い解釈性があります。これにより、モデルの理解や説明が容易になります。

  6. 多様な応用: 決定木は、分類木や回帰木として利用できるため、多様な問題に適用することができます。

  7. ランダムフォレストや勾配ブースティング: 決定木は、アンサンブル学習手法であるランダムフォレストや勾配ブースティングの基本要素としても用いられます。これらの手法は、複数の決定木を組み合わせることで性能を向上させます。

教師あり学習のコード例 あやめの品種の分類

あやめのデータセットの使い方や分析手順はロジスティック回帰で解説したとおりです。手順などの詳細はロジスティック回帰のレッスンを確認してください。

説明変数(特徴量)の標準化

説明変数のスケールを平均0で標準偏差1になるように変換することです。

説明変数の種類によっては数値のスケールがバラバラの場合があり、これが誤差の原因にもなってきます。具体的にはある項目では1桁の数値データ、別の項目では3桁の数値データがあったとしたら桁数が大きい数値に結果が引っ張られることにつながります。そのため、全ての項目のデータでその大小を比較できるようにします。
その際に標準化が使われます。

標準化は全てのデータの平均を0に、分散(標準偏差も)は1になるようにします。

Scikit-learnのStandardScalerはこの変換を行うもので、K近傍法のように距離を取り扱うアルゴリズムの場合に効果が出ます。

Scikit-learnのStandardScalerの使い方

  1. StanderdScalerをインスタンス化
  2. fit()は標準化に必要な平均と標準偏差を求める
  3. transform()を使って標準化

trainデータを標準化する例

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(train)
train_std = scaler.transform(train)

fit_tansform()はfit()とtarnsform()を同時に行うものです。トレーニングデータの標準化には、 一般的にこちらがよく使われます。

scaler = StandardScaler()
train_std = scaler.fit_transform(train)

fit_tansform()を使った問題点

fit_tansform()は便利なメソッドですが、テストデータで使用する場合は注意が必要です。基本的にはテストデータの値を標準化するにはトレーニングデータの平均値と標準偏差を活用して計算します。

そのため、トレーニングデータを標準化する時にはfit_tansform()を活用できますが、テストデータを標準化するときにfit_tansform()を使うとテストデータだけの平均値と標準偏差が使用されてしまいます。一般的にテストデータは未知の値を予測するための検証データのため平均値と標準偏差は不明なはずです。そのためテストデータの平均値と標準偏差を使用することになります。

そのため次のようなコードを使用します。

test_std = scaler.transform(test)

 

K近傍法のモデルを作成

 

KNeighborsClassifierのハイパーパラメータ

n_neighborsint, default=5

対象観測値を何個にするか決めます。デフォルトは5ですが一般的にこの値は5あたりの数値が良い結果を出しているようです。

metricstr or callable, default=’minkowski’

通常はデフォルトの minkowski で良いです。これは距離のことで、マンハッタン距離やユークリッド距離を一般化したものです。

pint, default=2

p=1がマンハッタン距離、p=2がユークリッド距離のことです。デフォルトはユークリッド距離です。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler

iris_dataset = load_iris()

X_train, X_test, y_train, y_test = train_test_split(
  iris_dataset['data'], iris_dataset['target'], random_state=0
)

sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)

knn = KNeighborsClassifier(n_neighbors=7)
knn.fit(X_train_std, y_train)

print(f"Train set score: {knn.score(X_train_std, y_train):.2f}")
print(f"Test set score: {knn.score(X_test_std, y_test):.2f}")
Train set score: 0.97 
Test set score: 0.97

SVMのモデル作成

SVMは特徴量スケールの影響を受けやすいアルゴリズムです。従って StandardScaler を活用して標準化を行っておく必要があります。手順のポイントはスケーリングを行うことです。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler

iris_dataset = load_iris()

X_train, X_test, y_train, y_test = train_test_split(
iris_dataset['data'], iris_dataset['target'], random_state=0
)

sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)

from sklearn.svm import SVC
svc = SVC(kernel = 'linear', random_state = 0)
svc.fit(X_train_std, y_train)

print(f"Train set score: {svc.score(X_train_std, y_train):.2f}")
print(f"Test set score: {svc.score(X_test_std, y_test):.2f}")

Train set score: 0.97
Test set score: 0.97

予測

new_data_scaled = sc.transform([[5, 2.9, 1, 0.2]])
prediction = svc.predict(new_data_scaled)
print(f"Prediction: {prediction}")
print(f"Predicted target name: {iris_dataset['target_names'][prediction]}")

Prediction: [0]
Predicted target name: ['setosa']

 

決定木のモデル作成

決定木の分析手順はロジスティック回帰とほとんど変わりません。詳細はロジスティック回帰とのレッスンを確認してください。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

iris_dataset = load_iris()

X_train, X_test, y_train, y_test = train_test_split(
  iris_dataset['data'], iris_dataset['target'], random_state=0
)

model = DecisionTreeClassifier(random_state = 0, max_depth=4)
model.fit(X_train, y_train)

print(f"Train set score: {model.score(X_train, y_train):.2f}")
print(f"Test set score: {model.score(X_test, y_test):.2f}")

Train set score: 1.00
Test set score: 0.97

予測

new_data = [[5, 2.9, 1, 0.2]]
prediction = model.predict(new_data)
print(f"Prediction: {prediction}".format())
print(f"Predicted target name: {iris_dataset['target_names'][prediction]}")

Prediction: [0]
Predicted target name: ['setosa']

教師あり学習の実用例

これらのアルゴリズムが様々な分野で活用されています。教師あり学習アルゴリズムは、データから予測モデルを構築し、新しいデータに対して予測を行うことができます。具体的な応用例には以下のようなものがあります。

  1. 金融業界: クレジットスコアリング、不正検出、株価予測など
  2. 医療業界: 疾患診断、薬物開発、患者のリスク評価など
  3. マーケティング: 顧客セグメンテーション、広告ターゲティング、顧客流入予測など
  4. 工業: 品質管理、故障予測、製造プロセス最適化など
  5. 自動車業界: 自動運転技術、車両の故障診断、交通状況予測など
  6. エネルギー: 需要予測、価格予測、リソース最適化など
  7. テレコム: 顧客離脱予測、ネットワーク最適化、不正利用検出など

これらの業界で、決定木、k近傍法、サポートベクトルマシンなどの教師あり学習アルゴリズムは、データドリブンな意思決定や予測を行うために活用されています。ただし、どのアルゴリズムが最適かは、問題の性質やデータセットによって異なります。そのため、現場では複数のアルゴリズムを試し、最も性能が良いものを選択することが一般的です。

教師あり学習のアルゴリズムの今後

ChatGPTの登場で脚光を浴びている生成AIの飛躍的な進化に貢献したディープラーニングに対して、比較的古いアルゴリズムのこれからの今後が気になるところですが、これらのアルゴリズム(ロジスティック回帰、決定木、k近傍法、サポートベクトルマシンなど)とディープラーニングを使い分ける際に考慮すべき要因があります。

  1. ディープラーニングは大量のデータが必要とされることが一般的です。これに対して、従来の機械学習アルゴリズムはデータ量が少ない場合でも適切に機能することがあります。データ量が少ない場合は、従来のアルゴリズムの方が適切であることが多いです。

  2. ディープラーニングは、非線形性が高く複雑な問題に適しています。例えば、画像認識や自然言語処理のような複雑なタスクでは、ディープラーニングが他のアルゴリズムよりも優れた性能を発揮します。一方、線形性が高く単純な問題では、従来のアルゴリズムが十分に機能することがあります。

  3. ディープラーニングは、学習や推論に多くの計算リソース(GPUや高速なCPU)を必要とします。一方、従来のアルゴリズムは計算コストが比較的低いことが多いです。計算リソースが限られている場合は、従来のアルゴリズムを検討することが適切です。

  4. ディープラーニングモデルは「ブラックボックス」とされることがあり、その予測の理由を直接解釈することが難しいです。一方、決定木のような従来のアルゴリズムは、予測の根拠を理解しやすいことがあります。解釈性が重要な場合は、従来のアルゴリズムが適切です。

  5. ディープラーニングモデルは多くのハイパーパラメータを持ち、最適な設定を見つけるのが難しいことがあります。一方、従来のアルゴリズムは、ハイパーパラメータの数が比較的少なく、チューニングが容易です。

  1. ディープラーニングモデルは通常、学習に長い時間がかかることがあります。対照的に、従来の機械学習アルゴリズムは、学習時間が短いことが多いです。プロジェクトのタイムリミットや繰り返し実験を行いたい場合は、従来のアルゴリズムが適切であることがあります。

  2. ディープラーニングモデルは、転移学習を利用して、他のタスクで学習された知識を活用することができます。これにより、データが少ない場合でも、優れた性能を発揮することができることがあります。従来の機械学習アルゴリズムでは、転移学習の適用が難しい場合があります。

これらの要因を考慮して、ディープラーニングと従来の機械学習アルゴリズムを使い分けは重要です。問題の性質やデータセット、計算リソース、解釈性の要求、学習時間などを総合的に評価し、最適なアプローチを選択することが望ましいです。つまり、今後もこれらの基礎的なアルゴリズムもしっかりと押さえておく必要があります。

 
 
 
タイトルとURLをコピーしました