2017-06-07 21 views
0

いくつかの不均衡なデータ(約20:1の比率)でバイナリ分類を実行しようとしていますが、トレーニング/テストで使用されていないデータでほぼ完全なクロス検証精度です。数千の否定的な例と数百の正の例があります。このデータは正規化され、クラス分布のバランスをとるためにSMOTEが使用されました。不均衡なデータでオーバー変換する

RandomForestsクラシファイアを使用すると、KFoldのクロスバリデーションはほぼ完璧ですが、リコール/精度の値は0.1〜0.3です。私はさまざまなバランシング手法、PCA(オリジナルの機能は約80種類あります)、複数のクラシファイア、CVグリッドの最適化、そして8倍トレーニング後のツリーの組み合わせさえも試みましたが、これらのどれも結果を大幅に改善しませんでした。

新鮮なデータと比較してトレーニングがどれほどうまくいったのかちょっと驚きました。それは過度の訓練のため可能ですか?私は、木の組み合わせがこれを緩和するのに役立つことを望んでいたが、そうではなかった。 このデータは、利用可能な機能で分類するのが難しいかもしれませんが、欠けているものがありますか?

+2

はい、絶対に可能です。あるいは、新鮮なデータは使用された列車/交差検定データとは非常に異なっているかもしれません。ちなみに、この質問はプログラミングやアプローチや手法についてはそれほど重要ではないので、これはstackoverflow.comには適していません。 https://stats.stackexchange.comでこの質問をお試しください。コード、データ、正確な手順についての詳細があります。 –

答えて

1

解決策は実際には非常に簡単です。分類が不均衡の場合、体重に分類する必要があります。モデルでは、データの大部分を破棄することなく、真と偽を同じように分類する方法を学習します。

は、この簡単な例のようなものを試してみてください:

def calculate_class_weights(train_classifications): 

    one_count = 0 
    zero_count = 0 
    one_weight = 0 

    for i in train_classifications: 
     if i == 1: 
      one_count += 1.0 
     if i == 0: 
      zero_count += 1.0 

    if one_count > zero_count: 
     one_weight = one_count/zero_count 

    if one_count < zero_count: 
     one_weight = zero_count/one_count 

    return one_weight 

これは、負の分類に比べて正の分類の相対的な「重み」を与えるだろう。次に、このようにモデルを呼び出すことができます。

classifier = svm.SVC(probability=True, class_weight={1: one_weight}) 
classifier.fit(training_set, train_classifiers) 

だからここに負の重みが1であり、正の重みを先に​​計算されたものは何でもあります。たとえば、ネガと同じ数のポジティブが2倍の場合は0.5になります。

幸運を祈る!

関連する問題