質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2738閲覧

python:k 近傍法の実装の正解率の結果を元に混同行列を作成

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/12/11 16:19

編集2017/12/11 16:33

###前提・実現したいこと
・mnistデータでk 近傍法の実装の正解率の結果を元に混同行列を作成したいのですがどうすればいいのか。

・今の状態だとK=1の時でしか混合行列がわからないのでKが1以外の時を指定して表示させるにはどうすればいいですか

###該当のソースコード

python

1from collections import Counter 2from matplotlib import pyplot as plt 3from sklearn import datasets, model_selection, metrics 4from sklearn.metrics import accuracy_score, confusion_matrix 5from sklearn.neighbors import KNeighborsClassifier 6import sklearn.datasets as datasets 7import numpy as np 8import pandas as pd 9import time 10state = np.random.RandomState(1) 11 12mnist = datasets.fetch_mldata('MNIST original', data_home='data/src/download/') 13 14def main(): 15 16 # 特徴データとラベルデータを取り出す 17 features = mnist.data 18 targets = mnist.target 19 20 #データを分割 21 train_dataX, test_dataX, train_dataY, test_dataY = model_selection.train_test_split(features,targets,test_size=0.3) 22 23 # 検証する近傍数 24 K = 1 25 ks = range(1, K + 1) 26 27 for k in ks: 28 predicted_labels = [] 29 30 # モデルを学習 31 model = KNeighborsClassifier(n_neighbors=1, metric='euclidean') 32 model.fit(train_dataX,train_dataY) 33 34 # 一つだけ取り除いたテストデータを識別 35 predicted_label = model.predict(test_dataX) 36 predicted_labels.append(predicted_label) 37 38 # 正解率を計算 39 score = accuracy_score(test_dataY, predicted_label) 40 print("正解率:{}".format(score)) 41 42 # 混合行列を表示 43 cm = confusion_matrix(test_dataY, predicted_label) 44 print(cm) 45 46if __name__ == '__main__': 47 main()

###補足情報(言語/FW/ツール等のバージョンなど)
Anaconda

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

とりあえず、全ての結果が表示されるよう、修正してみました

Python

1from collections import Counter 2from matplotlib import pyplot as plt 3from sklearn import datasets, model_selection, metrics 4from sklearn.metrics import accuracy_score, confusion_matrix 5from sklearn.neighbors import KNeighborsClassifier 6import sklearn.datasets as datasets 7import numpy as np 8import pandas as pd 9import time 10state = np.random.RandomState(1) 11 12mnist = datasets.fetch_mldata('MNIST original', data_home='./data') 13 14def main(): 15 16 # 特徴データとラベルデータを取り出す 17 features = mnist.data 18 targets = mnist.target 19 20 #データを分割 21 train_dataX, test_dataX, train_dataY, test_dataY = model_selection.train_test_split(features,targets,test_size=0.3) 22 23 # 検証する近傍数 24 K = 5 25 ks = range(1, K + 1) 26 27 predicted_labels = np.empty((0, test_dataY.shape[0]), np.int8) 28 for k in ks: 29 # モデルを学習 30 model = KNeighborsClassifier(n_neighbors=k, metric='euclidean') 31 model.fit(train_dataX,train_dataY) 32 33 # 一つだけ取り除いたテストデータを識別 34 predicted_label = model.predict(test_dataX) 35 predicted_labels = np.vstack([predicted_labels, predicted_label]) 36 37 # 正解率を計算 38 for i, k in enumerate(ks): 39 print("K = {}".format(k)) 40 score = accuracy_score(test_dataY, predicted_labels[i]) 41 print("正解率:{}".format(score)) 42 43 # 混合行列を表示 44 cm = confusion_matrix(test_dataY, predicted_labels[i]) 45 print(cm) 46 47if __name__ == '__main__': 48 main()

変更項目としては大きく

  • predicted_labelsをリストから配列に変更して、全て結果をこの配列に格納するように修正
  • 最後にloopを回して、各パラメータ毎の正解率・混合行列を表示するように修正

の2つです。
こんな感じでよろしいのでしょうか?

投稿2017/12/12 04:13

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/12 06:41

出来ました!ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/12/12 07:48

ちなみに処理時間はどれくらいかかりましたか?
magichan

2017/12/12 08:13

申し訳ありませんが、とりあえずの動作の確認は model_selection.train_test_split(features,targets,test_size=0.0002) test_size、極端に小さくして実験しておりましたので、実際の動作時間はわかりません。
退会済みユーザー

退会済みユーザー

2017/12/12 11:32

この混同行列 model_selection.train_test_split(features,targets,test_size=0.3)で実行してみたところ 1つあたり約20分かかりました。 この混同行列は 縦=正解、横=予測という考え方でよろしいですか?
magichan

2017/12/12 11:58

混合行列の縦軸・横軸はそれで間違いないかと思います。
退会済みユーザー

退会済みユーザー

2017/12/12 12:07

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問