2020年7月23日木曜日

RandomForestはホントに交互作用を拾うか?

木構造系のモデルは、分岐の組み合わせにより説明変数間の交互作用もモデルに自動的に組み込まれそうな「気がする」。しかし実際に実際に動かしてそのことを確認した記事がネット上になかったので自分自身で確認することに。

まずはトイデータを用意。ここでX[:, 2]とX[:, 3]が交互作用で目的変数に効くようにしている。X[:, 0]は目的変数には無関係な説明変数。

次に学習&テストデータセットに分けて学習と予測を行って精度評価してみる。
ここでは比較対象として単純な線形回帰モデルも使っている。



なるほど、ほとんど予測できていない線形回帰と比べてRandomForestは精度良く予測できている。

Importanceも一応見てみると、交互作用に関わる変数のImportanceが高くなっている。


以上、当たり前といえば当たり前だけど実際に確認してみた。

ここに元のNotebookを置いています。

2020年4月26日日曜日

ufwでのファイアウォール設定

ufw(Uncomplicated FireWall)はファイアウォールを設定するコマンドで、iptablesのwrapperのような位置付けのようである。

下記に設定の仕方をメモ。

2019年2月23日土曜日

ジニ係数とは何か?解釈と実装

決定木にて分類の基準によくジニ係数(Gini inpurity / Gini index)という尺度が使われる。
このジニ係数について少し考察してみたのでメモ。

ジニ係数の定義と挙動

あるデータセット\(t\)の中に\(K\)種のクラスのサンプルが含まれる場合、ジニ係数は
\[ I(t)= \sum_{i\neq j} P(C_i|t)P(C_j|t)=\sum_{i=1}^{K} P(C_i|t)(1-P(C_i|t) = 1- \sum_{i=1}^{K}P^2(C_i|t) \] と定義される。 ここで\(P(C_i|t)\)はデータセット\( t \)の中に含まれるクラス\( i \)のサンプル数の割合である。
この定義式を元に2つのクラス(0, 1)が含まれる20個のデータを例にクラス0が含まれる数に応じたジニ係数の変化をプロットしたのが下図。期待通りデータセットの中に各クラスのデータが均等に含まれれば含まれるほどジニ係数の値は大きくなり、偏って含まれれる場合は小さくなり、純粋に1つのクラスしか含まれない場合はゼロになる。


ジニ係数の解釈

ジニ係数の定義は「データセットの中から無作為に2つサンプルを取り出したときに異なるクラスのサンプルが取り出される確率」と解釈するとわかりやすい。
データセット\( t \)の中から無作為に2回取り出すベルヌーイ試行*1を考えたときに、同じクラスのサンプルが取り出される確率は\( \sum_{i=1}^{K}P^2(C_i|t) \)。その逆で異なるクラスのサンプルが取り出される確率は、\( 1- \sum_{i=1}^{K}P^2(C_i|t)\)となり、これがジニ係数の定義と一致するというわけ。

複数データセットでのジニ係数

決定木アルゴリズムでは決定木のノードで元のデータセットを2つ(\(L\)と\(R\))に分割する。そのためこの分割後の2つのデータセット全体の不純度が小さい分割の仕方を選ばないといけない。そのため決定木アルゴリズムでは、 \[ I_{split}(t)= p_{L}I(t_{L}) + p_{R}I(t_{R}) \] の量が最小となる分割方法を見つけることになる*2。ここで\(p_{L}\)と\(p_{R}\)はそれぞれ分割後のデータセットのサンプル数の元のデータセットに対する割合。

ジニ係数と交差エントロピー

はじめてのパターン認識でも書かれているけど、不純度の尺度はジニ係数だけではなく、交差エントロピー \[ I(t)= -\sum_{i=1}^{K}P(C_i|t)\log P(C_i|t) \] も使われることがある。ただし、挙動がほぼ同じということと、ジニ係数であれば、計算コストの高いLogの計算をしなくて良いため、ジニ係数が利用されることが多い様子。

ジニ係数の実装@Python3

折角なのでPythonでジニ係数を計算する関数をPythonで実装してみた。上記\( I_{split}(t)\)を計算するコードです。
ここのジニ係数を計算する関数を参考にした。ただしジニ係数の定義上、ジニ係数の計算時に存在するクラスを事前に知る必要がないはず*3なのでデータセットだけを関数に渡す方式に変更している。
(*1): サンプルを複数回無作為に取り出す際に、一度取り出したサンプルを「戻して」再度サンプルを無作為に取り出す試行。
(*2): 初めてのパターン認識の(11.11)式。
(*3): たとえ対象のデータセットの中に現れないクラスが存在したとしてもそれはジニ係数に寄与しない。

2018年5月15日火曜日

Mac OSXへのoctaveインストール

会社でcoursera machine learningを受講することになった。
その中で使うoctaveをここらを参考にmac OSX(High Sierra)にインストールしようとして
「brew install octave」コマンドを実行したら
Error: Could not symlink include/octave-4.4.0 /usr/local/include is not writable.
なるエラーが出てインストール(リンク)ができない事態が発生。

色々調べて結局、以下の解決方法で解決。要は自分で/usr/local/includeのディレクトリを作成してから、brew実行する。(インストールは成功しているのでリンクだけ実行)
$ sudo mkdir /usr/local/include
$ sudo chown -R $(whoami):admin /usr/local/include
$ sudo chown -R $(whoami):admin /usr/local/include
$ brew link octave

2018年1月28日日曜日

add-apt-repositoryコマンド実行でエラーが出た時の対処法

Ubuntu 16.04にて、OSインストール直後の状態ではadd-apt-repositoryのコマンドを実行すると「Command Not Found」エラーが出る。その解消は下記の2つのコマンドを実行すればOK。
$ sudo apt-get update
$ sudo apt-get install software-properties-common

簡単。





Ubuntu16.04でssh接続するために

Ubuntu16.04はOSインストール直後の状態ではssh接続すらできない。なぜなら、Ubuntuではsshクライアントはデフォルトで入っているけどssh-serverは入っていないから。なのでインストールする。
$ sudo apt-get install openssh-server




2017年12月10日日曜日

ubuntu16.04 で pip3 のアップグレードにハマった。

ubuntu16.04 で pip3 9.01にアップグレードする時に少しハマったのでメモ。

■ python 2.7のpipのアップグレード
$ sudo pip install --upgrade pip

■ python 3.5 のpip3のアップグレード
$ sudo pip3 install --upgrade pip
※どうも、引数のほうはpip3でなくて「pip」とするところがミソらしい。