3つ以上の選択肢から答えを選ぶAIの仕組み
多クラス分類とは?
多クラス分類とは、機械学習における「分類」タスクの一種で、データを3つ以上のカテゴリ(クラス)に分ける手法のことです。身近な例で言えば、果物の写真を見て「りんご」「バナナ」「みかん」のどれかを当てるような問題が多クラス分類にあたります。
これは、事前に正解が分かっているデータ(教師データ)を使ってモデルを学習させる「教師あり学習」という手法の一つです。コンピュータにたくさんの写真と、それがどの果物であるかという正解ラベルをセットで学習させることで、新しい写真を見せたときに、それがどの果物であるかを高い精度で予測できるようになります。
2クラス分類との違い
多クラス分類を理解するために、よりシンプルな「2クラス分類(二値分類)」と比較してみましょう。2クラス分類は、その名の通り、データを2つのカテゴリに分ける手法です。
例えば、「メールがスパムか、スパムでないか」「クレジットカードの取引が不正か、正常か」といった、Yes/Noや真/偽で答えられる問題が2クラス分類に該当します。
項目 | 2クラス分類 (Binary Classification) | 多クラス分類 (Multi-class Classification) |
---|---|---|
分類するカテゴリ数 | 2つ | 3つ以上 |
具体例 |
|
|
主な手法 | ロジスティック回帰(シグモイド関数) | 1対多法、1対1法、ソフトマックス関数 |
多クラス分類の代表的な手法
2クラス分類を応用して多クラス分類を実現する方法や、多クラス分類に特化した方法など、いくつか代表的な手法があります。
1対多(One-vs-Rest / One-vs-All)
「あるクラス」か「それ以外か」を判定する2クラス分類器を、クラスの数だけ用意する方法です。例えば、「A, B, C」の3クラスに分類したい場合、以下の3つの分類器を作ります。
- 「A」か「A以外(B, C)」かを判定する分類器
- 「B」か「B以外(A, C)」かを判定する分類器
- 「C」か「C以外(A, B)」かを判定する分類器
新しいデータを予測する際は、これら3つの分類器すべてで判定を行い、最も「Aらしい」「Bらしい」「Cらしい」とスコアが高かったクラスに分類します。
1対1(One-vs-One)
すべてのクラスのペアで2クラス分類器を作る方法です。同じく「A, B, C」の3クラスの場合、以下の組み合わせの分類器を用意します。
- 「A」か「B」かを判定する分類器
- 「A」か「C」かを判定する分類器
- 「B」か「C」かを判定する分類器
予測時は、すべての分類器で多数決を行い、最も多く票を獲得したクラスに分類します。クラス数が多くなると、作成する分類器の数が爆発的に増えるという特徴があります。
ソフトマックス関数
主にニューラルネットワークの出力層で使われる関数で、複数のクラス分類を一度に行うことができます。ソフトマックス関数は、各クラスに分類される「確率」を計算します。例えば、ある画像を入力したときに、以下のような出力を返します。
- 犬である確率: 70%
- 猫である確率: 20%
- 鳥である確率: 10%
この場合、合計は100%になり、最も確率が高い「犬」が予測結果として採用されます。
Python (scikit-learn)での簡単なコード例
Pythonの機械学習ライブラリである`scikit-learn`を使うと、簡単に多クラス分類を試すことができます。ここでは、有名なアヤメ(Iris)のデータセットを使って、3種類のアヤメを分類する例を紹介します。このデータセットは、統計学者ロナルド・フィッシャーによって1936年に紹介されました。
# 必要なライブラリをインポート
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# アヤメのデータセットを読み込む
iris = load_iris()
X, y = iris.data, iris.target
# データを訓練用とテスト用に分割する
# test_size=0.3 は、全体の30%をテストデータにすることを意味する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# モデルを作成し、訓練する
# ロジスティック回帰を使用(scikit-learnでは自動的に多クラス分類に対応)
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
# テストデータで予測を行う
y_pred = model.predict(X_test)
# 予測の精度(正解率)を計算して表示する
accuracy = accuracy_score(y_test, y_pred)
print(f"モデルの正解率: {accuracy:.2f}")
# 実際の予測例
# 1番目のテストデータの予測結果
predicted_class = model.predict([X_test])
predicted_class_name = iris.target_names[predicted_class]
print(f"1番目のテストデータの特徴量: {X_test}")
print(f"予測されたアヤメの種類: {predicted_class_name}")
まとめ
多クラス分類は、3つ以上の選択肢から1つを選ぶ、現実世界で非常に役立つ機械学習の手法です。2クラス分類との違いや、代表的な手法を理解することで、AIがどのように物事を判断しているのか、その基本的な仕組みを掴むことができます。プログラミングの知識があれば、`scikit-learn`のようなライブラリを使って、誰でも手軽に多クラス分類を試すことが可能です。