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

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

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

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

Q&A

解決済

2回答

456閲覧

Pyhon : k 近傍の混同行列

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2017/12/01 16:12

編集2017/12/01 16:31

###前提・実現したいこと
k 近傍法の実装の正解率の結果を元に混同行列を作成したいのですがどうすればいいのか。(kの大きさごとに混合行列を作成したいため)

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

python

1from sklearn import datasets 2from sklearn.model_selection import LeaveOneOut 3from sklearn.metrics import accuracy_score 4from sklearn.neighbors import KNeighborsClassifier 5 6def main(): 7 dataset = datasets.load_digits() 8 9 features = dataset.data 10 targets = dataset.target 11 12 predicted_labels = [] 13 14 loo = LeaveOneOut() 15 for train, test in loo.split(features): 16 train_data = features[train] 17 target_data = targets[train] 18 19 model = KNeighborsClassifier(n_neighbors=1, metric='euclidean') 20 model.fit(train_data, target_data) 21 22 predicted_label = model.predict(features[test]) 23 predicted_labels.append(predicted_label) 24 25 score = accuracy_score(targets, predicted_labels) 26 print(score) 27 28 29if __name__ == '__main__': 30 main()

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

途中の経緯がよくわからないのですが、
sklearn の confusion_matrix() を使うのは駄目なの?

Python

1from sklearn import datasets 2from sklearn.model_selection import LeaveOneOut 3from sklearn.metrics import accuracy_score, confusion_matrix 4from sklearn.neighbors import KNeighborsClassifier 5 6def main(): 7 dataset = datasets.load_digits() 8 9 features = dataset.data 10 targets = dataset.target 11 12 predicted_labels = [] 13 14 loo = LeaveOneOut() 15 for train, test in loo.split(features): 16 train_data = features[train] 17 target_data = targets[train] 18 19 model = KNeighborsClassifier(n_neighbors=1, metric='euclidean') 20 model.fit(train_data, target_data) 21 22 predicted_label = model.predict(features[test]) 23 predicted_labels.append(predicted_label) 24 25 print(predicted_labels) 26 score = accuracy_score(targets, predicted_labels) 27 print(score) 28 29 # 混合行列を表示 30 cm = confusion_matrix(targets, predicted_labels) 31 print(cm) 32 33 34if __name__ == '__main__': 35 main()

投稿2017/12/05 08:50

magichan

総合スコア15898

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

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

R.Shigemori

2017/12/05 12:15

そういえばその手がありましたね。使い慣れているpandasが私にとってデフォルトだったので忘れていました。
退会済みユーザー

退会済みユーザー

2017/12/05 16:13

出来ました。 お二方お手伝いありがとうございました。
guest

0

通常、混同行列というと、縦軸に試験データのラベル・横軸に予測結果のラベルを取ったクロス集計表のことをいうので、以下のステップをコードに組み込むことがゴールになります。

1.試験データのラベルの配列を生成する。
今のコードだと、試験データのラベルはtarget[test]で取得できますが、Leave-One-Outだと1件ずつなのでappendする必要があります。

2.クロス集計表を作成する。
pandasのcrosstab()を使って混同行列を作成します。コードイメージは以下の通りです。
crosstab(index=縦軸にしたいデータ,columns=横軸にしたいデータ,margins=True)

投稿2017/12/02 00:06

R.Shigemori

総合スコア3376

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

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

退会済みユーザー

退会済みユーザー

2017/12/02 06:52

試験データのラベルの配列を生成のコードを教えていただけませんか
退会済みユーザー

退会済みユーザー

2017/12/02 06:54

横軸:予測結果のラベルは train.dataで合っていますか
R.Shigemori

2017/12/03 08:45

予測結果の配列を作成するコードと基本は同じです。 target_label = target[test] target_labels.append[target_label] for文で繰り返しをしているので上記のtestにはテスト対象データのindexが入っているのでこれを使うことでtargetの中から該当のデータをひとつ取得できます。最終的に欲しいものはこのtest対象の配列なので順次appendすることで完成します。
退会済みユーザー

退会済みユーザー

2017/12/04 13:44

def main(): dataset = datasets.load_digits() features = dataset.data targets = dataset.target predicted_labels = [] loo = LeaveOneOut() for train, test in loo.split(features): train_data = features[train] target_data = targets[train] model = KNeighborsClassifier(n_neighbors=1, metric='euclidean') model.fit(train_data, target_data) predicted_label = model.predict(features[test]) predicted_labels.append(predicted_label) target_label = targets[test] target_labels.append[target_label] score = accuracy_score(targets, predicted_labels) crosstab(index=, columns=, margins=True) if __name__ == '__main__': main() NameError Traceback (most recent call last) <ipython-input-10-2f60c5c2d904> in <module>() 26 27 if __name__ == '__main__': ---> 28 main() <ipython-input-10-2f60c5c2d904> in main() 19 20 target_label = targets[test] ---> 21 target_labels.append[target_label] 22 23 score = accuracy_score(targets, predicted_labels) NameError: name 'target_labels' is not defined なぜ'target_labels' はエラーに?
R.Shigemori

2017/12/04 14:02

予測結果格納用の配列(predicted_labels)をforループの前に定義したのと同じことをしていないためです。元のコードが書けていたので省略してしまいました。
退会済みユーザー

退会済みユーザー

2017/12/04 14:42 編集

def main(): dataset = datasets.load_digits() features = dataset.data targets = dataset.target predicted_labels = [] target_labels = [] loo = LeaveOneOut() for train, test in loo.split(features): train_data = features[train] target_data = targets[train] model = KNeighborsClassifier(n_neighbors=1, metric='euclidean') model.fit(train_data, target_data) predicted_label = model.predict(features[test]) predicted_labels.append(predicted_label) target_label = targets[test] target_labels.append[target_label] score = accuracy_score(targets, predicted_labels) print(score) crosstab(index=targets, columns=features, margins=True) if __name__ == '__main__': main() にしてみたところ --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-653038045703> in <module>() 29 30 if __name__ == '__main__': ---> 31 main() <ipython-input-5-653038045703> in main() 20 21 target_label = targets[test] ---> 22 target_labels.append[target_label] 23 24 score = accuracy_score(targets, predicted_labels) TypeError: 'builtin_function_or_method' object is not subscriptable になってしまいました。
R.Shigemori

2017/12/04 15:15

appendは[]ではなく()でした。
退会済みユーザー

退会済みユーザー

2017/12/04 15:44

def main(): dataset = datasets.load_digits() features = dataset.data targets = dataset.target predicted_labels = [] target_labels = [] loo = LeaveOneOut() for train, test in loo.split(features): train_data = features[train] target_data = targets[train] model = KNeighborsClassifier(n_neighbors=1, metric='euclidean') model.fit(train_data, target_data) predicted_label = model.predict(features[test]) predicted_labels.append(predicted_label) target_label = targets[test] target_labels.append(target_label) score = accuracy_score(targets, predicted_labels) print(score) pd.crosstab(index=targets, columns=features, margins=True) if __name__ == '__main__': main() --------------------------------------------------------------------------- Exception Traceback (most recent call last) ・ ・ ・ Exception: Data must be 1-dimensional
退会済みユーザー

退会済みユーザー

2017/12/04 15:46

・のとこは長すぎて省略 これは、入力するデータが違うということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問