ターゲットクラスインスタンスが次の比率_60000:1000:1000:50
_で非常に不均衡なデータセットを持っています(つまり、合計4つのクラス)。ターゲットクラスの予測を行うためにrandomForest
を使用したいと思います。
そこで、クラスの不均衡を減らすために、sampsize
パラメーターを使用してc(5000, 1000, 1000, 50)
およびその他の値に設定しましたが、あまり使用されていませんでした。実際、sampsize
で遊んでいる間、1番目のクラスの精度は低下しましたが、他のクラスの予測の改善はごくわずかでした。
アーカイブを調べているときに、randomForest()
のさらに2つの機能に遭遇しました。これらは、strata
とclasswt
であり、クラスの不均衡の問題を相殺するために使用されます。
classwt
に関するすべてのドキュメントは古く(通常、2007年、2008年に属しています)、classwt
のような完全な機能を完全に実装していないため、randomForest
のR
パッケージのfortran
機能の使用は推奨されていません。したがって、最初の質問は次のとおりです。classwt
はRのrandomForest
パッケージに完全に実装されていますか?実装されている場合、c(1, 10, 10, 10)
をclasswt
引数に渡すとどうなりますか(上記の4つのクラスの場合を想定)ターゲット変数内)
クラスの不均衡の問題を相殺すると言われているもう1つの引数は、層化サンプリングです。これは、常にsampsize
と組み合わせて使用されます。私はドキュメントからsampsize
が何であるかを理解していますが、クラスの不均衡の問題を克服するためのstrata
の使用について明確な洞察を与えた十分なドキュメントや例はありません。したがって、2番目の質問は次のとおりです。strata
in randomForest
に渡す必要がある引数のタイプとそれが何を表すか?
私は、質問で明示的に言及していない単語weightが回答で主要な役割を果たすはずだと思います。
classwt
はrandomForest
に正しく渡されます。次の例を確認してください:
library(randomForest)
rf = randomForest(Species~., data = iris, classwt = c(1E-5,1E-5,1E5))
rf
#Call:
# randomForest(formula = Species ~ ., data = iris, classwt = c(1e-05, 1e-05, 1e+05))
# Type of random forest: classification
# Number of trees: 500
#No. of variables tried at each split: 2
#
# OOB estimate of error rate: 66.67%
#Confusion matrix:
# setosa versicolor virginica class.error
#setosa 0 0 50 1
#versicolor 0 0 50 1
#virginica 0 0 50 0
クラスの重みは、結果の事前です。必要な結果を得るには、それらのバランスをとる必要があります。
strata
とsampsize
では、この回答が役に立ちます: https://stackoverflow.com/a/20151341/2874779
一般に、すべてのクラスで同じサイズのsampsize
は妥当なようです。 strata
は、何も入力する必要がない場合に、層別のリサンプリングに使用される要素です。
ランダムフォレストはクラスの不均衡に非常に敏感であるため、おそらく問題に適した分類器ではありません。
私が不均衡な問題を抱えているとき、私は通常あなたが試したようにsampsize
を使ってそれを扱います。ただし、すべての階層を同じサイズにして、置換せずにサンプリングを使用しています。置き換えのないサンプリングはここでは重要です。さもないと、小さいクラスのサンプルに多くの繰り返しが含まれ、クラスはまだ十分に表現されないためです。このアプローチでサンプル数が少ない場合は、mtry
を増やす必要があります。場合によっては、特徴の総数に設定することもあります。
これは、最小クラスに十分な数のアイテムがある場合にうまく機能します。ただし、最小クラスには50項目しかありません。 sampsize=c(50,50,50,50)
で役立つ結果が得られるとは思いません。
また、classwt
は私のために働いたことはありません。
名前付きベクトルをclasswt
に渡すことができます。しかし、重量の計算方法は非常にトリッキーです。
たとえば、ターゲット変数y
に2つのクラス「Y」と「N」があり、バランスの取れた重みを設定する場合は、次のようにします。
_wn = sum(y="N")/length(y)
wy = 1
_
次にclasswt = c("N"=wn, "Y"=wy)
を設定します
または、ranger
パッケージを使用することもできます。このパッケージは、ランダムフォレストの柔軟な構築を提供し、クラス/サンプルの重みの指定は簡単です。 ranger
はcaret
パッケージでもサポートされています。