はじめに
多ラベルの分類問題は、各インスタンスが複数のクラスに属する可能性がある状況で頻繁に遭遇します。データセットの分割方法が結果に大きな影響を及ぼす可能性がありますので、この種の問題に対してクロスバリデーションを正しく適用することは非常に重要です。本記事では、iterstratライブラリのMultilabelStratifiedKFoldを使用して、層化クロスバリデーションを実装する方法を紹介します。
# 必要なライブラリのインポート
from iterstrat.ml_stratifiers import MultilabelStratifiedKFold
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
import numpy as np
import pandas as pd
データの準備
まずは、sklearn.datasetsからload_iris関数を使用してirisデータセットをロードします。このデータセットには4つの特徴量と3つのクラス(setosa, versicolor, virginica)が含まれています。
# データの読み込み
iris = load_iris()
X = iris.data
y = iris.target
層化クロスバリデーションの実装
MultilabelStratifiedKFoldクラスを使用して層化クロスバリデーションを実装します。ここでは、5分割することにします。
# ラベルをマルチラベル形式に変換
y_multilabel = pd.get_dummies(y).values
# MultilabelStratifiedKFoldのインスタンスを作成
mskf = MultilabelStratifiedKFold(n_splits=5, shuffle=True, random_state=0)
# クロスバリデーションを実行
for train_index, test_index in mskf.split(X, y_multilabel):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
# モデルの学習と予測
model = RandomForestClassifier(n_estimators=100, random_state=0)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# 性能評価
print(classification_report(y_test, y_pred))
以上で、Pythonでの多ラベル分類問題に対する層化クロスバリデーションの実装方法について解説しました。