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

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

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

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

Python

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

Q&A

解決済

1回答

512閲覧

python:mnistデータで各数字の割合を知るには

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2017/12/12 11:26

###前提・実現したいこと
pythonで使うこの mnist = datasets.fetch_mldata('MNIST original', data_home='data/src/download/')
の各数字のトレーニングデータとテストデータの割合を知るにはどのようにコードを作成すればよいですか。

###例 このような感じで。
三列目は合計
![イメージ説明]

URL(https://qiita.com/ToshikiShimizu/items/6bfacef12dafd63b1080#%E5%90%84%E6%95%B0%E5%AD%97%E3%81%AE%E5%89%B2%E5%90%88) 参照

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

numpy.bincount()を使うのが簡単ではないでしょうか

Python

1from sklearn import datasets, model_selection, metrics 2import sklearn.datasets as datasets 3import numpy as np 4 5 6mnist = datasets.fetch_mldata('MNIST original', data_home='./data/src/download') 7train_data, test_data, train_label, test_label = model_selection.train_test_split(mnist.data, mnist.target, test_size=0.3) 8 9train_count = np.bincount(train_label.astype(np.int8)) 10test_count = np.bincount(test_label.astype(np.int8)) 11total_count = train_count + test_count 12 13print(train_count) 14print(test_count) 15print(total_count)

投稿2017/12/12 11:54

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2017/12/12 12:06

ありがとうございました。 細かいのは自分で出来ました!
退会済みユーザー

退会済みユーザー

2017/12/12 12:12

ちなみに、実行する度にデータ数が変わるのはなぜですか。
magichan

2017/12/12 12:17

trainデータとtestデータに分割する train_test_split() には、データをshuffleするオプションがあり、デフォルトでTrueになっております。 ですので毎回結果が変わるのかと思います。(合計は変わってないですよね)
退会済みユーザー

退会済みユーザー

2017/12/12 12:19

そうだったのですね・・・ありがとうございます。 ちなみに、シャッフルをオフにすることは可能なのでしょうか。可能でしたら方法を教えてください。
magichan

2017/12/12 12:40

scikit-learnのversionが0.19以降であれば train_test_split()の引数に shuffle=False を指定して shuffleをDisableにすることができます
退会済みユーザー

退会済みユーザー

2017/12/12 14:48 編集

ありがとうございます。0.19ですが入れると train_data, test_data, train_label, test_label = model_selection.train_test_split(mnist.data, mnist.target, test_size=0.3, shuffle=False) train_count = np.bincount(train_label.astype(np.int8)) test_count = np.bincount(test_label.astype(np.int8)) total_count = train_count + test_count print(" 0 1 2 3 4 5 6 7 8 9" ) print("traing_data {}".format(train_count)) print("test_data {}".format(test_count)) print("traing_data + test_data {}".format(total_count)) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-7-8406e21e208d> in <module>() 3 train_count = np.bincount(train_label.astype(np.int8)) 4 test_count = np.bincount(test_label.astype(np.int8)) ----> 5 total_count = train_count + test_count 6 7 print(" 0 1 2 3 4 5 6 7 8 9" ) ValueError: operands could not be broadcast together with shapes (9,) (10,)
magichan

2017/12/12 23:21

たぶん train_label には '9' の データが含まれていないのでしょう。 (今回はshuffle=False なので、元々の並びがそうなのかと思います) その結果、train_count は 0~8 の結果が格納された、サイズが9のデータとなっており、対して test_count には '9' の データも含まれた、サイズ 10 のデータが得られるので、 total_count = train_count + test_count の部分で、長さが違う配列同士の足し算を行っているとしてエラーになっているようです。 で、修正方法ですが、 np.bincount() の引数に minlength=10 を与えてください。そうすることで、たとえ '9'のデータを含んでいない場合も、サイズ10の結果を返すようになりますので、問題なく足し算が実行できるかと思います。
退会済みユーザー

退会済みユーザー

2017/12/13 11:32 編集

ありがとうございます。出来たのはできたのですが             traing_data [5923 6742 5958 6131 5842 5421 5918 6265 800 0] test_data [ 980 1135 1032 1010 982 892 958 1028 6025 6958] traing_data + test_data [6903 7877 6990 7141 6824 6313 6876 7293 6825 6958] traing_dataの9はなぜ0なのでしょうか
magichan

2017/12/14 00:51 編集

そもそも、上記の "2017/12/12 23:48" のエラーが出た原因が 「traing_dataの9 が 0 」だったからです。これにより bitcount の戻り値として 0~8 の集計データとなっておりました。(9は集計が0なので結果に含まれてなかった) で、「集計がなくても 最低10個(0~9)の結果を返してね。」というのが'minlength=10' ということになります。 「traing_dataの9 が 何故0なのか 」に関しては、『元々のデータの並びが、データを2つ(Traing data と Test data)に分割したとき、片側に9のデータが偏るように"たまたま"なっていた』ということでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問