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

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

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

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

Q&A

解決済

1回答

403閲覧

mnistデータで最適なkを探すプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2017/11/28 06:37

編集2017/11/28 09:07

###前提・実現したいこと
Digitsデータで最適なkを探すknnのプログラムを作ったのですが
mnistデータでも最適なkを探すknnのプログラムを教えてください。

###発生している問題・エラーメッセージ

・容量が大きくて実行できない。

・NameError Traceback (most recent call last)
<ipython-input-24-b95cedfc1745> in <module>()
28 print('k={0}: {1}'.format(k, ac_score))
29
---> 30 accuracy_scores.append(score)
31
32 # 各経過時間を表示

NameError: name 'score' is not defined

・Digitsデータではそのようなエラーはなかった

###Digitsデータで最適なkを探すknnのプログラム

python

1from matplotlib import pyplot as plt 2from sklearn import datasets 3from sklearn.model_selection import LeaveOneOut 4from sklearn.metrics import accuracy_score 5from sklearn.neighbors import KNeighborsClassifier 6import time 7 8def main(): 9 dataset = datasets.load_digits() 10 11 features = dataset.data 12 targets = dataset.target 13 14 K = 10 15 ks = range(1, K + 1) 16 17 accuracy_scores = [] 18 start = time.time() 19 for k in ks: 20 predicted_labels = [] 21 loo = LeaveOneOut() 22 for train, test in loo.split(features): 23 train_data = features[train] 24 target_data = targets[train] 25 26 elapsed_time = time.time() - start 27 28 model = KNeighborsClassifier(n_neighbors=k) 29 model.fit(train_data, target_data) 30 31 predicted_label = model.predict(features[test]) 32 predicted_labels.append(predicted_label) 33 34 score = accuracy_score(targets, predicted_labels) 35 print('k={0}: {1}'.format(k, score)) 36 37 accuracy_scores.append(score) 38 39 print("経過時間:{0}".format(elapsed_time)) 40 41 X = list(ks) 42 plt.plot(X, accuracy_scores) 43 44 plt.xlabel('k') 45 plt.ylabel('accuracy rate') 46 plt.show() 47 48 49if __name__ == '__main__': 50 main()

###mnistデータで最適なkを探すknnのプログラム 改善版

python

1 2train_size = 500 3test_size = 100 4train_data, test_data, label_train, label_test = model_selection.train_test_split(mnist_data, mnist_label, test_size=test_size, train_size=train_size) 5 6K = 10 7ks = range(1, K + 1) 8 9 10 # 使う近傍数ごとに正解率&各経過時間を計算 11accuracy_scores = [] 12start = time.time() 13for k in ks: 14 predicted_labels = [] 15 loo = LeaveOneOut() 16 17 for train, test in loo.split(mnist.data): 18 train_data = mnist.data[train] 19 label_train = mnist.target[train] 20 21 elapsed_time = time.time() - start 22 23 # モデルを学習させる 24 model = KNeighborsClassifier(n_neighbors=k) 25 model.fit(train_data, label_train) 26 27 # 一つだけ取り除いたテストデータを識別 28 predicted_label = model.predict(train_data[test]) 29 predicted_labels.append(predicted_label) 30 31 # 正解率を計算 32 ac_score = metrics.accuracy_score(label_test, pre) 33 print('k={0}: {1}'.format(k, ac_score)) 34 35 accuracy_scores.append(score) 36 37 # 各経過時間を表示 38 print("経過時間:{0}".format(elapsed_time)) 39 40 # 使う近傍数ごとの正解率を折れ線グラフ 41 X = list(ks) 42 plt.plot(X, ac_score) 43 44 plt.xlabel('k') 45 plt.ylabel('accuracy rate') 46 plt.show()

###試したこと
mnistのデータ
mnist = datasets.fetch_mldata('MNIST original', data_home='data/src/download/')

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

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

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

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

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

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

mkgrei

2017/11/28 07:23

具体的にどのようなエラーになりますか。
退会済みユーザー

退会済みユーザー

2017/11/28 07:28 編集

学習用とテスト用に分類して train_size = 500 test_size = 100 data_train, data_test, label_train, label_test = model_selection.train_test_split(mnist_data, mnist_label, test_size=test_size, train_size=train_size)
退会済みユーザー

退会済みユーザー

