見出し画像

機械学習の種類  決定木 ランダムフォレスト Extra Trees Classifer

機械学習にはいろいろな種類がありますが

今回は決定木とランダムフォレストとExtraTreesierに着目したいと思います


決定木とランダムフォレストとExtraTreesの比較


決定木(けっていぎ・ディシジョンツリー・decision tree)

決定木とは、分類木と回帰木を組み合わせたもので、

ツリー(樹形図)によってデータを分析する手法です

機械学習や統計、マーケティングや意思決定などさまざまな
分野で用いられます

分析対象の重要な特徴量の分布は見やすいため
分析者の想像力を刺激し より示唆に満ちた仮説を構築できる
メリットがありますが

通常、ランダムフォレストのほうが精度高い事が多いです
また、決定木は学習元のデータに対して
オーバーフィッテングになりやすいです

私の場合統計より前に機械学習の勉強から入ってしまったため

線形回帰などより 決定木系の解析の方が優秀だと思ってしまいます

線形回帰では元データが線形であることを仮定してます

ただ医療の世界では複雑な因子が絡み合っていることもあり得ます

現実のデータでは往々にして非線形的であったり

特定の値から急激にデータの性質が変わったりします

そのため非線形を取り扱える 学習器を使うことで
線形回帰と異なった結果を得られます

決定木の可視化によって データの傾向も見えやすくなります


ランダムフォレスト
ランダムフォレストモデルは
複数ツリー(n_estimators)を作成し
過学習を減らす事が出来ます

「決定木」の予測モデルを複数組み合わせた

アンサンブル モデルといわれるモデルとなります

例えば分類基準を決定木によって可視化する方法は

分類に寄与した小数の特徴量しか見ることができず

その他の変数の寄与を調べられませんでした


ランダムフォレストなど複数の決定木を利用した学習機では

重要度(importance)というパラメーターを求めることで
分類や回帰に寄与した特徴量を把握できます

ランダムフォレストではブーストラップサンプリングと
特徴量のランダム選択により多数の決定木を生成します

そしてそれぞれの決定木においてデータの分類や回帰に貢献した
変数を求めその合計値を正規化することで重要度(importance)
とします

重要度(Importance)の定義では、分割対象のノード数が増えるほどその特徴量の重要度は相対的に増加していきます

カテゴリカル変数の場合は分割分岐点の数がカテゴリ数に依存しますが、数値特徴量は分割分岐点をどこにでも取ることができます

重要度(Importance)は
「ターゲットの分類にその特徴量による分割がどれくらい寄与しているかを測る指標」なのであって
具体的にどの特徴量をどれくらいの値にすると結果がどうなるのかは言えません

また、pythonでデータの意味を分からないまま
前処理をしてしまうと 重要度(Importance)の値が
分散されてしまうこともあります

機械学習の重要度(Importance)はカテゴリ値を
One-Hotエンコーディングしてしまうと 見かけ上の重要度(Importance)
が下がってしまうことがある為 注意が必要です

先ほど記載したこととは逆になってしまいますが
古典的な重回帰モデルがいまだに好まれる理由はここにあります

ある変数をどれくらいの値にすることで
どれだけターゲットの値が変化するのかがわかるのが
重回帰モデルの良いところです

ExtraTreesClassifier

ExtraTreesClassifierは、基本的に決定木に基づくアンサンブル学習方法です

英語でアンサンブル(Ensemble)といえば合奏や合唱を意味しますが

機械学習においてのアンサンブル学習(Ensemble Learning)は、
複数のモデル(学習器)を融合させて1つの学習モデルを生成する手法です
分類の場合がClassifier となりますが
以下では Extra Trees 全般について 記述します

Extra Trees
Extra Treesはランダムフォレストに似ています
複数のツリーを構築する所は、一緒ですが、
木のノード(葉)を分割する所の
特徴量(ジニ係数、エントロピー)のどちらかをランダムに選びます

具体的には
決定木では特徴軸を分割する際に、
特徴量(ジニ係数、エントロピー)などを基準に
利得が最大になる特徴とその分割の閾値を選択します

Extra-Treesはそれらをランダムに選択します

このランダムな木を、Random Forestと同じように
複数用意してBaggingします

Bagging(バギング)は、bootstrap aggregatingの略です
名前から分かる通り、各学習器に使う学習用データを
ブースストラップサンプリングによって得て、
その学習した学習器を予測に用いて
最後アンサンブルするという方法になります

ブースストラップサンプリングは
母集団となるデータがあるときに,母集団から重複を許してランダムにいくらかデータを取り出して再標本化をする手法です

機械学習においてのアンサンブル学習(Ensemble Learning)は、
複数のモデル(学習器)を融合させて1つの学習モデルを生成する手法です


Extra-Treesの学習の特徴は

それぞれの木を学習する際に、ブースストラップサンプリングはせずに

つまり母集団から重複を許してランダムにいくらかデータを取り出して
再標本化をする手法を使わずに

訓練データ全てを用います!!!

全てのデータを学習させるんです!

シンプルなので高速に動きますし
分類精度もRandom Forestに匹敵する値となります

Pythonの代表的な機械学習のライブラリである
scikit-learnを使った場合のExtraTreesClassifier
は以下のようになります

機械学習というと、複雑な数式を使ったり
なんだか難しそうなイメージですが、scikit-learnを使うと
とても手軽に機械学習を試してみることができます

まずは使用してみて 出てきた結果から

以下のパラメーターを確認してみる方法が個人的にはお勧めです

class sklearn.ensemble.ExtraTreesClassifier(n_estimators=100, criterion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=False, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)

n_estimator:フォレスト内のツリーの数(10~100)「int」
criterion:サポートされる基準は、Gini不純物の「gini」および情報ゲインの「entropy」です。
max_depth:ツリーの最大の深さ「int」
min_samples_split:内部ノードを分割するために必要なサンプルの最小数「int」
min_samples_leaf:リーフノードにあるために必要なサンプルの最小数「int」
min_weight_fraction_leaf:リーフノードに存在する必要がある(すべての入力サンプルの)重みの合計の最小重み付き割合 「int」
max_features:最適な分割をする特徴量数「int」「float」「auto」「sqrt」「log2」
max_leaf_nodes:リーフノードの最大値 「int」
min_impurity_decrease:この分割がこの値以上の不純物の減少を引き起こす場合、ノードは分割されます。
min_impurity_split:木の成長の早期停止のしきい値
oob_score:一般化の精度を推定するためにアウトオブバッグサンプル
n_jobs:並行して実行するジョブの数
random_state:乱数を制御するパラメータ
bootstrapping:ツリーの構築時に使用されるサンプルのブートストラップの設定

この記事が気に入ったらサポートをしてみませんか?