SVMで間違ったファイルを検出したい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,098

退会済みユーザー
SVMで間違ったファイルを検出したいです。現在、犬の鳴き声と猫の鳴き声を分類するシステムを作っています。
# 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)
feature = get_feature(file_name, nfft, nceps)
if len(test_data) == 0:
test_data = feature
else:
test_data = np.vstack((test_data, feature))
test_label = np.append(test_label,file_name)
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)
と書きました。現在スコアは0.988です。しかし、今/sound_animal/soundsの中には犬の鳴き声のデータしかなく本来スコアは1.0になるはずです。間違っているファイルがどのファイルかみたいのですが、どのようにコードを書いたらどのファイルが間違っているのか確認できるでしょうか?それとも
score = clf.score(test_data, test_label)
といっぺんに計算しているからどのファイルが間違っているのか確認はできず、とても面倒ですが一つ一つファイルを減らすなどしてどのファイルが間違いなのか確認するしかないのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
rhksさんの回答が正しいと思いますが、目視でエラーをキャッチできてないようなので、
補足として質問者の求めているコードを提示しておきます。
predict_label = clf.predict(test_data)
for i, label in enumerate(predict_label):
if label != test_label[i]:
print(label, test_label2[i])
また、質問からは外れますが、このコードではやりたい予測ができてないと思います。
train_label
にファイル名をそのまま入れてしまっているので、ファイル名の予測を行ってしまっています。
たとえば、どれかの正解がdog_3.wav
としてどれか一個がdog_4.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))
if file_name.find('dog') > 0:
train_label = np.append(train_label,'dog')
else:
train_label = np.append(train_label,'other')
ただし、svm.fit
はlabelが一種類だとエラーを吐きます。
The number of classes has to be greater than one; got 1
ちゃんと二種類以上の教師データを用意しないとバリデートできません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
clf.predict(test_data)
と
test_label
を比較する。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.97%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる