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 著, 下田倫大 監訳, 長尾高弘 訳)