Sklearn 機械学習モデル

機械学習モデルは、自動化されたデータ分析、パターン認識、予測を実現するための核心的なツールです。

タスクの種類に応じて、機械学習モデルは通常、次のように分類できます。

  • 分類モデル(Classification):離散的なカテゴリを予測する
  • 回帰モデル(Regression):連続的な数値を予測する
  • クラスタリングモデル(Clustering):データを自動的にグループ化する

この章では、これらの一般的な機械学習モデルについて詳しく説明し、モデルの評価方法と最適化方法についても紹介します。


1、分類モデル

分類問題は機械学習で最も一般的な問題の一つであり、その目的は入力データを離散的なカテゴリラベルにマッピングすることです。

一般的な分類モデルは次のとおりです:

  • ロジスティック回帰
  • K-近傍法(KNN)
  • サポートベクターマシン(SVM)
  • 決定木
  • ランダムフォレスト

ロジスティック回帰(Logistic Regression)

ロジスティック回帰は名前の中に「回帰」が含まれていますが、本質は確率型分類モデルであり、二値分類問題によく使用されます。

その中核となる考え方は次のとおりです:

  • まず線形加重和を計算し
  • 次に Sigmoid 関数を使用して結果を 0〜1 の範囲の確率にマッピングします

形式は次のように表せます:

ロジスティック回帰の核心的な公式は次のとおりです:

scikit-learn での実装:

例

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# X は特徴行列、y はラベルとします
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)

# 予測
y_pred = model.predict(X_test)

K-近傍法(K-Nearest Neighbors, KNN)

K-近傍法(KNN)はインスタンスベースの学習方法であり、予測時には予測対象のサンプルとトレーニングセット内のすべてのサンプルとの距離を計算し、最も近い K 個の近傍を選択して、そのラベルに基づいて予測を行います。

主なパラメータ:

  • K:選択する近傍の数。
  • 距離メトリック:一般的にはユークリッド距離を使用しますが、マンハッタン距離やミンコフスキー距離なども使用できます。

scikit-learn での実装:

例

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

# X は特徴行列、y はラベルとします
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)

# 予測
y_pred = model.predict(X_test)

サポートベクターマシン(Support Vector Machine, SVM)

サポートベクターマシンは強力な分類モデルであり、特に高次元データに適しています。

SVM の基本的な考え方は、異なるカテゴリのサンプル点間のマージンを最大化する超平面を見つけることです。非線形分離可能なデータの場合、SVM はカーネルトリックを使用してデータを高次元空間にマッピングし、分離超平面を見つけます。

カーネル関数:

  • 線形カーネル:線形分離可能なデータに適しています。
  • ガウス動径基底カーネル(RBF):非線形データに適しています。
  • 多項式カーネル:多項式の関係を持つデータに適しています。

scikit-learn での実装:

例

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# X は特徴行列、y はラベルとします
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

model = SVC(kernel='linear')  # 線形カーネルを使用
model.fit(X_train, y_train)

# 予測
y_pred = model.predict(X_test)

決定木とランダムフォレスト(Decision Tree & Random Forest)

決定木はツリー構造の分類モデルであり、データを分割することによって最終的にデータを異なるカテゴリに分類します。ランダムフォレストは、複数の決定木を構築し、投票または平均によって最終的な予測結果を決定します。

決定木最適な特徴を選択してデータを分割します。選択基準は通常情報利得 或 ジニ係数。

ランダムフォレスト複数の決定木のアンサンブルにより過学習を減らし、モデルの精度を向上させます。また、ランダム性(特徴のランダム選択やデータサブセットのランダム選択など)を導入することで、モデルの多様性を高めます。

scikit-learn での実装:

例

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# X は特徴行列、y はラベルとします
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 決定木
dt_model = DecisionTreeClassifier()
dt_model.fit(X_train, y_train)

# ランダムフォレスト
rf_model = RandomForestClassifier(n_estimators=100)
rf_model.fit(X_train, y_train)

# 予測
dt_pred = dt_model.predict(X_test)
rf_pred = rf_model.predict(X_test)

2、回帰モデル

回帰問題の目標は、連続的な出力変数を予測することです。一般的な回帰モデルには、線形回帰、リッジ回帰、ラッソ回帰などがあります。

線形回帰(Linear Regression)

線形回帰は、直線をフィッティングして目的変数を予測します。その核心的な仮定は、特徴と目的変数の間に線形関係が存在するということです。

単純な線形回帰問題の場合、モデルは次のように表せます:

  • y は予測値(目標値)です。
  • x1,x2,xn入力特徴です。
  • w1,w2,wn学習対象の重み(モデルパラメータ)です。
  • b はバイアス項です。

scikit-learn での実装:

例

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# X は特徴行列、y は目的変数とします
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

# 予測
y_pred = model.predict(X_test)

リッジ回帰(Ridge Regression)

リッジ回帰は線形回帰の変種であり、L2正則化を使用してモデルの複雑さを制約し、過学習を防ぎます。回帰係数の大きさにペナルティを課すことで、リッジ回帰は多重共線性の問題をより適切に処理できます。

scikit-learn での実装:

例

from sklearn.linear_model import Ridge

model = Ridge(alpha=1.0)  # alpha は正則化パラメータです
model.fit(X_train, y_train)

