Scikit-learn MLPClassifierの使い方を徹底解説!パラメータ設定からコード例まで

Python

機械学習ライブラリScikit-learnには、多種多様なアルゴリズムが実装されており、誰でも手軽に高度なデータ分析を始められます。その中でも、特に強力な分類モデルの一つが**MLPClassifier**です。

MLPClassifierはニューラルネットワークの一種であり、画像分類やテキスト分類など、複雑なパターンを持つデータの識別に高い性能を発揮します。

しかし、「ニューラルネットワークって何だか難しそう…」「パラメータが多くてどう設定すればいいか分からない」と感じる方も多いのではないでしょうか。

この記事では、そんなMLPClassifierの基本的な使い方から、性能を左右する重要なパラメータ、さらには精度をもう一段階引き上げるためのテクニックまで、具体的なコードを交えながら分かりやすく解説します。

この記事を読み終える頃には、あなたもMLPClassifierを自信を持って使いこなせるようになっているはずです。

MLPClassifierとは?

Scikit-learnで簡単に使えるニューラルネットワーク

MLPClassifierは、「Multi-layer Perceptron Classifier」、つまり多層パーセプトロンによる分類器を意味します。

多層パーセプトロンは、人間の脳の神経細胞(ニューロン)の仕組みを模した数学的なモデルで、ニューラルネットワークの基本的な形です。入力層、中間層(隠れ層)、出力層の複数の層で構成され、層の数や各層のニューロン数を増やすことで、非常に複雑なデータの関係性を学習できます。

Scikit-learnを使えば、この強力なモデルを数行のコードで実装できるのが大きな魅力です。

この記事を読めば分かること

  • MLPClassifierの基本的な実装方法
  • モデルの性能を左右する主要なパラメータの意味と設定方法
  • モデルの精度をさらに向上させるための実践的なテクニック

MLPClassifierの基本的な使い方【4ステップで実装】

まずは、MLPClassifierの基本的な使い方を4つのステップに分けて見ていきましょう。ここでは、アヤメの花の品種分類で有名なirisデータセットを使用します。

ステップ1:必要なライブラリのインポートとデータ準備

最初に、必要なライブラリとデータセットを読み込みます。Scikit-learnが未インストールの方は、ターミナルやコマンドプロンプトでpip install scikit-learnを実行してください。

# 必要なライブラリをインポート
import warnings
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# ConvergenceWarningを非表示にする
warnings.filterwarnings('ignore', category=UserWarning)

# 1. データの準備
iris = load_iris()
X, y = iris.data, iris.target

# データを訓練用とテスト用に分割
# test_size=0.3 は、全体の30%をテストデータにすることを意味する
# random_state=0 は、毎回同じように分割するための乱数シード
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

ステップ2:モデルのインスタンス化と学習

次に、MLPClassifierのインスタンスを作成し、訓練データ(X_train, y_train)を使ってモデルを学習させます。fitメソッドを呼び出すだけで学習が実行されます。

# 2. モデルのインスタンス化と学習
# 簡単なモデルを作成(詳細は後述)
model = MLPClassifier(random_state=0, max_iter=1000)

# モデルを学習させる
model.fit(X_train, y_train)

ステップ3:学習済みモデルで予測

学習が完了したモデルを使って、未知のデータ(ここではテストデータ X_test)の結果を予測します。予測にはpredictメソッドを使います。

# 3. テストデータで予測
y_pred = model.predict(X_test)

print("--- 予測結果 ---")
print(y_pred)

ステップ4:精度の評価

最後に、モデルの予測(y_pred)が実際の答え(y_test)とどれくらい一致しているかを評価します。ここでは正解率(Accuracy)を計算します。

# 4. 精度の評価
accuracy = accuracy_score(y_test, y_pred)

print(f"正解率 (Accuracy): {accuracy:.4f}")

以上の4ステップが、MLPClassifierを使った分類の基本的な流れです。非常にシンプルに実装できることがお分かりいただけたかと思います。

【重要】MLPClassifierの主要パラメータを理解しよう

MLPClassifierの真価は、パラメータを調整することで発揮されます。ここでは、特に重要な5つのパラメータを解説します。

hidden_layer_sizes: 隠れ層の構造を決める最重要パラメータ

結論:モデルの複雑さ(表現力)を決定します。

これは、隠れ層の数と、各層に配置するニューロンの数をタプルで指定する最も重要なパラメータです。例えば、(100,)は100個のニューロンを持つ隠れ層が1つ、(50, 30)は50個のニューロンを持つ層と30個のニューロンを持つ層の2層構造を意味します。層を深く、ニューロンを多くするほどモデルは複雑になりますが、過学習のリスクも増えます。

# 隠れ層が2層 (1層目: 50ニューロン, 2層目: 30ニューロン)
model = MLPClassifier(hidden_layer_sizes=(50, 30), random_state=0)

activation: 活性化関数の選択

結論:デフォルトの'relu'がほとんどの場合で良い性能を発揮します。

