機略戦記

Maneuver warfare

RでrandomForest()を実行した時、 Are you sure you want to do regression?と警告される。

前提

logical型の目的変数をrandomForest() (randomForestパッケージの)で予測したい。 regressionでは無くclassificationがしたい訳だが、以下の警告がでる。

> nikkei225.rf <- randomForest(is_up~., data=train.rf, mtry = 184)
 警告メッセージ: 
 randomForest.default(m, y, ...): 
  The response has five or fewer unique values.  Are you sure you want to do regression?

「予測結果の値が5種類以下しか無いが、本当にregressionがしたいのか? ( classification がしたいのでは? )」という意味だと思う。

つまり regression モードで実行されている。(おそらく)

結論

目的変数がlogical型になっていると、regression モード になるっぽい。 目的変数をfactor型に変換してあげればclassification モードになる。

例:

> train.rf$is_up <- as.factor(train.rf$is_up)
> nikkei225.rf <- randomForest(is_up~., data=train.rf, mtry = 184)

説明

全然勘だけど、Rにおけるlogical型が数値のような振る舞いをする事に関係しているのではないか。

logical型が数値のような振る舞いをする例:

> TRUE + TRUE
[1] 2

> sum(c(TRUE, TRUE, TRUE))
[1] 3

感想

logical型というのは、「物事が真であるか偽であるか」を表す型であるべきなのではないだろうか。 真が3つ連続したvector整数の3が等価であるというのは概念的に全然自然では無いと思うけど、まぁ、TRUE/FALSEが1/0のエイリアスである言語すらあるので、そういう世界観なんだろう。

importance(randomForest)の結果をdata.table (もしくはdata.frame)で得たい

前提

RのrandomForestパッケージにあるimportance()関数を使うと、学習した各種特徴量が目的変数の説明にどのくらい寄与しているのか得られる。

この時、この結果は、特徴量をrownameとするMatrixとして得られる。これをV1を特徴量の名前、V2を寄与度とするdata.tableに変換したい。

結論

nikkei225.rf <- randomForest(change~., data=train.rf, mtry = 242)
nikkei225.rfp <- predict(nikkei225.rf, test)

valiable_names <- rownames(importance(nikkei225.rf))
valiable_importances <- importance(nikkei225.rf)[,'IncNodePurity']

data.table(valiable_names=valiable_names, valiable_importances=valiable_importances)

説明

rownames()でMatrixのrow nameが得られるので、そいつと、寄与度を取り出して、新たにdata.tableとして組み立てる。

もっと賢いやり方があるに違いないが、とりあえずできた。

御社ァ!!

$ ruby -e '7.times.map{|_| ["御社","貴社"].sample + ["アァァ", "アァ", "ァ", ""].sample + ["...", "!?", "!", "!!", ""].sample }.each_slice(3){|shout| puts "「#{shout.join([" 」\n「",""].sample)}」" }'

実行例

「貴社!?御社...貴社ァ!?」
「貴社アァァ!?貴社ァ!御社アァ」
「御社アァァ!!」

NYSOLシリーズのRubyMで超高速にcsvを扱いたい

  • MCMDで有名なNYSOLプロジェクトがこのようなライブラリを出してる。
  • rubyでcsvを高速に扱うためのライブラリで、公式Webサイトによれば、標準のCSVFasterCSVなどと比較して桁違いに早いらしい。
  • インストールに結構手間取ったので作業メモを残しておく。
    • とりあえず試しに動かしてみるための雑な手順。

前提

  • Mac OS Yosemite
  • rbenv インストール済み

インストール方法

1. とりあえずNYSOLをインストール

インストール - NYSOL

2. rbenvを切ってsystem標準のrubyに切り替える

rbenv local system

※ 公式Webにrvm環境では動きません。と書いてある。たぶんrbenvでも動かないんだろう。

3. gemの一覧にnysolが含まれることを確認

$ gem list | grep sol
nysol (2.0.1 universal-darwin)

4. require すると使える

pry(main)> require 'nysol/mcsvin'
=> true