Scikit-learn 基本概念

Scikit-learn を使用して機械学習を行う際には、いくつかの基本的な概念を理解する必要があります。

Scikit-learn は、さまざまな機械学習アルゴリズムとプロセスを実装するための統一された簡潔な API を提供しており、さまざまな機械学習タスクを迅速に実装するのに役立ちます。

次に、以下の概念について説明します。データ表現、モデルタイプ、前処理方法、評価指標、モデルのチューニングなどです。


1、データ表現:データセットと特徴

データセットは、Scikit-learn における最も基本的な概念の1つです。

機械学習の中核となるタスクはデータからパターンを学習することであり、データの表現方法は非常に重要です。

データセット(Dataset)

scikit-learn では、データは通常、次の2つの主要なオブジェクトで表現されます:特徴行列とターゲットベクトル。

特徴行列(Feature Matrix):各行は1つのデータサンプルを表し、各列は1つの特徴(入力変数)を表します。これは2次元の配列または行列であり、通常は NumPy 配列や pandas DataFrame を使用して格納されます。

3つのサンプルがあり、各サンプルには2つの特徴があるとします。

例

import numpy as np
X = np.array([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]])

ターゲットベクトル(Target Vector):これは各サンプルのターゲット(出力ラベル)を表し、通常は1次元配列です。

例えば、分類タスクでは、ターゲットは各サンプルのクラスラベルです。

対応するターゲットベクトル:

y = np.array([0, 1, 0])  # 0 类别和 1 类别

特徴とラベル

  • 特徴(Features):データセット内でモデルのトレーニングに使用される入力変数です。上記の例では、Xは特徴行列であり、すべての入力変数を含みます。

  • ラベル(Labels):機械学習モデルのターゲット出力です。教師あり学習では、ラベルはモデルに予測させたい結果です。上記の例では、yはラベルまたはターゲットベクトルであり、各サンプルのクラスを含みます。

データセット分割

実際のアプリケーションでは、通常、データセットをトレーニングセットとテストセットに分割する必要があります。

scikit-learn は便利な関数を提供しています。train_test_split()これを行うための関数です:

例

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  • 上記のコードは、train_test_split関数を呼び出し、結果を4つの変数に代入します:X_train、X_test、y_trainとy_test。
  • Xとyは、train_test_split関数に渡される引数で、それぞれ特徴データセットとターゲット変数(ラベル)を表します。通常、Xは2次元配列で、yは1次元配列です。
  • test_size=0.3パラメータは、テストセットのサイズが元のデータセットの30%であることを指定します。つまり、データの70%がトレーニングセットとして使用され、残りの30%がテストセットとして使用されることを意味します。
  • random_state=42パラメータは乱数シードであり、データセットを分割するたびに同じ結果が得られるようにします。これは実験やモデルの検証において、結果の再現性を保証するため非常に有用です。

2、モデルとアルゴリズム

教師あり学習と教師なし学習

scikit-learn では、機械学習モデルはおおまかに2つのカテゴリに分類されます:教師あり学習と教師なし学習。

教師あり学習(Supervised Learning):教師あり学習では、モデルはトレーニング時にラベル付きデータを使用して学習します。これらのラベルは、モデルに予測させたい結果です。

一般的な教師あり学習タスクには、分類と回帰があります。

  • 分類(Classification):データポイントをあらかじめ定義されたクラスに割り当てます。例えば、メールがスパムか非スパムかを判定します。
  • 回帰(Regression):連続値の出力を予測します。例えば、住宅価格や気温などを予測します。

決定木を使用した分類タスク:

例

from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

教師なし学習(Unsupervised Learning):教師なし学習とは、ラベル付きデータがなく、モデルが入力データ自体の特徴のみから学習することです。

一般的な教師なし学習タスクには、クラスタリングと次元削減があります。

  • クラスタリング(Clustering):データをグループ分けし、同じグループ内のデータが類似性を持つようにします。一般的なクラスタリングアルゴリズムには、K-Means、DBSCANなどがあります。
  • 次元削減(Dimensionality Reduction):データ内の特徴量の数を減らすもので、通常はデータ圧縮や可可視化に使用されます。一般的な次元削減手法には、PCA(主成分分析)やt-SNE(t分布確率近傍埋め込み)などがあります。

K-Means クラスタリングを使用する:

例

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)
kmeans.fit(X_train)
y_pred = kmeans.predict(X_test)

前処理と特徴量エンジニアリング

scikit-learn で機械学習を行う前に、通常データの前処理が必要です。これには、以下の一般的なタスクが含まれます:

1、標準化(Standardization):特徴のスケールを統一し、各特徴が平均0、分散1になるようにします。

例

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

2、正規化(Normalization):特徴の値を固定範囲(通常は0から1)にスケールします。

例

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)

3、カテゴリ変数のエンコーディング:カテゴリ型データを数値型データに変換します(例えば、ワンホットエンコーディングなど)。


3、モデル評価と検証

機械学習モデルのトレーニング後、その性能を評価して汎化能力を確認する必要があります。

scikit-learn は、モデルの性能を評価するためのツールを提供しています。

交差検証(Cross-validation)

交差検証は、特にデータ量が限られている場合によく使われるモデル評価方法です。

データを複数のサブセットに分割し、毎回1つのサブセットを検証セット、残りをトレーニングセットとして、モデルのトレーニングと評価を複数回繰り返し、最終的にモデルの平均性能を計算します。

例

from sklearn.model_selection import cross_val_score
scores = cross_val_score(clf, X, y, cv=5)  # 5-fold cross-validation
print("Cross-validation scores:", scores)

一般的な評価指標

分類タスクの評価指標:

  • 正解率(Accuracy):予測が正しかったサンプルの全サンプルに対する割合。
  • 適合率(Precision):正クラスと予測した中で、実際に正クラスである割合。
  • 再現率(Recall):実際の正クラスの中で、正しく予測できた割合。
  • F1スコア:適合率と再現率の調和平均。

例

from sklearn.metrics import accuracy_score, classification_report
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))

回帰タスクの評価指標:

  • 平均二乗誤差(MSE):予測値と実際の値の差の二乗の平均値。
  • 決定係数(R²):モデルがデータの変動をどの程度説明できるかを示す指標。

例

from sklearn.metrics import mean_squared_error, r2_score
print("MSE:", mean_squared_error(y_test, y_pred))
print("R²:", r2_score(y_test, y_pred))

4、モデル選択とチューニング

グリッドサーチ(Grid Search)

グリッドサーチは、一般的なハイパーパラメータのチューニング手法で、可能なすべてのパラメータの組み合わせを網羅して最適なハイパーパラメータの組み合わせを探します。

例

from sklearn.model_selection import GridSearchCV

param_grid = {'max_depth': [3, 5, 7], 'min_samples_split': [2, 5, 10]}
grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
print("Best parameters:", grid_search.best_params_)

ランダムサーチ(Random Search)

ランダムサーチは、ハイパーパラメータの組み合わせをランダムに選択して最適なハイパーパラメータを探索する方法で、グリッドサーチよりも効率的です。

例

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint

param_dist = {'max_depth': [3, 5, 7], 'min_samples_split': randint(2, 10)}
random_search = RandomizedSearchCV(DecisionTreeClassifier(), param_dist, n_iter=10, cv=5)
random_search.fit(X_train, y_train)
print("Best parameters:", random_search.best_params_)
その他の拡張