別名・略称:F-measure、 F-score、 F1-score、 Sørensen-Dice 係数(数式的に同等)
F1 スコアは Precision と Recall の調和平均。 「両方が高い時のみ高くなる」厳しい評価指標で、 不均衡データの分類性能評価で標準的に使われます。
🍰 まずはやさしく
2つの指標をまとめた、厳しい判定基準です。
正解率の偏りをなくして評価するために使います。
スマホの迷惑メール判定などの精度を測ります。
F1スコアの結論について読みましょう。
F1 スコア(F1 Score):Precision と Recall の調和平均で、 両方が高いときのみ高くなる
🍰 まずはやさしく
2つの視点を1つにまとめる、便利な道具です。
モデルの性能を正しく判断するために使います。
部活のメンバー選びのように、複数の条件で考えます。
F1スコアが使われる場面について読みましょう。
🍰 まずはやさしく
ズルい結果を見抜く、厳しい先生のような指標です。
片方だけが良い状態を防ぐために使います。
テストの1科目だけ満点でも、平均は低くなる例です。
なぜこの計算方法なのかを直感的に読みましょう。
Precision=0.9、 Recall=0.1 のケースを考えます。 算術平均なら (0.9+0.1)/2 = 0.5 で「まあまあ」に見える。 しかし調和平均は $2 \cdot 0.9 \cdot 0.1 / (0.9 + 0.1) = 0.18$。 片方が極端に低いと全体も低くなる ので、 「片方だけ最適化したズルいモデル」を看破できます。
| Precision | Recall | 算術平均 | F1(調和平均) | 評価 |
|---|---|---|---|---|
| 0.90 | 0.10 | 0.50 | 0.18 | 片方極小は厳しく評価 |
| 0.50 | 0.50 | 0.50 | 0.50 | 対等なら同じ |
| 0.80 | 0.80 | 0.80 | 0.80 | 両方良いと高い |
| 1.00 | 0.50 | 0.75 | 0.67 | 片方低いと引き下げ |
「迷惑メール」予測モデル。 100 件のメールのうち真のスパム 40 件、 モデルが 50 件をスパムと予測、 そのうち真スパムが 35 件。
定食屋の評価が「味」と「量」だけだとする。 味 10/10 だが量 1/10(一口で終わる)なら、 算術平均 5.5 で「まあまあ」だが実際は不満が爆発する。 F1(調和平均)は「味 1.8/10 相当」と低く評価し、 君の体感に近い数字を返す。 これが F1 の本質 — 「片方が極端に弱ければ全体も弱い」と評価する厳しさが、 Precision と Recall の不均衡を見抜く。
| モデル | TP | FP | FN | Precision | Recall | F1 |
|---|---|---|---|---|---|---|
| 常に「増加」予測 | 7 | 40 | 0 | 0.149 | 1.000 | 0.259 |
| 厳格モデル | 5 | 0 | 2 | 1.000 | 0.714 | 0.833 |
| バランスモデル | 6 | 2 | 1 | 0.750 | 0.857 | 0.800 |
「常に増加」モデルは Recall 1.0 だが Precision 0.149 で F1 0.259 と低評価。 算術平均なら 0.575 で見逃すが、 調和平均はズルを許さない。
ここは 分類 ページの混同行列ビジュアライザとは重複しない、 F1 = 調和平均そのものの性質に特化した体験ゾーン。 適合率 P と再現率 R を動かして、 算術平均 (P+R)/2 と F1(調和平均)2PR/(P+R) が どれだけ乖離するかを目で見る。 F1 は 小さい方の値に強く引っ張られる —— この一点さえ体感できれば「なぜ算術平均ではダメか」が腹落ちする。
平均の大小関係は常に 調和平均 ≤ 幾何平均 ≤ 算術平均(P,R>0)。 等号は P=R のときだけ。 乖離 算術平均 − F1 = 0.320。
TN は F1 に一切効かない(分母 2TP+FP+FN に現れない)ことも確認できる。
上のウィジェット A の P・R(P=0.90, R=0.10)をそのまま使用。 β を切り替えて、 どちらを重視するかで値がどう変わるかを見る。
🍰 まずはやさしく
計算式で表した、正確なものさしです。
数値として正しく評価するために使います。
買い物でコスパを計算するように、式に当てはめます。
F1スコアの具体的な数式について読みましょう。
F1 スコアが二値分類を超えて多クラス分類に拡張されるとき、 3 種類の平均方法(macro / micro / weighted)が用意されており、 不均衡なクラス分布でこれらの値が大きく異なることがあります。 SSDSE-B-2026 の 47 都道府県を 「人口規模 3 クラス(小・中・大)」 に分けて、 macro F1 と micro F1 の違いを実値で観察します。
47 都道府県の総人口を 3 クラスに分割:「小(<100 万、 10 県)」「中(100-300 万、 27 県)」「大(≥300 万、 10 県)」。 出生数・日本人人口・合計特殊出生率を特徴量にしたロジスティック回帰で予測した時の F1 を 3 平均で比較。
🎯 このコードでやること: SSDSE-B-2026 (2023) の 47 都道府県を人口 3 クラスに分け、 ロジスティック回帰で予測。 macro / micro / weighted F1 と各クラス F1 を比較し、 不均衡時の挙動を観察する。
📥 入力データ: SSDSE-B-2026.csv 総人口 A1101、 日本人人口 A1102、 出生数 A4101、 合計特殊出生率 A4103
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import pandas as pd import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.metrics import f1_score, classification_report from sklearn.preprocessing import StandardScaler df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026']==2023].reset_index(drop=True) # 3 クラス化 def to_class(p): if p < 1_000_000: return 0 # 小 if p < 3_000_000: return 1 # 中 return 2 # 大 y = d['A1101'].apply(to_class).values X = StandardScaler().fit_transform(d[['A1102','A4101','A4103']].values) pred = LogisticRegression(max_iter=500).fit(X, y).predict(X) print(f'クラス内訳: 小={sum(y==0)}, 中={sum(y==1)}, 大={sum(y==2)}') print() print(f'macro F1: {f1_score(y, pred, average="macro"):.4f}') print(f'micro F1: {f1_score(y, pred, average="micro"):.4f}') print(f'weighted F1: {f1_score(y, pred, average="weighted"):.4f}') print(f'クラスごと F1: {f1_score(y, pred, average=None)}') print() print(classification_report(y, pred, target_names=['小','中','大'], digits=3)) |
📤 実行結果:
💬 結果の読み方: macro F1 (0.658) < weighted F1 (0.725) < micro F1 (0.787)。 小クラス(10 件)の F1 = 0.182(recall 0.100 と低迷)が全クラス対等の macro を大きく引き下げる一方、 micro/weighted は多数派の中・大クラスの高い F1 に引っ張られて高くなる。 不均衡データで 「少数クラスをきちんと評価したい」なら macro、 「全体性能を素直に出したい」なら micro。 業務目的に合わせて選択。
🎯 このコードでやること: sklearn fbeta_score で β=0.5(Precision 重視)、 β=1(標準 F1)、 β=2(Recall 重視)を比較。 業務コストに応じた指標選択を学ぶ。
📥 入力データ: SSDSE-B-2026 (2023) 二値分類(人口 300 万超を陽性)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import pandas as pd import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.metrics import fbeta_score, precision_score, recall_score from sklearn.preprocessing import StandardScaler df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026']==2023].reset_index(drop=True) y = (d['A1101'] > 3_000_000).astype(int).values X = StandardScaler().fit_transform(d[['A4101']].values) proba = LogisticRegression().fit(X, y).predict_proba(X)[:, 1] print(f'{"閾値":<8}{"P":<8}{"R":<8}{"F0.5":<8}{"F1":<8}{"F2":<8}') for t in [0.20, 0.30, 0.50, 0.70, 0.80, 0.90]: pred = (proba >= t).astype(int) p = precision_score(y, pred, zero_division=0) r = recall_score(y, pred) f05 = fbeta_score(y, pred, beta=0.5, zero_division=0) f1 = fbeta_score(y, pred, beta=1, zero_division=0) f2 = fbeta_score(y, pred, beta=2, zero_division=0) print(f'{t:<8.2f}{p:<8.3f}{r:<8.3f}{f05:<8.3f}{f1:<8.3f}{f2:<8.3f}') |
📤 実行結果:
💬 結果の読み方: 閾値 0.20 で F0.5=F1=F2=1.0 のスイートスポット。 この分類では Precision が全閾値で 1.0 を維持し、 閾値を上げるほど Recall だけが下がるため、 F2(Recall 重視)が F0.5(Precision 重視)より速く低下する。 業務で「FN が許せない」(がん検診)なら低めの閾値を F2 で選び、 「FP が許せない」(スパム)なら F0.5 で選定。
zero_division 引数で挙動制御。 デフォルト warn → 0 を返すが業務によっては NaN として扱うべき。Precision | Recall | 混同行列 | Accuracy | AUC | ROC 曲線 | Precision-Recall 曲線 | クラス不均衡 | 分類 | 交差検証
F1 スコアは「分類モデルが Precision と Recall のどちらにも偏らず、 バランスよく予測できているか」を一つの数字で要約する。 ここでは 3 つの概念図を使って、 F1 が分類評価のどの位置にあるかを視覚的に整理する。
SSDSE-B-2026 で「人口 > 500 万人」を陽性として、 「有業者数 > 300 万人」を予測した時の F1 スコアを計算します。 Precision と Recall の両方を求めてから調和平均で集約します。
| 都道府県 | 人口(千) | 有業者数(千) | 真陽性? | 予測陽性? | 分類 |
|---|---|---|---|---|---|
| 東京都 | 14043 | 8048 | Y | Y | TP |
| 神奈川県 | 9237 | 4836 | Y | Y | TP |
| 大阪府 | 8784 | 4498 | Y | Y | TP |
| 愛知県 | 7512 | 4042 | Y | Y | TP |
| 北海道 | 5092 | 2455 | Y | N | FN |
| 静岡県 | 3556 | 1843 | N | N | TN |
47 件で計算すると TP=4, FP=0, FN=1(北海道を見逃し), TN=42 → Precision = 4/4 = 1.000、 Recall = 4/5 = 0.800、 F1 = 2·1.0·0.8/(1.0+0.8) = 0.889。 算術平均なら 0.900 だが、 調和平均はやや低い。 閾値を下げ「有業者数 > 200 万」にすると Recall は上がるが Precision が下がり、 F1 のバランスを取るのが業務での閾値選択のキモ。
| 予測閾値(有業者数) | TP | FP | FN | Precision | Recall | F1 |
|---|---|---|---|---|---|---|
| 100 万 | 5 | 30 | 0 | 0.143 | 1.000 | 0.250 |
| 200 万 | 5 | 8 | 0 | 0.385 | 1.000 | 0.556 |
| 250 万 | 5 | 2 | 0 | 0.714 | 1.000 | 0.833 |
| 300 万 | 4 | 0 | 1 | 1.000 | 0.800 | 0.889 |
| 400 万 | 3 | 0 | 2 | 1.000 | 0.600 | 0.750 |
閾値 300 万で F1 = 0.889 が最大。 閾値を下げ過ぎると FP が爆発(F1↓)、 上げ過ぎると FN が増える(F1↓)。 F1 最大化点が「業務的に最もバランスのよい閾値」。
合成 3 クラスでクラス別 F1 のマクロ/マイクロ平均を計算する。
| クラス | P | R | F1 | サポート |
|---|---|---|---|---|
| A | 0.90 | 0.80 | 0.847 | 100 |
| B | 0.70 | 0.60 | 0.646 | 80 |
| C | 0.50 | 0.40 | 0.444 | 20 |
1 2 3 4 5 | import numpy as np f1 = np.array([0.847, 0.646, 0.444]) sup = np.array([100, 80, 20]) print(f"マクロ F1: {f1.mean():.3f}") print(f"加重 F1: {(f1*sup).sum()/sup.sum():.3f}") |
💬 手計算 (Step 2,3) 0.646 / 0.726 と Python 出力が完全一致。
クラスが 3 つ以上あるとき、F1 は「クラスごとに 1 つずつ」出ます。それを 1 つの数字にまとめる方法が 3 通りあり、 どれを選んだかで結論が変わります。SSDSE-B-2026(2023 年・47 都道府県)で、総人口を三等分して 「小県/中県/大県」を当てる 3 クラス分類を実際に解いた結果が下の表です (説明変数は出生数・65 歳以上人口・婚姻件数、ロジスティック回帰)。
| クラス | 適合率 | 再現率 | F1 | 県数 |
|---|---|---|---|---|
| 小県 | 0.762 | 1.000 | 0.865 | 16 |
| 中県 | 0.769 | 0.667 | 0.714 | 15 |
| 大県 | 1.000 | 0.812 | 0.897 | 16 |
| まとめ方 | 値 | 何を測っているか |
|---|---|---|
| macro | 0.8252 | クラスごとの F1 を単純平均。(0.865+0.714+0.897)/3 = 0.825。県数の少ないクラスも 1 票として同じ重みで扱うので、少数クラスを見捨てていないかを見たいときはこれ。 |
| micro | 0.8298 | 全クラスの TP・FP・FN を先に合計してから1 回だけ F1 を計算。多クラス単一ラベルでは正解率と一致します(39/47 = 0.830)。全体で何件当たったかを知りたいときはこれ。 |
| weighted | 0.8276 | クラスごとの F1 を件数で重み付けして平均。件数の多いクラスの出来に引っ張られます。今回は 3 クラスがほぼ同数(16・15・16)なので macro とほとんど差が出ていません。 |
💬 ここが要点:今回は 3 つの値が 0.825〜0.830 に固まっていますが、これはクラスの人数がほぼ同じだからです。 たとえば大県が 2 県しかない不均衡なデータなら、macro は大県の失敗をまともに受けて大きく下がる一方、 weighted と micro は多数派の出来でほぼ決まり、高いままになります。 「F1 = 0.83 でした」とだけ報告するのは不十分で、どの平均かを必ず添えてください。
F1 が「適合率と再現率の調和平均」である理由は、片方だけ高くても褒めないためです。 次の表は同じ組を算術平均と調和平均の両方で計算したものです。
| 適合率 | 再現率 | F1(調和平均) | 算術平均 | 差 |
|---|---|---|---|---|
| 0.90 | 0.90 | 0.900 | 0.900 | 0.000 |
| 0.95 | 0.85 | 0.897 | 0.900 | 0.003 |
| 0.99 | 0.50 | 0.664 | 0.745 | 0.081 |
| 1.00 | 0.10 | 0.182 | 0.550 | 0.368 |
2 つが釣り合っているうちは、調和平均も算術平均もほぼ同じ値です。差が開くのはバランスが崩れたときだけ。 最後の行が象徴的で、「出したものは必ず当たる(適合率 1.00)が、拾えたのは 10 件に 1 件(再現率 0.10)」というモデルは、 算術平均なら 0.55 と半分以上に見えますが、F1 は 0.182 まで落ちます。調和平均は小さい方に強く引っ張られるため、 「安全側に振って、ほとんど陽性と言わない」戦略で点数を稼ぐことができません。これが F1 を使う最大の理由です。
このコードでやること:SSDSE-B-2026(47 都道府県・2023 年)の実データで「人口 500 万超」を陽性とラベル付けし、 「有業者数 300 万超」を予測としたときの F1 スコアを sklearn で計算します。
📥 入力データ:SSDSE-B-2026.csv の総人口(A1101)と有業者数(F3101)列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # SSDSE-B-2026 で F1 スコアを計算 import pandas as pd from sklearn.metrics import precision_score, recall_score, f1_score, fbeta_score, classification_report df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1], header=0) df.columns = pd.read_csv('data/raw/SSDSE-B-2026.csv', nrows=0, encoding='cp932').columns df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # 同じ県が 12 回入らないよう 1 年に絞る y_true = (df['A1101'].astype(float) > 5_000_000).astype(int) # F3101(新規求職申込件数)の最大は 270,954。閾値が 3,000,000 だと # 陽性の予測が 1 件も出ず、Precision も Recall も 0 になってしまう。 y_pred = (df['F3101'].astype(float) > 120_000).astype(int) p = precision_score(y_true, y_pred) r = recall_score(y_true, y_pred) f1 = f1_score(y_true, y_pred) f05 = fbeta_score(y_true, y_pred, beta=0.5) f2 = fbeta_score(y_true, y_pred, beta=2.0) print(f'Precision = {p:.3f}') print(f'Recall = {r:.3f}') print(f'F1 = {f1:.3f}') print(f'F0.5 = {f05:.3f} (Precision 重視)') print(f'F2 = {f2:.3f} (Recall 重視)') print(classification_report(y_true, y_pred, digits=3)) |
📤 実行結果:
💬 結果の読み方:F1=0.889 は「Precision 完璧だが Recall に余地あり」を反映。 F0.5 だと Precision の影響が大きいので 0.952 と高評価、 F2 だと Recall の影響が大きく 0.833 と低評価。 業務目的に合った β を選ぶことが重要。 macro avg 0.939 と weighted avg 0.978 が分離 → クラス不均衡の影響を見るには macro が適切。
average=... を明示しないと比較不能。 二値分類の micro F1 = Accuracy になる罠もある。F1 スコアの周辺概念をテーマ別ツリーで整理:
分類モデルの評価指標 ├── Precision / Recall (TP/FP/FN ベース) ├── 【F1 スコア】 ← ここ (Precision・Recall の調和平均) │ ├── F-β (β で再現率/適合率の重み調整) │ ├── Macro / Micro / Weighted F1 (多クラス) │ └── PR-AUC / Average Precision (閾値非依存) └── ROC-AUC / Accuracy / MCC (対比される指標)
この階層構造を頭に入れておくと、 学習や論文読みで「自分が今どこにいるか」を見失わずに済みます。
「F1 スコア」を確実にマスターするには、 次の順序で進むのが効率的です:
焦らず、 1 段ずつ確実に。 7 ステップを 1 周すれば、 単に「知っている」から「使える」レベルに到達できます。
「F1 スコア」は単独で完結せず、 隣接する手法と接続することで分析パイプラインの一部として機能する。 以下に「上流→並列→下流」のパイプライン視点 と、 「接続 / 統合 / 比較」の関係視点 を両軸で示す。
F1 は 混同行列 の TP / FP / FN を入力として受け取り、 調和平均 2PR/(P+R) を出力する。 そのため接続点は 2 か所:
predict(X) → 真値 y と突き合わせ → 混同行列 → F1F1 単体ではなく以下のように 複合運用 するのが実務標準である。
| 指標 | F1 との関係 | F1 を選ぶ場面 |
|---|---|---|
| Accuracy | F1 は陽性クラスのみに着目、 Accuracy は全体 | 陽性比率 < 30% の不均衡データ |
| ROC-AUC | F1 は閾値依存、 AUC は閾値全体の平均 | 運用閾値が決まった後の評価 |
| F_β (β≠1) | F1 は Precision と Recall を対等扱い、 F_β は重み調整 | Precision と Recall の重要度が同じとき |
| MCC (Matthews 1975) | F1 は TN を無視、 MCC は 4 セル全てを使う | 「陽性検出」が主目的のとき |
F1 = 2PR/(P+R) は Precision と Recall の調和平均で、 片方が 0 なら F1=0 となる厳しい指標。 業務でモデル比較する際は単一閾値の F1 ではなく PR 曲線下面積 (PR-AUC) を主、 F1@best_threshold を副の構成にすると、 閾値選択の任意性に左右されない頑健な比較ができる。
「F1 スコア」を実際の課題に当てはめるとき、 以下の 3 ステップで判断する。 領域固有の判断基準と組み合わせて使用する。
F1 単独でなく Precision / Recall を併記し、 PR 曲線で全閾値での挙動を確認する。 確率出力モデルなら Platt scaling / Isotonic regression で校正後に F1 を計算すると、 過信 / 過信不足の影響を切り分けられる。 N=47 のような小サンプルでは Bootstrap で 95% CI を併記する。
既存の各セクションを壊さずに、 「直感 → 落とし穴 → 発展」を一段深い視点で補強する追加解説です。 数値は SSDSE-B-2026(2023 年・47 都道府県)の実測、 または本ページ既出の実測値のみを使い、 説明用の作り話には「架空」と明記します。
調和平均の定義 $H=\left(\dfrac{1/P+1/R}{2}\right)^{-1}$ を読むと、 平均を取っているのは P・R そのものではなく「逆数 1/P, 1/R」だと分かります。 逆数の世界では 小さい値ほど巨大(R=0.02 なら 1/R=50)になるため、 小さい方が平均を支配する。 これが「調和平均は小さい方に引っ張られる」の数学的な正体です。
往復の平均速度の例えが一番効きます(架空)。 行き 60 km/h・帰り 20 km/h で同じ距離を走ると、 平均速度は算術平均 40 km/h ではなく調和平均 $2\cdot60\cdot20/(60+20)=30$ km/h。 遅い区間に長く時間を取られるから、 全体は遅い方へ寄る。 F1 も同じで、 弱い指標(Precision か Recall の低い方)に「長く足を引っ張られる」。
なぜ算術平均ではダメか——算術平均は「片方を犠牲にして片方を伸ばす取引(trade-off)」を許してしまう。 調和平均は その取引を禁じ、 両立を強制する。 だから「Recall だけ 1.0 に張り付けたズルいモデル」を F1 は見抜けます。 個別の意味は Precision / Recall を、 4 マスの土台は 混同行列 を参照。
本ページの実測では、 人口「大(≥300 万)」は 47 県中わずか 10 県、 残り 37 県が陰性(陽性率 π=10/47≈0.213)。 ここで 「全県を "大でない" と予測するだけ」の思考停止モデルを考えると:
| 指標 | 値 | 見え方 |
|---|---|---|
| Accuracy | 37/47 = 0.787 | 「78.7% 当たってる、 優秀?」と錯覚 |
| Recall(大クラス) | 0/10 = 0.000 | 大都市を 1 つも当てられていない |
| F1(大クラス) | 0.000 | 無価値なモデルだと即座に露見 |
Accuracy は多数派(陰性 37 県)を当てるだけで高く出るため、 少数派こそ重要な不均衡問題では嘘をつく。 F1 は陽性クラスに焦点を当てるので、 このタダ乗りを 0 点と切り捨てる。 これが「不均衡なら Accuracy より F1」の核心です(詳細は クラス不均衡 / Accuracy)。
F1 は確率出力を 0/1 に切る閾値 t を 1 つ選んで初めて決まる 1 点の値。 本ページ既出の実測(閾値スイープ)では、 同じモデルでも t=0.30 で F1=0.947、 t=0.90 で F1=0.571 と大きく動く。 論文・レポートでは 「どの閾値の F1 か」を必ず明記し、 閾値非依存の PR-AUC や ROC-AUC を併記するのが安全。
「大都市」を どこで線引きするかで陽性率 π が動き、 F1 も動く。 SSDSE-B-2026 実測での陽性数:≥300 万=10 県(π≈0.21)、 ≥500 万=9 県(π≈0.19)、 ≥700 万=5 県(π≈0.11)。 π が変わればベースラインも最適閾値も変わるため、 F1 を比較するときは正例定義を固定しなければ意味がない。 「基準を都合よく選んで高い F1 を出す」のは典型的なチェリーピッキング。
$F_1=2TP/(2TP+FP+FN)$ に TN は現れない(ウィジェット B で体感可)。 「陽性を当てる」問題では長所だが、 TN の正しさも評価したい場面(両クラス対等に扱いたい等)では不適。 その場合は TN を含む Balanced Accuracy、 特異度(Specificity)、 あるいは 4 マス全てを使う Matthews 相関係数(MCC) を併用する。
本ページの 3 クラス実測が典型例で、 同じ予測でも macro 0.658 < weighted 0.725 < micro 0.787 と割れる。 使い分けの原則:
報告時は必ず average= を書く。 3 値が割れたら、 それ自体が「クラス不均衡が効いている」というシグナルです。
Precision-Recall 平面で「F1 が一定の点」を結ぶと、 等 F1 線(iso-F1 曲線)は双曲線を描く($F_1=c$ を解くと $R=\dfrac{cP}{2P-c}$)。 右上ほど大きい F1 の等高線。 F1 を最大化する閾値とは、 PR 曲線がいちばん右上の等 F1 双曲線に接する点のこと。 だから PR 曲線を描けば、 最適閾値と到達可能な最大 F1 が一目で分かります。 曲線全体を要約する PR-AUC(Average Precision)は閾値非依存で、 F1(1 点)と補完的。
$F_\beta=(1+\beta^2)\dfrac{PR}{\beta^2 P+R}$ は「Recall を Precision の β 倍重視する」意味を持つ。 β=2 なら分母が $4P+R$ となり Recall 重視(FN が致命的=がん検診など)、 β=0.5 なら Precision 重視(FP が致命的=スパム判定など)。 F1 は β=1 の特例にすぎず、 業務コストの非対称性に合わせて β を選ぶのがプロの判断(ウィジェット C で体感可)。
classification_report(digits=3) でクラス別 F1・support を出し、 どの平均が何に引っ張られているかを確認してから 1 つを主指標に選ぶやること:validation データで $t^\*=\arg\max_t F_1(t)$ を探し、 その $t^\*$ を固定して test データで最終評価する。 sklearn.metrics.precision_recall_curve が各閾値の P・R を返すので、 そこから F1 を計算して最大点を取ればよい。 絶対にやってはいけないのは test データで閾値を選ぶこと(交差検証 や validation で選定し、 test はあくまで最終確認)。 これを守らないと F1 が楽観的に膨らむ過学習になります。
土台:混同行列 / Precision / Recall 対比:Accuracy / 特異度 閾値非依存:PR 曲線 / ROC 曲線 / AUC 文脈:クラス不均衡 / 評価指標 / 交差検証。 (※ Matthews 相関係数 MCC は専用ページ未整備のためテキストのみ。)