darkmocha.dev
scikit-learnの推定器APIを理解する
Back to Home

scikit-learnの推定器APIを理解する

機械学習でよく利用されるライブラリ「scikit-learn」の推定器(Estimator)について学習した。

機械学習初学者による絶望アウトプット記録

scikit-learnとは?

まず、簡単にscikit-learnについておさらい。
scikit-learnは機械学習をする際にとても便利なPythonライブラリだ。
様々なモデルで学習するためのツールが揃っており、「とりあえずscikit-learnを入れておけば機械学習はだいたい戦える」くらいの立ち位置にある。
具体的には以下の6つの主要モジュールで構成されている。

分類(Classification)

与えられたデータがどのカテゴリーに属するかを予測する。
用途: 迷惑メールの判定、画像認識、顧客の離脱予測
主なアルゴリズム: ロジスティック回帰、SVM(サポートベクターマシン)、ランダムフォレスト、k最近傍法(KNN)

回帰(Regression)

連続する数値を予測する。
用途: 株価予測、住宅価格の予測、売り上げ予測
主なアルゴリズム: 線形回帰、リッジ回帰、Lasso、決定木、グラディエントブースティング(GBDT)

クラスタリング(Clustering)

正解ラベルのないデータを、似たもの同士のグループに自動で分ける。
用途: 顧客のセグメンテーション(購買履歴など)、異常検知、文書の自動グループ分け
主なアルゴリズム: K-Means、DBSCAN、階層的クラスタリング

次元削減(Dimensionality Reduction)

大量の特徴量を持つデータから、情報を保ちつつ次元数を減らす。余分なノイズを取り除いてデータをスリムにするイメージ。
用途: データの可視化(2D・3Dに圧縮してプロット)、学習の高速化、過学習の抑制
主なアルゴリズム: PCA(主成分分析)、t-SNE、LDA

モデル評価・選択(Model Selection)

どのモデルが一番良いかを公平に評価するためのツール群。
用途: 交差検証(クロスバリデーション)、ハイパーパラメータのチューニング
主な機能: cross_val_scoreGridSearchCVtrain_test_split

前処理(Preprocessing)

生データをモデルが学習しやすい形に整える。これをサボると精度がガタ落ちになることも。
用途: 特徴量のスケール統一、カテゴリ変数の数値化、欠損値の補完
主な機能: StandardScalerMinMaxScalerLabelEncoderOneHotEncoder

scikit-learnの推定器(Estimator)について

scikit-learnを使う上で一番重要な概念が 推定器(Estimator) だ。
推定器とは「学習・変換・予測」を行うオブジェクトの総称で、scikit-learnのほぼすべてのクラスがこれにあたる。分類器・回帰器・前処理器・次元削減器、どれも推定器として統一されたインターフェースで扱える。
推定器の種類代表例
分類・回帰の推定器LogisticRegressionRandomForestClassifierLinearRegression
前処理・次元削減の推定器StandardScalerPCALabelEncoder
この「どれも同じ書き方で使える」という設計が、scikit-learnの一番の強みだ。

fit():学習する

fit() はモデルにデータを学習させるメソッドだ。訓練データを渡してパラメータを調整する。
from sklearn.linear_model import LogisticRegression
 
model = LogisticRegression()
model.fit(X_train, y_train)  # X_train:特徴量、y_train:正解ラベル
前処理器の場合は、fit() によって「このデータの平均・分散はいくつか」を覚えさせる。
from sklearn.preprocessing import StandardScaler
 
scaler = StandardScaler()
scaler.fit(X_train)  # 訓練データの平均・標準偏差を記憶
fit()は訓練データだけに使う
テストデータに対して fit() を呼んではいけない。テストデータの情報がモデルに漏れてしまい(データリーク)、正確な評価ができなくなる。fit() は必ず訓練データだけに使うこと。

predict():予測する

predict() は学習済みのモデルを使って、新しいデータのクラスや数値を予測するメソッドだ。分類モデルではクラスラベルを、回帰モデルでは数値を返す。
y_pred = model.predict(X_test)
print(y_pred)
# → [0 1 2 1 0 ...] ← クラスラベルの配列
分類モデルでは predict_proba() を使うと、各クラスに属する確率まで出力できる。
proba = model.predict_proba(X_test)
print(proba)
# → [[0.85 0.10 0.05]   ← クラス0に85%、クラス1に10%、クラス2に5%
#    [0.03 0.91 0.06]    ← クラス1に91%の確率
#    ...]

transform():変換する

transform() は主に前処理・次元削減の推定器で使うメソッドで、データを変換する。
scaler = StandardScaler()
scaler.fit(X_train)             # 訓練データで平均・標準偏差を学習
X_train_scaled = scaler.transform(X_train)  # 訓練データを変換
X_test_scaled  = scaler.transform(X_test)   # テストデータも同じスケールで変換
fit()transform() をまとめて呼べる fit_transform() も便利だ。
X_train_scaled = scaler.fit_transform(X_train)  # fit() + transform() を一度に
fit_transform()はfit()した後のtransform()と同じ
fit_transform(X_train)fit(X_train) してから transform(X_train) するのと全く同じ結果になる。訓練データに対してだけ使うと覚えておけばOK。テストデータには transform() のみを使う。

3つのメソッドの使い分けまとめ

メソッド誰が使う何をする
fit(X, y)全推定器データから学習してパラメータを記憶する
predict(X)分類・回帰の推定器学習済みモデルでクラス・数値を予測する
transform(X)前処理・次元削減の推定器データを別の表現に変換する

実際に動かしてみる

アヤメ(Iris)データセットを使って、ロジスティック回帰で分類する例を見てみよう。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
 
# データの読み込み
iris = load_iris()
X, y = iris.data, iris.target
 
# 訓練データとテストデータに分割(8:2)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
 
# 前処理:スケーリング(fit は訓練データのみ!)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled  = scaler.transform(X_test)
 
# モデルの学習
model = LogisticRegression()
model.fit(X_train_scaled, y_train)
 
# 予測と評価
y_pred = model.predict(X_test_scaled)
print(f"正解率: {model.score(X_test_scaled, y_test):.3f}")
# → 正解率: 1.000
どのアルゴリズムを使っても fit()predict() という流れは変わらない。これがscikit-learnのシンプルさの本質だ。

まとめ

  • scikit-learnは分類・回帰・クラスタリング・次元削減・モデル評価・前処理の6モジュールで構成されている
  • scikit-learnのすべての学習・変換器は 推定器(Estimator) として統一されたAPIで扱える
  • fit() で学習、predict() で予測、transform() で変換、この3つを覚えればだいたい使える
  • fit()必ず訓練データだけに使う(テストデータに使うとデータリーク)
「どのモデルも同じ書き方で使える」というのは最初は当たり前に感じるが、実際に複数のアルゴリズムを比較するときにこの設計のありがたさが身にしみる。

//Related Posts

Thanks for reading.