classification_reportの読み方
code:python
>> from sklearn.metrics import classification_report
>> print(classification_report(0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1)) precision recall f1-score support
0 1.00 0.67 0.80 3
1 0.75 1.00 0.86 3
avg / total 0.88 0.83 0.83 6
第1引数y_true(正解)が[0, 0, 0, 1, 1, 1], 第2引数y_pred(予測値)が[0, 0, 1, 1, 1, 1]の場合
0だと予想したもの2つはすべて正解: 0のprecision(適合率)が1.00
1だと予想したもの4つは、うち3つが正解: 1のprecisionが0.75
正解が0だった3つのうち、正しく0だと予想されたものは2個: 0のrecall(再現率)が0.67
正解が1だった3つのうち、すべてが正しく1だと予想されていた: 1のrecallが1.00
f1-scoreはprecisionとrecallの調和平均 see F値 不均衡データ
code:python
>> print(classification_report(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1)) precision recall f1-score support
0 1.00 0.88 0.93 8
1 0.67 1.00 0.80 2
avg / total 0.93 0.90 0.91 10
>> print(classification_report(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)) precision recall f1-score support
0 0.89 1.00 0.94 8
1 1.00 0.50 0.67 2
avg / total 0.91 0.90 0.89 10
実際には10個の内2個だけが1
前半
3つ1だと予想した、うち2つが正解
顧客が「本当は1のものを取りこぼしたくない」と思っているならこれは良い方法
それは「1のrecallが1.00であるから」と表現できる
逆に「1だと予測したものは全部1であってほしい」と思っているならこれは悪い方法
それは「1のprecisionが0.67しかないから」と表現できる
後半
1個だけ1だと予想した
顧客が「本当は1のものを取りこぼしたくない」と思っているならこれは悪い方法
それは「1のrecallが0.50しかないから」と表現できる
逆に「1だと予測したものは全部1であってほしい」と思っているならこれは良い方法
それは「1のprecisionが1.00しかないから」と表現できる
「本当は1のものを取りこぼしたくない」
「1の石を割ると宝石が出て来て、10万で売れる。仕入れに1万掛かる」
多少間違えてでも1の石を割ったらガッポリ儲かる
だから1っぽいものはどんどん教えてほしい
3個1だと予想して2個が正解→3万払って、20万手に入れる。17万の儲け。
1個1だと予想して1個正解→1万払って、10万手に入れる。9万の儲け。
「1だと予測したものは全部1であってほしい」
「1の石を割ると宝石が出て来て、10万で売れる。仕入れに9万掛かる」
ギリギリの商売なんで下手を打つと赤字になる
だから確実に1なものだけ教えてほしい
3個1だと予想して2個が正解→27万払って、20万手に入れる。7万の損。
1個1だと予想して1個正解→9万払って、10万手に入れる。1万の儲け。
ロジスティック回帰ならデフォルト0.5の閾値を上下させることによって精度や再現率を調整できる。精度と再現率は逆方向に動く。閾値を調整して精度と再現率の値を一致させた場合の、精度のことをプレシジョン-リコール ブレイクイーブンポイントと呼ぶ。(情報検索の分野における用語)