これで仕事終わり?さいっこおおおお

ネコの気持ちになりきってのんびりと自由に技術メモを残していきます

scikit-learnでprecision,recall,f値 [ネコ]

import

import numpy as np
import os

やっていく

mnistを使います

まずはmnistをfetch

from sklearn.datasets import fetch_mldata

mnist = fetch_mldata('MNIST original')
mnist.data.shape
# (70000, 784)

特徴量は28×28で784

70000個インスタンスがあるぽい、70000万匹のネコ.......

mnist.target.shape
# (70000,)

訓練データとテストデータを分けます

60000個が訓練データに、、、60000のネコ

X, y = mnist["data"], mnist["target"]
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]

訓練データをシャッフルします。交差検証の時に検証されない数字があると困るからです。

np.random.seed(42)
shuffle_idx = np.random.permutation(60000)
X_train, y_train = X_train[shuffle_idx], y_train[shuffle_idx]

今回は簡単のため5を判定してみます、これならネコでもわかる!!

5のデータだけtrueに、それ以外はfalseに

この書き方はスッキリしてて良いですね!! スッキリしたねこ,,,,,,,,

y_train_5 = (y_train == 5)
y_test_5 = (y_test == 5)

sgdの分類機を試します、学習させましょう

sgdについては 確率的勾配降下法とは何か、をPythonで動かして解説する - Qiita こちらの記事がわかりやすかったです!天才だ、、

from sklearn.linear_model import SGDClassifier

sgd_clf = SGDClassifier(max_iter=5, tol=-np.infty, random_state=42)
sgd_clf.fit(X_train, y_train_5)

交差検証をします、今回は3フォールドのK分割交差検証でモデルを評価します。この時、cross_val_predict()を使用すると精度ではなく予測結果そのものを返してくれます。

from sklearn.model_selection import cross_val_predict

y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
y_train_pred         # array([False, False, False, ..., False, False, False])

precision, recall, f値を求めましょう!!!終わった、、これでアイス食べれる、、、、

from sklearn.metrics import precision_score, recall_score, f1_score

print('precision:', precision_score(y_train_5, y_train_pred))
print('recall:', recall_score(y_train_5, y_train_pred))
print('f1:', f1_score(y_train_5, y_train_pred))

# precision: 0.7687135020350381
# recall: 0.801328168234643
# f1: 0.7846820809248555

参考文献: scikit-learnとTensorFlowによる実践機械学習 (オライリー・ジャパン, Aurelien geron 著, 下田倫大 監訳, 長尾高弘 訳)