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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

1回答

2918閲覧

テストデータの3割を使うようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

1グッド

1クリップ

投稿2017/11/13 14:29

テストデータの3割を使うようにしたいです。
現在、犬の鳴き声と猫の鳴き声を分類するシステムを作っています。

# coding:utf-8 from sklearn import svm, cross_validation from sklearn.metrics import classification_report, accuracy_score import sys from mfcc import * import glob import csv import random import numpy as np import os from sklearn.model_selection import train_test_split if __name__ == "__main__": train_label = np.array([]) test_label = np.array([]) nfft = 2048 # FFTのサンプル数 nceps = 12 # MFCCの次元数 train_data = np.empty((0, 12), float) test_data = np.empty((0, 12), float) basedir = '/sound_animal/sounds' files = glob.glob(os.path.join(basedir, '*.wav')) for file_name in files: feature = get_feature(file_name, nfft, nceps) if len(train_data) == 0: train_data = feature else: train_data = np.vstack((train_data, feature)) train_label = np.append(train_label,file_name) pattern = r"dog" file = os.path.basename(file_name) match = re.match(pattern, file) if match: train_label = np.append(train_label, 0) else: train_label = np.append(train_label, 1) if len(test_data) == 0: test_data = feature else: test_data = np.vstack((test_data, feature)) if match: test_label = np.append(test_label,0) else: test_label = np.append(test_label,1) feature_train_data = np.hstack((train_label.reshape(len(train_label), 1), train_data)) feature_test_data = np.hstack((test_label.reshape(len(test_label), 1), test_data)) with open("feature_data/train_data.txt", "w") as f: writer = csv.writer(f) writer.writerows(feature_train_data) with open("feature_data/test_data.txt", "w") as f: writer = csv.writer(f) writer.writerows(feature_train_data) clf = svm.SVC(kernel='linear', C=1).fit(train_data, train_label) score = clf.score(test_data, test_label) print(score)

とコードを書きました。今/sound_animal/soundsの中には犬の音声と猫の音声の2種類があります。犬の音声はdog0.wav・dog1.wav・・・などdogで始まるもので、猫の音声はcat0.wav・cat1.wav・・・で始まります。

pattern = r"dog" file = os.path.basename(file_name) match = re.match(pattern, file) if match: train_label = np.append(train_label, 0) else: train_label = np.append(train_label, 1)

と書いたところなどで犬の鳴き声の音声(dog.wav)で始まるものにはラベル0を、その他のものにはラベル1をつけています。
しかし

clf = svm.SVC(kernel='linear', C=1).fit(train_data, train_label) score = clf.score(test_data, test_label)

の部分で、今全ての学習データを学習させ、全てのテストデータでテストしてしまっています。
私は学習ラベルを付与されたデータの7割を使って学習させ、テストラベルを付与されたデータの3割を使ってテストさせたいと考えています。ただ、今回上記のif文で学習データとテストデータを分けてしまっているのでどのようにそのデータをさらに7割や3割に分割して分ければいいのかわかりません。どのようにコードを書けば良いのでしょうか?

achala👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1from sklearn.model_selection import train_test_split

があるので、これを使えばよいと思います。

python

1X_train, X_test, y_train, y_test = train_test_split(train_data, train_label, test_size=0.33, random_state=0, stratify=train_label)

キーの意味を知りたければ、以下を参考に。
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html


追記:
コメントの内容を全部まとめてコードを書き直すと、以下の通り。
走らせる環境がないので、タイプミス・インデントミスがあるかもしれません。あしからず。

python

