scikit の RandomForest メソッドを使用して 3D ポイント識別に取り組んでいます。私が常に直面している問題の 1 つは、特定のクラスが他のクラスよりも頻繁に存在することです。
これは、トレーニングされた分類子から予測を生成するプロセスで、分類子がポイント クラスを特定できない場合、それがあまり一般的でないクラスではなく、一般的なクラスの 1 つに属していると想定する可能性が高いことを意味します。
ランダム フォレストの scikit ドキュメントにはsample_weight
、fit メソッドにパラメーターがあることがわかります。私が言えることから、クラスではなく、特定の全体的なサンプルに重みを付けるだけです(たとえば、トレーニングしている50個のファイルがあるとします。最初のサンプルに他のすべての2倍の重みを付けます)。
最も一般的でないクラスは、私が持っているすべてのサンプルでほぼまれであるため、これは問題を解決しません。それはその特定のクラスの性質にすぎません。
バランス ランダム フォレストと加重ランダム フォレストに関する論文をいくつか見つけました。しかし、これを scikit で使用する方法については何も見ていません。私が間違っていることを願っています-組み込みのクラスに重みを付ける方法はありますか? サンプル内のさまざまなクラスの重みを人為的に均一にする別のものを書く必要がありますか?
Sample_weight
ドキュメントによると、クラスの重みではなくサンプルを参照しているようです。したがって、 files A
、B
およびC
classes 1
、2
およびが3
ある場合、次のように言いましょう。
A = [1 1 1 2]
B = [2 2 1 1]
C = [3 1 1 1]
上記を見ると、他のクラスと比較してクラス 3 が非常に少ない、非常に単純化された状況があります。私の状況には 8 つのクラスがあり、何百万ものポイントでトレーニングしていますが、その比率は 2 つの特定のクラスに対して信じられないほど歪んでいます。
サイズ m (m はサンプルの数) の配列を受け取る sample_weight を使用すると、これら 3 つのファイルがどれだけ機能するかを重み付けすることができます。したがって、私の理解ではsample_weight = [1 1 2]
、サンプル C を他の 2 つのサンプルの 2 倍の強度にすることができます。
ただし、クラス 3 が非常にまれであるため、これは実際には役に立ちません (実際のデータでは、12 分の 1 ではなく、数百万分の 1k ポイントです)。
特定のサンプルの重みを増やしても、サンプルがその特定のクラスだけでほとんど何も構成されていないデータを偽造しない限り、特定のクラスの重みは増えません。
ドキュメントで見つけましsklearn.preprocessing.balance_weights(y)
たが、それを使用している人が見つかりません。理論的には、必要なことは実行しますが、重み配列をランダム フォレストに戻す方法がわかりません。