# 予測
y_pred = model.predict(X_test)

ラッソ回帰(Lasso Regression)

ラッソ回帰も線形回帰の一種であり、L1正則化を使用して回帰係数にペナルティを課します。リッジ回帰とは異なり、ラッソは一部の回帰係数をゼロに圧縮するため、特徴選択を実現します。

scikit-learn での実装:

例

from sklearn.linear_model import Lasso

model = Lasso(alpha=0.1)  # alpha は正則化パラメータです
model.fit(X_train, y_train)

# 予測
y_pred = model.predict(X_test)

3、クラスタリングモデル

クラスタリングは教師なし学習手法の一つであり、その目標はデータセット内のオブジェクトを異なるグループ(クラスタ)に分割し、同じクラスタ内のオブジェクトはできるだけ類似し、異なるクラスタ間のオブジェクトはできるだけ異なるようにすることです。

K平均法(K-Means)

K平均法は一般的なクラスタリングアルゴリズムであり、データを K 個のクラスタに分割し、各データポイントとそのクラスタ中心との距離を最小化することでクラスタ分割を最適化します。

scikit-learn での実装:

例

from sklearn.cluster import KMeans

# X は特徴行列とします
model = KMeans(n_clusters=3)
model.fit(X)

# クラスタラベルを取得
labels = model.predict(X)

DBSCAN(密度ベースのクラスタリング)

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)は密度ベースのクラスタリングアルゴリズムであり、密度が比較的高い領域を探すことでクラスタリングを行います。事前にクラスタ数を指定する必要はありません。

scikit-learn での実装:

例

from sklearn.cluster import DBSCAN

# X は特徴行列とします
model = DBSCAN(eps=0.5, min_samples=5)
model.fit(X)

# クラスタラベルを取得する
labels = model.labels_

階層型クラスタリング(Hierarchical Clustering)

階層クラスタリングは、クラスタを再帰的に結合または分割する方法でクラスタリングを行う手法です。一般的な階層クラスタリング手法には、凝集型クラスタリング(Agglomerative)と分割型クラスタリングがあります。(Divisive)。

scikit-learn での実装:

例

from sklearn.cluster import AgglomerativeClustering

# X を特徴行列と仮定する
model = AgglomerativeClustering(n_clusters=3)
labels = model.fit_predict(X)

4、モデルの評価と選択

機械学習では、モデルのトレーニング完了後、合理的な評価方法によってモデルの汎化能力を判断し、最も性能の良いモデルを選択する必要があります。

一般的な評価方法には次のようなものがあります:

  • 分類指標評価
  • 交差検証
  • ハイパーパラメータ調整

分類評価指標

分類問題でよく使われる評価指標には、次のものがあります:

  • 正解率(Accuracy)
  • 適合率(Precision)
  • 再現率(Recall)
  • F1 スコア(F1 Score)

これらは、それぞれ異なる観点からモデルの性能を反映しています。

各指標の説明:

  • 正解率(Accuracy)-- 全サンプルのうち予測が正しかった割合:クラス分布が比較的均等な場合に適しています

  • 適合率(Precision)-- 陽と予測されたサンプルのうち、実際に陽である割合:「陽と予測することが信頼できるかどうか」に着目

  • 再現率(Recall)-- 実際に陽クラスである全サンプルのうち、モデルが正しく識別した割合:「陽サンプルを見逃していないか」に着目

F1 スコア

Precision と Recall の調和平均:

適合率と再現率のバランスを取るために使用されます。

scikit-learn での実装:

例

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")

ホールドアウト法による評価(トレーニングセット / テストセット分割)

最も一般的で直感的な評価方法は、データセットを次のように分割することです:

  • トレーニングセット:モデルの学習用
  • テストセット:性能評価用

この方法はシンプルで効率が良く、モデルの効果を理解する入門段階に適しています。

交差検証(Cross Validation)

交差検証は、データセットを複数回分割してトレーニングとテストを行うことで、より安定した信頼性の高いモデル性能評価結果を得られます。

一般的な方法は、K 分割交差検証です。:

  • データセットは K 個に分割されます。
  • 毎回そのうちの 1 つを検証セットとして使用します。
  • 残りをトレーニングセットとします。
  • K 回繰り返して平均結果を取得します。

例

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression

model = LogisticRegression()

scores = cross_val_score(model, X, y, cv=5)

print("Cross-validation scores:", scores)
print("Mean score:", scores.mean())

実際のプロジェクトでは通常、ホールドアウト法か交差検証のどちらか一方を使用し、両方を同時に併用する必要はありません。

グリッドサーチによるハイパーパラメータ調整(GridSearchCV)

モデルの性能は、ハイパーパラメータの設定に大きく影響されることがよくあります。
グリッドサーチは、パラメータの組み合わせをすべて探索して、最適な設定を自動的に見つけます。

同時に交差検証を組み合わせることで、パラメータ調整の結果をより堅牢にします。

例

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

parameters = {
    'kernel': ['linear', 'rbf'],
    'C': [1, 10, 100]
}

model = SVC()

grid_search = GridSearchCV(
    model,
    parameters,
    cv=5
)

grid_search.fit(X, y)

print("Best parameters:", grid_search.best_params_)
print("Best score:", grid_search.best_score_)
その他の拡張