1

sk-learnのRandomForestClassifierを二項分類タスク(正と負の例)に使用しようとしています。私のトレーニングデータには、sklearn.datasetのload_svmlight_fileを使用してロードするSVM-light形式(スパースベクトル)の40の機能を備えた1.177.245の例が含まれています。'機能値'(1.177.245 * 40)のスパース行列と'ターゲットクラス'の1つの配列(1と0、そのうち1.177.245)を生成します。これが気になるかどうかはわかりませんが、trainingdataには3552のポジティブがあり、残りはすべてネガティブです。

sk-learnのRFCはスパース行列を受け入れないため、.toarray()を使用して、スパース行列を密な配列に変換します(そう言っているのであれば、機能がない場合は0がたくさんあります)。配列に変換する前後にマトリックスを印刷しましたが、問題はないようです。

分類器を開始してデータへの適合を開始すると、次のように時間がかかります。

[Parallel(n_jobs=40)]: Done   1 out of  40 | elapsed: 24.7min remaining: 963.3min
[Parallel(n_jobs=40)]: Done  40 out of  40 | elapsed: 27.2min finished

(その出力は正しいですか?それらの963分は約2分半かかります...)

次に、joblib.dumpを使用してダンプします。再ロードすると:

RandomForestClassifier: RandomForestClassifier(bootstrap=True, compute_importances=True,
        criterion=gini, max_depth=None, max_features=auto,
        min_density=0.1, min_samples_leaf=1, min_samples_split=1,
        n_estimators=1500, n_jobs=40, oob_score=False,
        random_state=<mtrand.RandomState object at 0x2b2d076fa300>,
        verbose=1)

そして、実際のトレーニングデータ(750.709の例で構成され、トレーニングデータとまったく同じ形式)でテストすると、「予期しない」結果が得られます。正確には; テストデータの例の1つだけがtrueとして分類されます。最初のトレーニングデータの半分でトレーニングし、残りの半分でテストすると、まったくポジティブになりません。

今、私は何が起こっているのかが間違っていると信じる理由はありません。それは私が奇妙な結果を得るということだけです。さらに、それはすべて非常に迅速に行われたと思います。比較することはおそらく不可能ですが、rt-rankを使用して同じデータでRFClassifierをトレーニングする(これも1500回の反復で、ただしコアの半分で)には12時間以上かかります...

何かが想定どおりに機能していないと信じる理由があるかどうか、誰かに教えてもらえますか?トレーニングデータのポジティブとネガティブの比率でしょうか?乾杯。

4

1 に答える 1

4

実際、このデータセットは非常に不均衡です。ネガティブな例をサブサンプリングするか(たとえば、ランダムに選択する)、ポジティブな例をオーバーサンプリングすることをお勧めしますn_positive_samples(後者はより高価ですが、より良いモデルが得られる可能性があります)。

また、すべての特徴が数値の特徴であると確信していますか(値が大きいほど、実際の生活の中で何かを意味します)?それらのいくつかがカテゴリ整数マーカーである場合、ランダムフォレストのscikit-learn実装はカテゴリデータを直接処理できないため、これらの機能は、代わりに1つのkブ​​ールエンコーディングとして展開する必要があります。

于 2012-09-10T23:01:18.740 に答える