1# coding:utf-8 2from sklearn import svm, cross_validation 3from sklearn.metrics import classification_report, accuracy_score 4import sys 5from mfcc import * 6import glob 7import csv 8import random 9import numpy as np 10import os 11from sklearn.model_selection import train_test_split 12 13def get_data(files, nfft, nceps): 14 data = None 15 label = np.array([]) 16 for file_name in files: 17 feature = get_feature(file_name, nfft, nceps) 18 if data is None: 19 data = feature 20 else: 21 data = np.vstack((data, feature)) 22 23 if file_name.split('/')[-1].startswith('dog'): 24 label = np.append(label, 0) 25 else: 26 label = np.append(label, 1) 27 return data, label 28 29if __name__ == "__main__": 30 nfft = 2048 # FFTのサンプル数 31 nceps = 12 # MFCCの次元数 32 33 basedir = '/sound_animal/sounds' 34 files = glob.glob(os.path.join(basedir, '*.wav')) 35 data, label = get_data(files, nfft, nceps) 36 37 train_data, test_data, train_label, test_label = train_test_split(data, label, test_size=0.33, random_state=0, stratify=label) 38 39 feature_train_data = np.hstack((train_label.reshape(-1, 1), train_data)) 40 feature_test_data = np.hstack((test_label.reshape(-1, 1), test_data)) 41 42 with open("feature_data/train_data.txt", "w") as f: 43 writer = csv.writer(f) 44 writer.writerows(feature_train_data) 45 with open("feature_data/test_data.txt", "w") as f: 46 writer = csv.writer(f) 47 writer.writerows(feature_test_data) 48 49 clf = svm.SVC(kernel='linear', C=1) 50 clf.fit(train_data, train_label) 51 score = clf.score(test_data, test_label) 52 53 print(score)

投稿2017/11/13 14:36

編集2017/11/13 16:05
mkgrei

総合スコア8560

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

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

退会済みユーザー

退会済みユーザー

2017/11/13 14:43

ありがとうございます。上記のコードは、 feature_train_data = np.hstack((train_label.reshape(len(train_label), 1), train_data)) feature_test_data = np.hstack((test_label.reshape(len(test_label), 1), test_data)) の上に書けば良いでしょうか?それとも、clf = svm.SVC(kernel='linear', C=1).fit(train_data, train_label)の上に書けば良いでしょうか?
mkgrei

2017/11/13 14:51

feature_***_dataはファイルに出力用にあるように見えるので、今のコードの学習には影響しません。 ですので、train_data/train_label生成後で、かつsvm.SVC.fitの前であればどこでもかまわないはずです。 clf = svm.SVC(kernel='linear', C=1).fit(train_data, train_label) を、 clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train) になおすのを忘れずに。
mkgrei

2017/11/13 15:45

上のコメントはとりあえず動けばいいのであれば、間違っていません。 少し体裁を整えるのであれば、正しくは、 train_data, test_data, train_label, test_label = train_test_split(train_data, train_label, test_size=0.33, random_state=0, stratify=train_label) を feature_train_data = np.hstack(...) の前に挿入します。 そうすれば学習とcsvファイルの整合性がとれます。 .fit(...)と.score(...)の中身もそのままで正しくなります。 更に気になるのであれば、データ生成のところで、train_data/train_label/test_data/test_labelをdata/labelなどの別の名前で書いたほうがよいでしょう。 でないと前半のtrain_dataの意味と後半の意味が変更されることになるので、今後このコードを修正・転用する際に勘違いがおきやすくなり、酷い目に遭う確率が上がります。
退会済みユーザー

退会済みユーザー

2017/11/14 07:36

くわしい解説をありがとうございます。 データ生成のところで、train_data/train_label/test_data/test_labelをdata/labelなどの別の名前で書いたほうがよいでしょう。 でないと前半のtrain_dataの意味と後半の意味が変更されることになるので =>とありますが、なぜ前半と後半の意味が変更されることになるのでしょうか?3割に分けているという点で前半はデータの全部だけど後半はデータのランダムな3割ということでしょうか?
mkgrei

2017/11/14 07:51

そのように考えることができます。 例えばループ文を一番外側に追加して、中で教師・テストデータの分割の仕方をかえてみたくなることがあります。(正しいクロスバリデーションのやり方ですね。) 注意しないとsplitするたびにデータが減っていくバグに遭遇する可能性が出てきます。 もしくは、機械学習界隈だとjupyter notebookを使用することが多いのですが、データを学習後に続けて処理を行ったりすることがあります。 その時も、元データの変数を再定義してしまうと元のデータを復元するために手間がかかります。 モデルを作る際には全データ、教師に使用したデータ、それとテストデータを区別するのが一番心安らぐわけです。 train_test_splitは手軽ですが、ちょっと凝ったことをやりたくなるとKFoldなどを直接使用します。 ここでは、教師に使用するデータ自身ではなく、教師に使用するデータのインデックスが返り値になります。 http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html インデックスを使用することで特徴量が膨大な行列Xを複製しなくて済む利点があります。 今回のケースでは、もとのコードにtrain_test_splitがインポートしてあったので、それを利用しました。
退会済みユーザー

退会済みユーザー

2017/11/14 07:57

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問