2016-01-02 15 views
5

SVMでマルチラベル分類を実行しようとしています。 私はほぼ8kの特徴を持っていて、長さが約400のyベクトルも持っています。私はすでにYベクトルを二値化していますので、私はMultiLabelBinarizer()を使用しませんでした。Scikit-Learn:すべてのトレーニング例にラベルxが含まれていません

私はこのコードを実行している:

X = np.genfromtxt('data_X', delimiter=";") 
Y = np.genfromtxt('data_y', delimiter=";") 
training_X = X[:2600,:] 
training_y = Y[:2600,:] 

test_sample = X[2600:2601,:] 
test_result = Y[2600:2601,:] 

classif = OneVsRestClassifier(SVC(kernel='rbf')) 
classif.fit(training_X, training_y) 
print(classif.predict(test_sample)) 
print(test_result) 

すべてのフィッティングプロセスの後に、それは予測部に来るとき、それは(xは400である私のyベクトルの長さの範囲内で、いくつかの異なる数である)Label not x is present in all training examplesを語ります。その後、予測されたyベクトルが得られ、これは常に長さ400のゼロベクトル(yベクトル長)です。 私はscikit-learnでも機械学習でも新しいです。私はここで問題を理解することができませんでした。何が問題なのですか、それを修正するために何をすべきですか?おかげさまで

答えて

10

ここ2つの問題があります。

1)
2警告誤ったラベルが)あなたは予測に

をすべて0を取得している警告があなたのクラスのいくつかは、トレーニングデータから欠落していることを意味します。これは一般的な問題です。 400クラスがある場合、そのうちのいくつかは非常にまれにしか発生しません。また、データの分割によっては、分割の片側から一部のクラスが欠落することがあります。あなたのデータにはまったく起こらないクラスもあります。あなたはY.sum(axis=0).all()を試してみることができ、それがFalseの場合は、YでもYが発生しないクラスもあります。これはすべて恐ろしいものですが、現実的には、0,1、または非常に小さいクラスを正しく予測することはできませんとにかく何回もそうすることができるので、それらを0と予測することはおそらくあなたができる最高のものです。

all-0の予測については、400クラスではおそらくすべてのクラスが半分よりもずっと少ないことを指摘します。 Y.mean(axis=0).max()をチェックして最高のラベル頻度を得ることができます。 400のクラスでは、数パーセントに過ぎないかもしれません。その場合、各クラスの0-1予測を行うバイナリクラシファイアは、おそらくすべてのインスタンスのすべてのクラスに対して0を選択します。これは実際にはエラーではなく、すべてのクラスの頻度が低いためです。

各インスタンスに肯定ラベル(少なくとも1つ)があることがわかっている場合は、決定値(clf.decision_function)を取得し、インスタンスごとに最高のクラスを選択できます。あなたはそれを行うためにいくつかのコードを書く必要があります。

私はかつてKaggleコンテストでこれに似たトップ10のフィニッシュを経験しました。 〜200のクラスを持つマルチラベルの問題でしたが、いずれも10%の頻度でも発生しなかったため、0〜1回の予測が必要でした。その場合、私は決定値を得て、最高値をとり、閾値を上回った値を取った。私は、ホールドアウトセットで最も効果的なしきい値を選んだ。そのエントリのコードはGithub:Kaggle Greek Media codeにあります。あなたはそれを見てみるかもしれません。

これまでに作成した場合は、読んでいただきありがとうございます。希望が役立ちます。

+1

こんにちは、有用なものがたくさんあります。私は 'Y.sum(axis = 0).all()'を試み、Trueを返しました。また、私は 'Y.mean(axis = 0).max()'を試して、 '0.315981070258'を返しました。私はまだ 'clf.decision_function'を実装すべきですか?あなたはそれについてもっと具体的にすることができますか、どのように実装するのですか?申し訳ありませんが、私はこれらのもので非常に新しいので、私は 'decision_function'と何をするべきかを理解できませんでした。 – malisit

+1

私は、すべてのゼロ予測を得ていて、そこに1があるはずであることを知っている場合は、代わりに意思決定値を取得し、それがある閾値を上回るたびに1を予測することができます。予測ラベルは '(decision_value> threshold).astype(float)'となります。 0は、分類器が使用している閾値であり、陽性を得ていない閾値であるため、閾値は0未満である。また、インスタンスごとに少なくとも1つの正のラベルがあることがわかっている場合は、DVが最も高いラベルを選択できます(それでも負の値になります)。 – Dthal

+0

ありがとう! GitHubで提供した直感とコードが本当に助けになりました。 – malisit

関連する問題