web-dev-qa-db-ja.com

RのrandomForestでclasswtを使用する方法

ターゲットクラスインスタンスが次の比率_60000:1000:1000:50_で非常に不均衡なデータセットを持っています(つまり、合計4つのクラス)。ターゲットクラスの予測を行うためにrandomForestを使用したいと思います。

そこで、クラスの不均衡を減らすために、sampsizeパラメーターを使用してc(5000, 1000, 1000, 50)およびその他の値に設定しましたが、あまり使用されていませんでした。実際、sampsizeで遊んでいる間、1番目のクラスの精度は低下しましたが、他のクラスの予測の改善はごくわずかでした。

アーカイブを調べているときに、randomForest()のさらに2つの機能に遭遇しました。これらは、strataclasswtであり、クラスの不均衡の問題を相殺するために使用されます。

classwtに関するすべてのドキュメントは古く(通常、2007年、2008年に属しています)、classwtのような完全な機能を完全に実装していないため、randomForestRパッケージのfortran機能の使用は推奨されていません。したがって、最初の質問は次のとおりです。
classwtはRのrandomForestパッケージに完全に実装されていますか?実装されている場合、c(1, 10, 10, 10)classwt引数に渡すとどうなりますか(上記の4つのクラスの場合を想定)ターゲット変数内)

クラスの不均衡の問題を相殺すると言われているもう1つの引数は、層化サンプリングです。これは、常にsampsizeと組み合わせて使用​​されます。私はドキュメントからsampsizeが何であるかを理解していますが、クラスの不均衡の問題を克服するためのstrataの使用について明確な洞察を与えた十分なドキュメントや例はありません。したがって、2番目の質問は次のとおりです。
stratain randomForestに渡す必要がある引数のタイプとそれが何を表すか?

私は、質問で明示的に言及していない単語weightが回答で主要な役割を果たすはずだと思います。

25
StrikeR

classwtrandomForestに正しく渡されます。次の例を確認してください:

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

クラスの重みは、結果の事前です。必要な結果を得るには、それらのバランスをとる必要があります。


stratasampsizeでは、この回答が役に立ちます: https://stackoverflow.com/a/20151341/2874779

一般に、すべてのクラスで同じサイズのsampsizeは妥当なようです。 strataは、何も入力する必要がない場合に、層別のリサンプリングに使用される要素です。

ランダムフォレストはクラスの不均衡に非常に敏感であるため、おそらく問題に適した分類器ではありません。

私が不均衡な問題を抱えているとき、私は通常あなたが試したようにsampsizeを使ってそれを扱います。ただし、すべての階層を同じサイズにして、置換せずにサンプリングを使用しています。置き換えのないサンプリングはここでは重要です。さもないと、小さいクラスのサンプルに多くの繰り返しが含まれ、クラスはまだ十分に表現されないためです。このアプローチでサンプル数が少ない場合は、mtryを増やす必要があります。場合によっては、特徴の総数に設定することもあります。

これは、最小クラスに十分な数のアイテムがある場合にうまく機能します。ただし、最小クラスには50項目しかありません。 sampsize=c(50,50,50,50)で役立つ結果が得られるとは思いません。

また、classwtは私のために働いたことはありません。

0
Daniel Mahler

名前付きベクトルをclasswtに渡すことができます。しかし、重量の計算方法は非常にトリッキーです。

たとえば、ターゲット変数yに2つのクラス「Y」と「N」があり、バランスの取れた重みを設定する場合は、次のようにします。

_wn = sum(y="N")/length(y)
wy = 1
_

次にclasswt = c("N"=wn, "Y"=wy)を設定します

または、rangerパッケージを使用することもできます。このパッケージは、ランダムフォレストの柔軟な構築を提供し、クラス/サンプルの重みの指定は簡単です。 rangercaretパッケージでもサポートされています。

0
West Yang