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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

2135閲覧

Pythonによる多項分類の方法・検討

maguro2020

総合スコア34

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2020/06/16 09:12

編集2020/06/16 09:59

#前提・実現したいこと
現在、Pythonを用いて機械学習による、「2対その他」の多クラス分類が行えないかを検討しております。

#発生している問題・検討していること
今までの機械学習では、
機械学習でμ’sの声を識別する
上記のサイト様のコードを元に機械学習を行なっておりました。下記に記載してあるコードを見ていただければわかると思うのですが、私は現在まで「bell」「call」「noise」の3つの教師データを用意して音の識別学習を行なっておりました。しかし、「bell」「call」「その他」といった多クラス分類ができるのではないかと考えております。その場合、「bell」と「call」の教師データのみを用意し、「その他」という教師データを作成せずに、3つに分類することは可能でしょうか?素人の質問で大変申し訳ないのですが、ご助言いただけたら幸いです。

#現在使用しているコード

import scipy.io.wavfile as wav import librosa from sklearn.svm import SVC import numpy import glob from sklearn import svm def getMfcc(filename): y, sr = librosa.load(filename) return librosa.feature.mfcc(y=y, sr=sr) #3つの教師データ artists = ["bell", "call","noise"] songs = [glob.glob('bell_wav5/*.wav'), glob.glob('call_wav5/*.wav'), glob.glob('noiseA/*.wav'), ] song_training = [] artist_training = [] for artist, artist_songs in zip(artists, songs): for song in artist_songs: path = "%s" % song print(path) mfcc = getMfcc(path) song_training.append(mfcc.T) label = numpy.full((mfcc.shape[1], ), artists.index(artist), dtype=numpy.int) artist_training.append(label) song_training = numpy.concatenate(song_training) artist_training = numpy.concatenate(artist_training) #識別機械学習 clf = svm.SVC() clf.fit(song_training, artist_training) print('Learning Done') filename = 'test/call_test02.wav' for artist in artists: mfcc = getMfcc(filename) prediction = svc.predict(mfcc.T) counts = numpy.bincount(prediction) result = artists[numpy.argmax(counts)] print('%s recognized as %s.' % (filename, result))

#試していること
現在。下記のサイト様を参考に2対その他の多クラス分類ができないかを調査しております。
多クラス分類(Multi-Class Classification)
また、
ラベルで一致率の低いものをその他に分類する手法について
上記で似たような事例を質問されて方がおり、こちらも参考にしております。
機械学習について詳しい方がおられましたら、アドバイスやご指摘などのご助言をいただけたらと思います。

#補足
使っているPCはmacOS Suerra バージョン10.12.6
Pythonのバージョンは3.6.5です

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

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

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

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

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

quickquip

2020/06/16 09:49

質問が書いてないように見えますが
maguro2020

2020/06/16 10:01

ご回答いただきありがとうございます。quiqui様。 とてもわかりづらい質問をしてしまい申し訳ありませんでした。「発生している問題・検討していること」の変更をいたしましたので、ご一読いただけたらと思います。
guest

回答1

0

ベストアンサー

「その他」という教師データを作成せずに、3つに分類することは可能でしょうか?

もし「bell」の音声だけ集めて「bell」と「その他」に分類する学習器を作ることができれば可能です。なぜなら同じように「call」の音声だけを集めて「call」と「その他」に分類する学習器を作ることができるので、2値分類を組み合わせて以下の4つのパターンを定義できるからです。

casebellcall分類結果
1FalseFalseその他
2FalseTruecall
3TrueFalsebell
4TrueTrueその他

それでは仮定とした「bell」の音声だけ集めて「bell」と「その他」に分類する学習器が作れますか?ということですが、一つは今回用いている特徴量MFCCを用いて距離関数を定義して、異常検知の考えから分類は可能かも知れません。ただしベルにはいくつも種類があり距離が安定しないという話だと、信頼度のような別のパラメータがない限り難しいでしょう。

幸いにして「bell以外のデータ」として「call」のデータがあります。これを利用できないかを考えることができますが、残念ながらこれは使えません。上の表でbellがTrueのときはcallは必ずFalseで、bellがFalseのときはcallは必ずTrueになります。したがってcase1やcase4は選択されずその他の分類はされません。

私の考えでは「一般的には難しい」と思います。しかし適切な特徴量が発見可能なケースでは分類できるでしょう。

投稿2020/06/16 12:57

yymmt

総合スコア1615

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

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

maguro2020

2020/06/18 06:05

返信が遅れてしまい申し訳ありません。 ご回答いただきありがとうございます。yymmt様。  自分の機械学習に関する知識が乏しいため、私自身の想像のお話になってしまうのですが、入力された音に対して、まず「bellかその他かを判断する」決定木①(2値分類のできる学習器)を作成し、そこで「その他」と判断された場合、次に「callかその他かを判断する」決定木②を組み合わせる、というようなイメージであってますでしょうか?
yymmt

2020/06/18 11:38

私の方で質問を勘違いしていたかも知れません。「bellの教師データ」「callの教師データ」を用意するということは「各々の2値分類器は作ることが可能」という前提でしょうか。「その他を用意しない」と書かれていましたので、単に「bellとラベルの付いたデータ」「callとラベルの付いたデータ」しかデータが存在せず、2値分類器すら作るのが難しい状況であるという前提でお答えしました。 もし2値分類器が作れる前提であれば話はずっと簡単になります。ご質問の本質が「2値分類器を組み合わせて多値分類器が作れませんか?」ということであれば回答はYESです。コメント欄にある方法については、One vs One/One vs Rest、アンサンブル学習等のキーワードで検索して頂ければ、より一般的な、詳しい説明を見つけられると思います。
maguro2020

2020/06/19 05:52

ご回答いただきありがとうございます。yymmt様。 yymmt様のアドバイスを参考に、もう少し自分で調べてみたいと思います。自分のような素人の質問に真摯にお答えいただきありがとうございました。とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問