Menu
CoddyTech

不均衡クラス

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 24/58。

100人の患者のうち95人が健康なとき、常に「健康」と予測するモデルは精度95%を達成しますが、誰も見つけられません。クラスが不均衡な場合、精度は実態よりよく見せます。

病気の患者が5%いるデータに対する3つのモデルの精度と再現率の棒グラフ。常に健康と予測するモデル:精度0.95、再現率0.00。通常のモデル:0.98と0.62。バランス調整済みモデル:0.94と0.92

2つの修正です。stratify=y は両方のデータセットで95対5の割合を維持するため、テストセットに病気の患者が含まれ、検出できます。class_weight="balanced" は、各希少クラスの行の重みを大きくします。

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=0, stratify=y)
model = LogisticRegression(max_iter=1000, class_weight="balanced")

バランス型モデルは、より多くのケースを検出するために、精度を少し犠牲にします。まれなケースでは、正解率ではなく再現率と適合率を確認しましょう。

challenge icon

チャレンジ

中級

工場のベアリングの約5%は早期に故障します。スターターコードでは、テストベンチの記録を分割して通常のモデルを評価しますが、テストセットに含まれる故障ベアリングはわずか2個なので、0.993という値はあまり意味がありません。

  1. 両方のセットで故障ベアリングの割合が同じになるように分割を修正してください。
  2. 故障した行に大きな重みを付ける2つ目のモデルを学習させ、以下のようにその結果の行を出力してください。

別のテストベンチの場合:

Faulty bearings: train 8.1%, test 7.8%
Plain: accuracy 0.947, recall 0.417
Balanced: accuracy 0.900, recall 0.833

自分で試してみよう

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, recall_score

# 試験台のベアリングごとに1行:faulty が 1 なら、その後まもなく故障したことを意味する
parts = pd.read_csv("bearings.csv")
features = ["vibration_mm_s", "temp_c", "noise_db", "hours_k"]
X = parts[features]
y = parts["faulty"]

# このデータ分割を修正する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
print(f"Faulty bearings: train {y_train.mean() * 100:.1f}%, test {y_test.mean() * 100:.1f}%")

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

plain = LogisticRegression(max_iter=1000)
plain.fit(X_train, y_train)
pred = plain.predict(X_test)
print(f"Plain: accuracy {accuracy_score(y_test, pred):.3f}, recall {recall_score(y_test, pred):.3f}")

# 以下にコードを書く
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師あり学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