メールを開いたとき、自動的に「迷惑メール」と「通常メール」に振り分けられている。病院で検査を受けると「陽性」か「陰性」かが判定される。銀行でローンを申し込むと「承認」か「却下」かが決まる。
これらはすべて2値分類(Binary Classification)と呼ばれる仕組みで実現されています。
2値分類とは、データを2つのグループのどちらかに分ける技術のことです。Yes か No、正常か異常、合格か不合格など、私たちの身の回りには「2択で判断する」場面がたくさんありますよね。
機械学習の世界では、この2値分類が最も基本的で、かつ最も実用的な技術の一つとなっています。スパムフィルター、不正検知、病気の診断、顧客の離脱予測など、ビジネスから医療まで、幅広い分野で活用されているんです。
「機械学習って難しそう」と思うかもしれませんが、2値分類の基本的な考え方はとてもシンプルです。コンピュータに「この2つのグループを見分けるルールを学習させる」だけなんですね。
この記事では、2値分類の基本的な仕組みから、実際の使用例、代表的なアルゴリズム、評価方法、実装のコツまで、初心者の方にも分かりやすく解説していきます。
AIが「これはスパムです」「これは猫の画像です」と判断する仕組みを、一緒に学んでいきましょう!
2値分類とは?

2値分類(Binary Classification)とは、データを2つのクラス(カテゴリ)のどちらかに分類する機械学習のタスクです。
「2値」の意味
「2値」は英語で「Binary(バイナリー)」といいます。
コンピュータの世界では「0と1」「オンとオフ」のように、2つの値しか取らないことを指します。2値分類も同じで、答えは必ず2択のどちらかなんですね。
分類の基本的な考え方
人間の判断プロセス
メールを見る
↓
件名や本文をチェック
↓
「怪しい言葉が多い」→ スパムかも
「知っている人から」→ 通常メールかも
↓
判断:スパムか、通常か
機械学習の判断プロセス
メールのデータを入力
↓
学習済みのモデルが特徴を分析
↓
過去のパターンと照合
↓
確率を計算:スパム 85%、通常 15%
↓
出力:スパム
機械学習では、過去の大量のデータから「どんな特徴があればスパムか」を学習し、新しいメールに対して自動的に判断できるようになります。
分類問題の種類
分類問題には、分けるクラスの数によって種類があります。
2値分類(Binary Classification)
- クラス数:2つ
- 例:Yes/No、正常/異常、合格/不合格
多クラス分類(Multi-class Classification)
- クラス数:3つ以上
- 例:動物の種類(犬/猫/鳥/…)、手書き数字認識(0〜9)
多ラベル分類(Multi-label Classification)
- 1つのデータが複数のクラスに属する
- 例:映画のジャンル(アクション+コメディ+恋愛)
2値分類の具体例
身近な例で2値分類を理解しましょう。
例1:スパムメールフィルター
分類対象
メールを「スパム」か「通常メール」に分類
入力データ(特徴量)
- 件名に「無料」「当選」などの言葉が含まれるか
- 差出人のメールアドレスのドメイン
- 本文の長さ
- リンクの数
- HTML形式かテキスト形式か
- 以前にやりとりしたことがあるか
出力
- クラス0:通常メール
- クラス1:スパム
実際の動作
新しいメール受信
↓
特徴量を抽出
件名:「おめでとうございます!1億円当選!」
リンク数:5個
差出人:不明
↓
モデルが予測:スパム確率 98%
↓
迷惑メールフォルダへ移動
例2:病気の診断
分類対象
患者の検査結果から「陽性」か「陰性」を判定
入力データ(特徴量)
- 年齢
- 性別
- 血液検査の数値
- 血圧
- BMI(体格指数)
- 喫煙歴
- 家族歴
出力
- クラス0:陰性(健康)
- クラス1:陽性(疾患あり)
実際の動作
患者の検査データを入力
↓
年齢:55歳、血圧:150/95、血糖値:高め...
↓
モデルが予測:陽性の確率 75%
↓
医師が詳しい検査を実施
例3:クレジットカード不正利用検知
分類対象
取引が「正常」か「不正」かを判定
入力データ(特徴量)
- 取引金額
- 取引時刻
- 取引場所
- 利用頻度
- 過去の平均取引額との差
- 海外取引かどうか
- 短時間での連続取引
出力
- クラス0:正常な取引
- クラス1:不正の疑い
実際の動作
深夜3時に海外で高額取引を検知
↓
通常の利用パターンと大きく異なる
↓
モデルが予測:不正の確率 92%
↓
取引を一時停止し、顧客に確認の連絡
例4:顧客離脱(チャーン)予測
分類対象
顧客が「継続利用」か「サービス解約」かを予測
入力データ(特徴量)
- 利用頻度
- 最終利用日からの経過日数
- カスタマーサポートへの問い合わせ回数
- サービスの利用時間
- 料金プラン
- 契約期間
出力
- クラス0:継続利用
- クラス1:解約の可能性が高い
実際の動作
顧客の行動データを分析
↓
利用頻度が急減、問い合わせ増加...
↓
モデルが予測:解約の確率 80%
↓
リテンション施策(特別オファー)を実施
例5:画像分類
分類対象
画像に「猫」が写っているか、いないか
入力データ(特徴量)
- ピクセルの色情報
- エッジ(輪郭)の形状
- テクスチャ(質感)
- パターンの特徴
出力
- クラス0:猫ではない
- クラス1:猫
実際の動作
画像を入力
↓
ディープラーニングモデルが画像を解析
↓
猫の特徴(耳の形、目の位置など)を検出
↓
モデルが予測:猫の確率 95%
↓
出力:猫
2値分類のプロセス
実際に2値分類モデルを作る手順を見ていきましょう。
ステップ1:問題定義
明確にすべきこと
- 何を予測したいのか?
- どの2つのクラスに分類するのか?
- なぜその分類が必要なのか?
例:スパムフィルター
目的:メールを自動的にスパムと通常に分類したい
クラス:スパム / 通常メール
理由:ユーザーの時間を節約し、セキュリティを向上
ステップ2:データ収集
必要なデータ
- 大量の事例データ
- 各データに正解ラベル(どちらのクラスか)
例:スパムフィルター
データ:過去のメール 10,000通
ラベル:
- 8,000通:通常メール(クラス0)
- 2,000通:スパム(クラス1)
データの質が重要
- 十分な量がある
- バランスが取れている(偏りすぎていない)
- 正しくラベル付けされている
- ノイズ(誤ったデータ)が少ない
ステップ3:特徴量エンジニアリング
特徴量とは?
モデルが判断に使う「手がかり」のことです。
例:スパムフィルター
元データ:
件名「緊急!今すぐクリック」
本文「当選しました。こちらをクリック...」
↓ 特徴量に変換
特徴量:
- 件名の長さ:8文字
- 「緊急」が含まれる:Yes(1)
- 「クリック」が含まれる:Yes(1)
- リンクの数:3個
- 大文字の割合:20%
良い特徴量の条件
- 分類に役立つ情報を含む
- 数値化されている
- ノイズが少ない
- 計算コストが低い
ステップ4:データの分割
訓練データとテストデータに分ける
典型的な分割比率
全データ 10,000件
↓
訓練データ:8,000件(80%)
→ モデルの学習に使用
テストデータ:2,000件(20%)
→ モデルの評価に使用
なぜ分けるのか?
訓練データだけで評価すると、モデルが「訓練データを丸暗記しただけ」の可能性があります。未知のデータ(テストデータ)でテストすることで、本当の実力が分かるんですね。
ステップ5:モデルの選択と学習
アルゴリズムを選ぶ
- ロジスティック回帰
- 決定木
- ランダムフォレスト
- サポートベクターマシン(SVM)
- ニューラルネットワーク
学習プロセス
1. 訓練データを入力
2. モデルが特徴量とラベルの関係を学習
3. パラメータを調整
4. 予測精度を最大化
ステップ6:モデルの評価
テストデータで性能を測定
- 正解率(Accuracy)
- 適合率(Precision)
- 再現率(Recall)
- F1スコア
これらの指標については後ほど詳しく説明します。
ステップ7:チューニングと改善
性能が不十分な場合
- 特徴量を追加・改善
- 異なるアルゴリズムを試す
- ハイパーパラメータを調整
- データを追加収集
ステップ8:デプロイ(実運用)
実際のシステムに組み込む
新しいメール受信
↓
学習済みモデルで予測
↓
スパムフォルダへ移動
代表的な2値分類アルゴリズム
実際に使われる主なアルゴリズムを紹介します。
1. ロジスティック回帰
概要
最もシンプルで広く使われる2値分類アルゴリズムです。
仕組み
データが各クラスに属する確率を計算します。
数式(イメージ)
確率 = 1 / (1 + e^(-スコア))
スコア = 特徴量1 × 重み1 + 特徴量2 × 重み2 + ...
確率が0.5以上ならクラス1、未満ならクラス0と判定します。
メリット
- 計算が高速
- 解釈しやすい
- 実装が簡単
- 大規模データにも対応
デメリット
- 複雑な非線形パターンには弱い
- 特徴量の前処理が重要
使用例
- スパムフィルター
- クリック率予測
- 病気の診断
2. 決定木(Decision Tree)
概要
Yes/Noの質問を繰り返して分類する方法です。
仕組み
メールの例:
件名に「無料」が含まれる?
├─ Yes → リンクが5個以上?
│ ├─ Yes → スパム
│ └─ No → 差出人は不明?
│ ├─ Yes → スパム
│ └─ No → 通常
└─ No → 過去にやりとりあり?
├─ Yes → 通常
└─ No → 本文が短い?
├─ Yes → スパム
└─ No → 通常
メリット
- 視覚的に理解しやすい
- 特徴量の前処理が不要
- 非線形パターンに対応
デメリット
- 過学習しやすい
- データの変動に敏感
使用例
- 顧客セグメンテーション
- リスク評価
- 医療診断
3. ランダムフォレスト
概要
複数の決定木の「多数決」で判断する方法です。
仕組み
100本の決定木を作成
↓
各決定木が予測
決定木1:スパム
決定木2:通常
決定木3:スパム
...
↓
多数決:
スパム 75票、通常 25票
↓
結果:スパム
メリット
- 精度が高い
- 過学習しにくい
- 特徴量の重要度が分かる
- ロバスト(安定している)
デメリット
- 計算コストが高い
- 解釈がやや難しい
使用例
- 不正検知
- 信用スコアリング
- 病気の診断
4. サポートベクターマシン(SVM)
概要
2つのクラスを最も良く分ける「境界線」を見つける方法です。
仕組み
データを高次元空間にマッピングして、最適な分離超平面を探します。
イメージ
2次元平面上のデータ:
○ ○ ○ × × ×
○ ○ × × ×
○ ○ × × ×
| ← この線で分離
メリット
- 高次元データに強い
- 精度が高い
- 理論的に美しい
デメリット
- 大規模データでは遅い
- パラメータ調整が重要
- 解釈が難しい
使用例
- 画像分類
- テキスト分類
- 手書き文字認識
5. ニューラルネットワーク
概要
人間の脳の神経細胞を模倣した学習モデルです。
仕組み
入力層 → 隠れ層1 → 隠れ層2 → ... → 出力層
(特徴量)(計算) (計算) (確率)
各層で複雑な計算を重ねることで、高度なパターンを学習します。
メリット
- 非常に複雑なパターンを学習可能
- 画像、音声、テキストなど多様なデータに対応
- 最新の技術では最高精度
デメリット
- 大量のデータが必要
- 計算コストが非常に高い
- ブラックボックス(解釈が困難)
- ハイパーパラメータが多い
使用例
- 画像認識
- 音声認識
- 自然言語処理
評価指標
モデルの性能をどう測るか、詳しく見ていきましょう。
混同行列(Confusion Matrix)
予測結果を整理した表です。
実際
陽性 陰性
予測 陽性 TP(50) FP(10)
陰性 FN(5) TN(935)
4つの要素
- TP(True Positive):正しく陽性と予測(真陽性)
- TN(True Negative):正しく陰性と予測(真陰性)
- FP(False Positive):誤って陽性と予測(偽陽性)
- FN(False Negative):誤って陰性と予測(偽陰性)
1. 正解率(Accuracy)
定義
全体のうち、正しく予測できた割合
計算式
正解率 = (TP + TN) / (TP + TN + FP + FN)
例
TP=50, TN=935, FP=10, FN=5
正解率 = (50 + 935) / (50 + 935 + 10 + 5) = 985 / 1000 = 98.5%
注意点
データが偏っている場合は注意が必要です。
不均衡データの例
1000件中、陽性が10件、陰性が990件
全部を「陰性」と予測すると...
正解率 = 990 / 1000 = 99%
でも、陽性を1つも当てられていない!
このような場合、正解率だけでは不十分なんですね。
2. 適合率(Precision)
定義
「陽性」と予測したもののうち、実際に陽性だった割合
計算式
適合率 = TP / (TP + FP)
例
TP=50, FP=10
適合率 = 50 / (50 + 10) = 50 / 60 = 83.3%
意味
「このモデルが陽性と判断したら、83.3%の確率で本当に陽性」
重視する場面
偽陽性(FP)を減らしたいとき
- スパムフィルター:通常メールを誤ってスパムにしたくない
- 不正検知:正常な取引を誤ってブロックしたくない
3. 再現率(Recall / Sensitivity)
定義
実際の陽性のうち、正しく陽性と予測できた割合
計算式
再現率 = TP / (TP + FN)
例
TP=50, FN=5
再現率 = 50 / (50 + 5) = 50 / 55 = 90.9%
意味
「実際の陽性のうち、90.9%を正しく見つけられた」
重視する場面
偽陰性(FN)を減らしたいとき
- 病気の診断:病気を見逃したくない
- 不正検知:不正を見逃したくない
4. F1スコア
定義
適合率と再現率の調和平均
計算式
F1 = 2 × (適合率 × 再現率) / (適合率 + 再現率)
例
適合率=83.3%, 再現率=90.9%
F1 = 2 × (0.833 × 0.909) / (0.833 + 0.909) = 0.869 = 86.9%
メリット
適合率と再現率のバランスを1つの指標で表現できます。
5. ROC曲線とAUC
ROC曲線(Receiver Operating Characteristic curve)
横軸に偽陽性率、縦軸に真陽性率をプロットしたグラフです。
AUC(Area Under the Curve)
ROC曲線の下側の面積。0.5〜1.0の値を取ります。
評価基準
- 0.9〜1.0:優秀
- 0.8〜0.9:良好
- 0.7〜0.8:まあまあ
- 0.5〜0.7:要改善
- 0.5:ランダム(コイン投げと同じ)
メリット
閾値(しきい値)に依存しない総合的な評価ができます。
トレードオフの関係
適合率と再現率にはトレードオフがあります。
閾値による調整
モデルは通常、確率を出力します。その確率をもとに、どちらのクラスに分類するかを決めます。
例:病気の診断
患者A:陽性の確率 85%
患者B:陽性の確率 55%
患者C:陽性の確率 30%
閾値を50%に設定
患者A:85% ≥ 50% → 陽性
患者B:55% ≥ 50% → 陽性
患者C:30% < 50% → 陰性
閾値を変えると…
閾値を下げる(例:30%)
より多くの人を「陽性」と判定
↓
再現率:上がる(病気を見逃しにくい)
適合率:下がる(健康な人も陽性になる)
閾値を上げる(例:80%)
確実な場合のみ「陽性」と判定
↓
適合率:上がる(陽性と言ったら本当に陽性)
再現率:下がる(病気を見逃す可能性)
どちらを重視すべきか?
再現率を重視する場面
見逃しが致命的な場合
- がんの診断:見逃すと命に関わる
- 不正検知:不正を見逃すと大損害
- セキュリティ:侵入を見逃すと危険
適合率を重視する場面
誤検知のコストが高い場合
- スパムフィルター:大事なメールを捨てたくない
- 犯罪予測:無実の人を疑いたくない
Pythonでの実装例
実際にPythonで2値分類を実装してみましょう。
必要なライブラリ
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix, classification_report
データの準備
# サンプルデータの作成(実際は外部ファイルから読み込むことが多い)
from sklearn.datasets import make_classification
# 1000件のデータ、5つの特徴量
X, y = make_classification(n_samples=1000, n_features=5,
n_informative=3, n_redundant=2,
random_state=42)
# データフレームに変換
df = pd.DataFrame(X, columns=['特徴1', '特徴2', '特徴3', '特徴4', '特徴5'])
df['ラベル'] = y
# データの確認
print(df.head())
print(f"クラス0の数: {sum(y==0)}")
print(f"クラス1の数: {sum(y==1)}")
データの分割
# 特徴量とラベルに分離
X = df.drop('ラベル', axis=1)
y = df['ラベル']
# 訓練データとテストデータに分割(80%:20%)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"訓練データ: {len(X_train)}件")
print(f"テストデータ: {len(X_test)}件")
モデルの学習
# ロジスティック回帰モデルを作成
model = LogisticRegression(random_state=42)
# モデルを訓練データで学習
model.fit(X_train, y_train)
print("モデルの学習が完了しました")
予測
# テストデータで予測
y_pred = model.predict(X_test)
# 予測確率も取得
y_pred_proba = model.predict_proba(X_test)
# 結果の一部を表示
print("予測結果の例:")
for i in range(5):
print(f"データ{i+1}: 予測={y_pred[i]}, 実際={y_test.iloc[i]}, "
f"確率=[{y_pred_proba[i][0]:.2f}, {y_pred_proba[i][1]:.2f}]")
評価
# 各種評価指標を計算
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print("\n=== 評価結果 ===")
print(f"正解率: {accuracy:.4f}")
print(f"適合率: {precision:.4f}")
print(f"再現率: {recall:.4f}")
print(f"F1スコア: {f1:.4f}")
# 混同行列
print("\n混同行列:")
cm = confusion_matrix(y_test, y_pred)
print(cm)
# 詳細レポート
print("\n分類レポート:")
print(classification_report(y_test, y_pred))
他のアルゴリズムとの比較
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
# 複数のモデルを試す
models = {
'ロジスティック回帰': LogisticRegression(random_state=42),
'決定木': DecisionTreeClassifier(random_state=42),
'ランダムフォレスト': RandomForestClassifier(random_state=42),
'SVM': SVC(random_state=42)
}
results = []
for name, model in models.items():
# 学習
model.fit(X_train, y_train)
# 予測
y_pred = model.predict(X_test)
# 評価
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
results.append({
'モデル': name,
'正解率': accuracy,
'適合率': precision,
'再現率': recall,
'F1': f1
})
# 結果を表にまとめて表示
results_df = pd.DataFrame(results)
print("\n=== モデル比較 ===")
print(results_df)
よくある課題と対策
実際にプロジェクトで直面する問題と解決方法です。
問題1:不均衡データ(Imbalanced Data)
症状
一方のクラスが圧倒的に多い(例:正常99%、異常1%)
なぜ問題か?
モデルが「全部を多数派に分類」するだけで高い正解率が出てしまいます。
対策
1. データのリサンプリング
from imblearn.over_sampling import SMOTE
# 少数派クラスを増やす
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
2. クラスの重み付け
# 少数派クラスに大きな重みを付ける
model = LogisticRegression(class_weight='balanced')
3. 評価指標の変更
正解率ではなく、F1スコアやAUCを重視します。
問題2:過学習(Overfitting)
症状
訓練データでは高精度だが、テストデータで性能が落ちる
原因
- モデルが複雑すぎる
- 訓練データが少ない
- 特徴量が多すぎる
対策
1. 正則化
# L2正則化(Ridge)
model = LogisticRegression(penalty='l2', C=0.1)
2. クロスバリデーション
from sklearn.model_selection import cross_val_score
# 5分割交差検証
scores = cross_val_score(model, X_train, y_train, cv=5)
print(f"平均スコア: {scores.mean():.4f}")
3. データの追加
より多くの訓練データを集める
4. 特徴量選択
重要な特徴量だけを使う
問題3:特徴量のスケールの違い
症状
異なる単位の特徴量が混在(例:年齢0-100、年収0-10,000,000)
なぜ問題か?
一部のアルゴリズム(SVM、ニューラルネットワーク)は、スケールの違いに敏感です。
対策
標準化(Standardization)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
正規化(Normalization)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
問題4:欠損値(Missing Values)
症状
データに空白や欠損がある
対策
1. 削除
# 欠損値を含む行を削除
df = df.dropna()
2. 補完
from sklearn.impute import SimpleImputer
# 平均値で補完
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)
3. 欠損フラグの追加
# 欠損していたかどうかを新しい特徴量にする
df['年齢_欠損'] = df['年齢'].isna().astype(int)
問題5:カテゴリカル変数の扱い
症状
性別、都道府県など、数値でない特徴量がある
対策
ワンホットエンコーディング
import pandas as pd
# カテゴリを複数の0/1列に変換
df_encoded = pd.get_dummies(df, columns=['性別', '都道府県'])
ラベルエンコーディング
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['性別_encoded'] = le.fit_transform(df['性別'])
実務での注意点
実際のプロジェクトで気をつけるべきポイントです。
1. ビジネス目標との整合性
技術的な精度だけでなく、ビジネス価値を考える
例:スパムフィルター
目標:ユーザーの時間を節約する
↓
重視すべき:適合率(誤検知を減らす)
理由:大事なメールを見逃すと問題
2. 解釈可能性
モデルの判断根拠を説明できるか?
金融や医療など、説明責任が求められる分野では、シンプルで解釈しやすいモデル(ロジスティック回帰、決定木)が好まれることがあります。
3. 運用コスト
リアルタイム予測が必要か?
- 計算時間
- サーバーリソース
- モデルの更新頻度
4. データの継続的な収集
モデルは時間とともに劣化する
ユーザーの行動やトレンドが変化すると、モデルの精度が落ちます。定期的な再学習が必要です。
5. エラー処理
予測が失敗したときの対応
- フォールバック(代替手段)
- 人間による確認
- ログの記録
まとめ
2値分類は、機械学習の基本であり、最も実用的な技術の一つです。
スパムフィルターから病気の診断まで、私たちの生活のあらゆる場面で活躍しています。
この記事のポイント
- 2値分類はデータを2つのクラスに分ける機械学習タスク
- Yes/No、正常/異常など、2択で判断する場面で使われる
- スパムフィルター、病気診断、不正検知など多様な応用例
- 主なアルゴリズム:ロジスティック回帰、決定木、ランダムフォレスト、SVM、ニューラルネットワーク
- 評価指標:正解率、適合率、再現率、F1スコア、AUC
- 適合率と再現率にはトレードオフがある
- 不均衡データ、過学習、欠損値などの課題に対処が必要
- ビジネス目標に合わせた評価指標の選択が重要
- Pythonのscikit-learnで簡単に実装可能
初心者へのアドバイス
まずは身近な問題から始めてみましょう。
- 自分のメールをスパムと通常に分類
- 映画のレビューをポジティブ/ネガティブに分類
- アイリスデータセットで2種類の花を分類
小さなデータセットで基本を学び、徐々に複雑な問題に挑戦していけば、いつの間にか実践的なスキルが身についているはずです。
2値分類をマスターすれば、機械学習の世界への第一歩を踏み出したことになります。
あなたも実際にコードを書いて、AIに「判断」を学習させる面白さを体験してみてください!


コメント