2016-06-29 3 views
0

私は2つのGMM分類器を、それぞれ1つのラベルに対して、MFCC値で訓練しています。 クラスのすべてのMFCC値を連結し、分類子に当てはめました。 そして各分類器に対して、私はラベルの確率の確率を合計します。クラシファイア予測は信頼性が低いです、私のGMMクラシファイアが正しく訓練されていないためですか?

def createGMMClassifiers(): 
    label_samples = {} 
    for label, sample in training.iteritems(): 
     labelstack = np.empty((50,13)) 
     for feature in sample: 
      #debugger.set_trace() 
      labelstack = np.concatenate((labelstack,feature)) 
     label_samples[label]=labelstack 
    for label in label_samples: 
     #debugger.set_trace() 
     classifiers[label] = mixture.GMM(n_components = n_classes) 
     classifiers[label].fit(label_samples[label]) 
    for sample in testing['happy']: 
     classify(sample) 
def classify(testMFCC): 
    probability = {'happy':0,'sad':0} 
    for name, classifier in classifiers.iteritems(): 
     prediction = classifier.predict_proba(testMFCC) 
     for probforlabel in prediction: 
      probability[name]+=probforlabel[0] 
    print 'happy ',probability['happy'],'sad ',probability['sad'] 

    if(probability['happy']>probability['sad']): 
     print 'happy' 
    else: 
     print 'sad' 

しかし、私の結果は一致しているようだしないと私はそれが難しいすべての予測は、多くの場合、すべてのテストデータに対して同じラベルですされているので、それが原因でRandomSeed =なし状態であると信じて見つけるが、各実行は(出力1と出力2を参照)。

私の質問は、分別器を訓練する際に明らかに間違っていることですか?

出力1:

happy 123.559202732 sad 122.409167294 
happy 

happy 120.000879032 sad 119.883786657 
happy 

happy 124.000069307 sad 123.999928962 
happy 

happy 118.874574047 sad 118.920941127 
sad 

happy 117.441353421 sad 122.71924156 
sad 

happy 122.210579428 sad 121.997571901 
happy 

happy 120.981752603 sad 120.325940128 
happy 

happy 126.013713257 sad 125.885047394 
happy 

happy 122.776016525 sad 122.12320875 
happy 

happy 115.064172476 sad 114.999513909 
happy 

は出力2:以前

happy 123.559202732 sad 122.409167294 
happy 

happy 120.000879032 sad 119.883786657 
happy 

happy 124.000069307 sad 123.999928962 
happy 

happy 118.874574047 sad 118.920941127 
sad 

happy 117.441353421 sad 122.71924156 
sad 

happy 122.210579428 sad 121.997571901 
happy 

happy 120.981752603 sad 120.325940128 
happy 

happy 126.013713257 sad 125.885047394 
happy 

happy 122.776016525 sad 122.12320875 
happy 

happy 115.064172476 sad 114.999513909 
happy 

私は、関連する質問をして、正しい答えを得ました。私は下のリンクを提供しています。

Having different results every run with GMM Classifier

編集: 追加される主なデータを収集し、トレーニングに分割機能とテスト

def main(): 
    happyDir = dir+'happy/' 
    sadDir = dir+'sad/' 
    training["sad"]=[] 
    training["happy"]=[] 
    testing["happy"]=[] 
    #TestSet 
    for wavFile in os.listdir(happyDir)[::-1][:10]: 
     #print wavFile 
     fullPath = happyDir+wavFile 
     testing["happy"].append(sf.getFeatures(fullPath)) 
    #TrainSet 
    for wavFile in os.listdir(happyDir)[::-1][10:]: 
     #print wavFile 
     fullPath = happyDir+wavFile 
     training["happy"].append(sf.getFeatures(fullPath)) 
    for wavFile in os.listdir(sadDir)[::-1][10:]: 
     fullPath = sadDir+wavFile 
     training["sad"].append(sf.getFeatures(fullPath)) 
    #Ensure the number of files in set 
    print "Test(Happy): ", len(testing['happy']) 
    print "Train(Happy): ", len(training['happy']) 
    createGMMClassifiers() 

編集2: は答えに応じてコードを変更しました。それでも似たような結果は似ています。

答えて

0

分類タスクには、分類子に与えられたパラメータを調整することが重要です。また、多数の分類アルゴリズムが理論を選択した後、魔女はモデルのパラメータを簡単に変更すると、

この問題では、さまざまな分類アルゴリズムを試して、データが良好であることをテストし、各分類子ごとに異なる値で異なるパラメータを試してみることもできます問題がどこにあるのかを判断できます。

1つの代替の方法は、これを読んで、特定の分類器のための最良のパラメータを探索してチューニングするグリッド検索を使用することです:http://scikit-learn.org/stable/modules/grid_search.html

+0

お寄せいただきありがとうございます!この特定の分類アルゴリズムに意味のある結果が得られたら、できるだけ早くリンクを確認します。 – Ugur

0

あなたのコードはあまりないセンスを持って、あなたはすべての新しいトレーニングサンプルのための分類器を再作成します。訓練のための

正しいコード体系はこれについてになります。

label_samples = {} 
classifiers = {} 

# First we collect all samples per label into array of samples 
for label, sample in samples: 
    label_samples[label].concatenate(sample) 

# Then we train classifier on every label data 
for label in label_samples: 
    classifiers[label] = mixture.GMM(n_components = n_classes) 
    classifiers[label].fit(label_samples[label]) 

あなたのデコードコードはokです。

+0

空の辞書値を連結するとエラーが発生します。 label_samples [label] = np.concatenate(sample、label_samples [label])を使用すると同じ結果が得られますか? – Ugur

+0

更新されたコードで質問を編集しましたが、同様の種類の矛盾した結果がまだ発生しています。 – Ugur

関連する問題