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

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

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

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

Python

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

Q&A

解決済

1回答

2897閲覧

python:mnistデータとDigitsデータ

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/12/11 08:52

#現したいこと
digitsデータでk近傍法 ~マンハッタン距離~を行って使う近傍数ごとの正解率を折れ線グラフを作成したところ以下のようなジグザグな図形になりました。
mnistデータでk近傍法 ~マンハッタン距離~を行って使う近傍数ごとの正解率を折れ線グラフを作成したところ以下のような図形になりました。
似たようなデータなのになぜここまでグラフが変わるのか教えてください。

#プレビュー Digits
![イメージ説明

#プレビュー mnist
イメージ説明

###Digitsのソースコード

python

1def main(): 2 # データをロード 3 dataset = datasets.load_digits() 4 5 # 特徴データとラベルデータを取り出す 6 features = dataset.data 7 targets = dataset.target 8 9 # 検証する近傍数 10 K = 10 11 ks = range(1, K + 1) 12 13 # 使う近傍数ごとに正解率&各経過時間を計算 14 accuracy_scores = [] 15 start = time.time() 16 for k in ks: 17 predicted_labels = [] 18 loo = LeaveOneOut() 19 for train, test in loo.split(features): 20 train_data = features[train] 21 test_data = targets[train] 22 23 elapsed_time = time.time() - start 24 25 # モデルを学習 26 model = KNeighborsClassifier(n_neighbors=k, metric='manhattan') 27 model.fit(train_data, test_data) 28 29 # 一つだけ取り除いたテストデータを識別 30 predicted_label = model.predict(features[test]) 31 predicted_labels.append(predicted_label) 32 33 # 正解率を計算 34 score = accuracy_score(targets, predicted_labels) 35 print('k={}: {}'.format(k, score)) 36 37 accuracy_scores.append(score) 38 39 # 各経過時間を表示 40 print("経過時間:{:.2f}".format(elapsed_time)) 41 42 # 使う近傍数ごとの正解率を折れ線グラフ 43 X = list(ks) 44 plt.plot(X, accuracy_scores) 45 46 plt.xlabel('k') 47 plt.ylabel('正解率') 48 plt.show() 49 50 51if __name__ == '__main__': 52 main()

###mnistのソースコード

python

1def main(): 2 3 # 特徴データとラベルデータを取り出す 4 features = mnist.data 5 targets = mnist.target 6 7 #データを分割 8 train_dataX, test_dataX, train_dataY, test_dataY = model_selection.train_test_split(features,targets,test_size=0.3) 9 10 11 # 検証する近傍数 12 K = 10 13 ks = range(1, K + 1) 14 15 # 使う近傍数ごとに正解率&各経過時間を計算 16 accuracy_scores = [] 17 start = time.time() 18 for k in ks: 19 predicted_labels = [] 20 elapsed_time = time.time() - start 21 22 # モデルを学習 23 model = KNeighborsClassifier(n_neighbors=k, metric='manhattan') 24 model.fit(train_dataX,train_dataY) 25 26 # 一つだけ取り除いたテストデータを識別 27 predicted_label = model.predict(test_dataX) 28 29 # 正解率を計算 30 score = accuracy_score(test_dataY, predicted_label) 31 print('k={}: {}'.format(k, score)) 32 33 accuracy_scores.append(score) 34 35 # 各経過時間を表示 36 print("経過時間:{:.2f}".format(elapsed_time)) 37 38 # 使う近傍数ごとの正解率を折れ線グラフ 39 X = list(ks) 40 plt.plot(X, accuracy_scores) 41 42 plt.xlabel('k') 43 plt.ylabel('正解率') 44 plt.show() 45 46 47if __name__ == '__main__': 48 main()

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、グラフのスケールが直感的ではありません
せめて0.9から1.0に揃えるべきでしょう。
0.から1.に揃えればともに1近いです。


他に、
digitsは2000未満個のサンプルです。
http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html

対してMNISTは60000個のサンプルがあります。

一般的にデータがたくさんある方がロバストな結果が得られます。

一度限りのモデルではサンプル数の少ないほうが分散が大きくなります。
よかったり、悪かったり…
特定の一回を取り出しても乱数次第でコロコロ変わります。

クロスバリデーションを行い統計的収束をせめて得てみないとなんとも評価できません。
http://aiweeklynews.com/archives/50219779.html
https://mathwords.net/kousakakunin


後は純粋にMNISTのほうが意地悪なサンプルが割合多く含まれている可能性もありますが、上記の可能性を排除できないにはこのような結論を下すのは時期尚早でしょうね。


追記:
気になったので試してみました。
MNISTのほうがずっと難しいですね。
digitsは8x8に対して、MNISTは28x28ですので、自由度がずっと高いですね。
例えば、MNISTから2000だけ取り出して8x8にリサイズしてやると、正答率は
digits:~98%、MNIST:~92%になります。

python

1from sklearn.model_selection import StratifiedKFold 2from sklearn.neighbors import KNeighborsClassifier 3from sklearn.metrics import accuracy_score 4 5from sklearn import datasets 6from keras.datasets import mnist 7 8from scipy.misc import imresize 9 10import numpy as np 11 12try: 13 from tqdm import tqdm 14except (ImportError) as e: 15 tqdm = lambda x:x 16 17def main(key='digits', random_state=2017): 18 if key == 'digits': 19 dataset = datasets.load_digits() 20 X = dataset.data 21 Y = dataset.target 22 elif key == 'mnist': 23 (X_train, y_train), (X_test, y_test) = mnist.load_data() 24 kfold = StratifiedKFold(5, shuffle=True, random_state=0) 25 tr, ts = next(kfold.split(X_test, y_test)) 26 X = X_test[ts] 27 X = np.array([imresize(x, (8, 8)) for x in X]) 28 X = X.reshape(-1, np.prod(X.shape[1:])) 29 Y = y_test[ts] 30 Y = Y.reshape(-1) 31 else: 32 return [], [] 33 34 ks = np.linspace(1, 10, 5).astype('i') 35 36 accuracy_scores = [] 37 for k in tqdm(ks): 38 pY = np.zeros(Y.shape) 39 kfold = StratifiedKFold(5, shuffle=True, random_state=random_state) 40 for tr, ts in kfold.split(X, Y): 41 x_tr = X[tr] 42 y_tr = Y[tr] 43 44 model = KNeighborsClassifier(n_neighbors=k, metric='manhattan') 45 model.fit(x_tr, y_tr) 46 47 py = model.predict(X[ts]) 48 pY[ts] = py 49 50 score = accuracy_score(Y, pY) 51 accuracy_scores.append(score) 52 return ks, accuracy_scores 53 54if __name__ == '__main__': 55 colors = ['red', 'blue'] 56 for ic, key in enumerate(['digits', 'mnist']): 57 for i in np.linspace(1, 1000, 10).astype('i'): 58 ks, accuracy_scores = main(key=key, random_state=2017+i) 59 plt.plot(ks, accuracy_scores, marker='.', color=colors[ic]) 60 61 plt.xlabel('k') 62 plt.ylabel('Accuracy') 63 plt.grid() 64 plt.xlim((0, np.max(ks))) 65 plt.ylim((0.8, 1.0)) 66 plt.show()

投稿2017/12/11 09:36

編集2017/12/11 11:25
mkgrei

総合スコア8560

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

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

退会済みユーザー

退会済みユーザー

2017/12/11 09:47

回答ありがとうございます。 それぞれの「使う近傍数ごとの正解率を折れ線グラフ」の結果は間違えているわけではないということになりますか?
mkgrei

2017/12/11 13:54

そうですね。 結論としては、結果は正しいです。 同じく数字の分類ですが、MNISTのほうが問題として難しいです。
退会済みユーザー

退会済みユーザー

2017/12/11 14:07

そうですよね。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問