2017/11/28 07:29 編集

K = 10 ks = range(1, K + 1) clf = svm.SVC() clf.fit(data_train, label_train) pre = clf.predict(data_test) # 使う近傍数ごとに正解率&各経過時間を計算 accuracy_scores = [] start = time.time() for k in ks: predicted_labels = [] loo = LeaveOneOut() for train, test in loo.split(mnist.data): data_train = mnist.data[train] data_test = mnist.target[train] elapsed_time = time.time() - start # モデルを学習させる model = KNeighborsClassifier(n_neighbors=k) model.fit(train_data, target_data) # 一つだけ取り除いたテストデータを識別 predicted_label = model.predict(features[test]) predicted_labels.append(predicted_label) # 正解率を計算 ac_score = metrics.accuracy_score(label_test, pre) print('k={0}: {1}'.format(k, ac_score)) accuracy_scores.append(score) # 各経過時間を表示 print("経過時間:{0}".format(elapsed_time)) # 使う近傍数ごとの正解率を折れ線グラフ X = list(ks) plt.plot(X, ac_score) plt.xlabel('k') plt.ylabel('accuracy rate') plt.show()
退会済みユーザー

退会済みユーザー

2017/11/28 07:31 編集

に記述したら     エラー  ValueError: Found input variables with inconsistent numbers of samples: [69999, 500]
mkgrei

2017/11/28 07:30

これは容量ではなくデータの数が一致していないせいではないでしょうか。
退会済みユーザー

退会済みユーザー

2017/11/28 07:32

どのように変更したらよいでしょうか
退会済みユーザー

退会済みユーザー

2017/11/28 07:32

見にくくてすいません。
mkgrei

2017/11/28 09:11

ご自分で書かれているコードですか。ac_scoreに変数名が変更されています。
退会済みユーザー

退会済みユーザー

2017/11/28 09:14

書いているのですが、こんがらがっていました。
mkgrei

2017/11/28 09:16

IDEなどを使うと明らかなミスを教えてくれるかもしれません。
退会済みユーザー

退会済みユーザー

2017/11/28 09:24

k=1: 0.72 経過時間:0.024016380310058594  k=1: 0.72 経過時間:79.63809776306152・・・ とkが加算されないのはなぜですか
mkgrei

2017/11/28 10:07

loo = LeaveOneOut()なので、データ数分だけ内ループが回ります。mnistなら6万とかでしょうか。
退会済みユーザー

退会済みユーザー

2017/11/28 10:09

これはkの個数を指定することはできませんでしたか?
退会済みユーザー

退会済みユーザー

2017/11/28 10:11

また、高速に処理する方法はありますか
mkgrei

2017/11/28 10:13

できていますが、kが1大きくなるのはだいぶ時間が経ってからということになります。1ループあたり0.024なら大体30分後ですね。
mkgrei

2017/11/28 10:14

意図にもよりますが、単純にLeavePOutを使うと、P分の1だけ短縮できます。
退会済みユーザー

退会済みユーザー

2017/11/28 10:37 編集

使い方教えてもらってもいいですか
退会済みユーザー

退会済みユーザー

2017/11/28 14:04

Found input variables with inconsistent numbers of samples: [100, 1]  このような場合どうすればいいですか
guest

回答1

0

ベストアンサー

変数名に混乱があるようです。

python

1#-------------------------------------------------------- 2 #data_train = mnist.data[train] 3 #data_test = mnist.target[train] 45 train_data = mnist.data[train] 6 target_data = mnist.target[train] 7#-------------------------------------------------------- 8 9 elapsed_time = time.time() - start 10 11 # モデルを学習させる 12 model = KNeighborsClassifier(n_neighbors=k) 13 model.fit(train_data, target_data)

他の部分も違いがあるかもしれませんが、同様に修正できるはずです。

投稿2017/11/28 07:42

編集2017/11/28 07:43
mkgrei

総合スコア8560

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

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

退会済みユーザー

退会済みユーザー

2017/11/28 08:45 編集

ValueError: bad input shape (100, 784) になってしまったのですがどれを変更したらいいですか
mkgrei

2017/11/28 08:31

train_data, test_data_, label_train, label_test = model_selection.train_test_split(mnist_data, mnist_label, test_size=test_size, train_size=train_size) との整合性を取ってください。 target_data -> label_train
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問