活性化関数は、ニューロンがどのように発火(活性化)するかを決める関数です。代表的なものに'relu'(正規化線形ユニット)、'tanh'(ハイパボリックタンジェント)、'logistic'(シグモイド関数)があります。'relu'は計算が高速で、多くのケースで高い性能を示すため、最初の選択肢として最適です。

solver: 重みの最適化アルゴリズム

結論:データセットが大きい場合は'adam'、小さい場合は'lbfgs'が推奨されます。

Solverは、モデルの重みをどのように最適化(学習)していくかのアルゴリズムです。

  • 'adam': ほとんどのケースでうまく機能する汎用的な手法。
  • 'sgd': 確率的勾配降下法。パラメータ調整が必要な上級者向け。
  • 'lbfgs': 小規模なデータセットで高い性能を発揮し、高速に収束する傾向があります。

alpha: 過学習を抑制する正則化の強さ

結論:モデルが複雑すぎて訓練データに過剰に適合(過学習)するのを防ぎます。

alphaはL2正則化の強さを決めるパラメータです。値を大きくするほど、モデルの重みが大きい値になることへのペナルティが強くなり、モデルはより単純な形になろうとします。過学習していると感じた場合に、この値を大きくしてみるのが一般的です。デフォルトは0.0001です。

max_iter: 学習の繰り返し回数

結論:学習が収束するまでの最大試行回数です。

モデルの学習が完了(収束)するまでに、重みを更新する計算を繰り返す最大回数を指定します。デフォルトは200です。学習がこの回数内に収束しない場合、警告(ConvergenceWarning)が表示されます。その際は、この値を増やすことで解決することがあります。

MLPClassifierの精度をさらに高めるためのヒント

基本的な使い方とパラメータを理解した上で、さらに精度を高めるための重要なテクニックを2つ紹介します。

必須の前処理:データスケーリング

結論:MLPClassifierを使う前に、必ずデータスケーリングを行いましょう。

ニューラルネットワークは、入力される各特徴量(データの各カラム)のスケール(大きさの範囲)が異なると、うまく学習が進まないという性質があります。

例えば、「年齢」(10〜80)と「年収」(300万〜2000万)のように単位が全く違う特徴量をそのまま入力すると、値が大きい「年収」に学習が引っ張られてしまいます。

StandardScalerなどを使って、各特徴量の平均を0、分散を1に変換(標準化)することで、モデルは効率的に学習できるようになります。

from sklearn.preprocessing import StandardScaler

# スケーラーのインスタンスを作成
scaler = StandardScaler()

# 訓練データでスケーラーを学習させ、そのまま訓練データを変換
X_train_scaled = scaler.fit_transform(X_train)

# 学習させたスケーラーを使って、テストデータを変換
X_test_scaled = scaler.transform(X_test)

# スケール済みデータでモデルを学習
model.fit(X_train_scaled, y_train)

# 精度を評価
accuracy = model.score(X_test_scaled, y_test)
print(f"スケーリング後の正解率: {accuracy:.4f}")

最適なパラメータを見つける:グリッドサーチ

結論:GridSearchCVで最適なパラメータの組み合わせを自動で見つけられます。

hidden_layer_sizesalphaなど、どの値が最適なのかを手動で探すのは大変です。GridSearchCVを使えば、試したいパラメータの候補を複数指定するだけで、それらの全組み合わせを試し、最も性能が良かったものを自動で探し出してくれます。

from sklearn.model_selection import GridSearchCV

# 試行したいパラメータの候補を設定
param_grid = {
    'hidden_layer_sizes': [(50,), (100,), (50, 30)],
    'alpha': [0.0001, 0.001, 0.01],
    'max_iter': [2000] # 収束のために少し多めに設定
}

# グリッドサーチのインスタンスを作成
# cv=5 は5分割交差検証を意味する
grid_search = GridSearchCV(
    MLPClassifier(random_state=0), param_grid, cv=5, verbose=0
)

# グリッドサーチを実行
# スケール済みの全データを使うのが一般的
X_scaled = scaler.fit_transform(X)
grid_search.fit(X_scaled, y)

# 最も性能の良かったパラメータを表示
print("最適なパラメータ:", grid_search.best_params_)
print("その時のスコア:", grid_search.best_score_)

まとめ:MLPClassifierを使いこなして分類マスターに

今回は、Scikit-learnのMLPClassifierについて、基本的な使い方から主要パラメータ、そして精度向上のテクニックまでを解説しました。

  • MLPClassifierは、多層パーセプトロン(ニューラルネットワーク)を手軽に実装できる強力な分類器
  • まずは基本的な4ステップ(準備→学習→予測→評価)で使ってみる
  • hidden_layer_sizesなどのパラメータを理解し、モデルを調整する
  • 精度向上のためには「データスケーリング」がほぼ必須
  • GridSearchCVを使えば、最適なパラメータを効率的に探せる

MLPClassifierは、パラメータが多く奥が深いモデルですが、その分、使いこなせれば非常に高い性能を発揮します。この記事を参考に、ぜひあなたのデータ分析にMLPClassifierを取り入れてみてください!

コメント

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