ランダムフォレスト(分類分析)


ランダムフォレスト(Random Forest)とは

 

ランダムフォレスト(Random Forest)とは、分類や回帰に使える機械学習の手法です。前回までのリッジ回帰・ラッソ回帰は回帰問題つまり数値を予測する時にしか用いられません。これは最も柔軟で使いやすいアルゴリズムの1つです。 ランダムフォレストはランダムに選択されたデータサンプルによって決定木を作成し、各ツリーから予測を取得し、投票によって最良の解決策を選択します。例えばですが、決定木を5つ作り、5つのうち3つがA、2つがBならばAを選択します。また回帰問題の時は、5つが

[10,12,8,4,14]と予測すれば、その平均値9.6、中央値10で予測します。

 

ランダムフォレストには、レコメンドエンジン、画像分類、機能選択など、さまざまな応用例があります。 というのも精度が非常に高く、評判の良いアルゴリズムになります。

 

アルゴリズムの4つのステップ

1.与えられたデータセットからランダムサンプルを選択する。

2.各サンプルの決定木を構築し、各決定木から予測結果を得る。

3.予測結果ごとに投票を行います。

4.最終的な予測として最も多くの票を有する予測結果を選択する。

random_forest1

 

特所

  • ランダムフォレストは、各決定木の特徴が異なり、複雑な意思決定ができます。
  • 決定木と比較すると過剰適合(オーバーフィッティング 過去記事のリンク)の問題はありません。 主な理由は、すべての予測の平均をとることで、バイアスを相殺します。
  • ランダムフォレストは欠損値も処理できます。 これらを処理するには、中間値を使用して連続変数を置き換え、欠損値の近接加重平均を計算する2つの方法があります。
  • 重要度を得ることができます。これは、分類子に最も寄与する特徴を選択するのに役立ちます。

 

短所

  • ランダムフォレストは、複数の決定木があるため予測の生成が遅い。 予測を行うたびに、フォレスト内のすべてのツリーは、同じ入力に対して予測を行い、その上で投票を実行する必要があります。 このプロセス全体は時間がかかります。
  • 決定木と比較して、モデルは解釈が難しくなっています。なぜならば、複数の木が存在するためです。

 

Scikit-learnのランダムフォレストのpython

 

#ライブラリーのインポート

from sklearn import datasets

#Irisデータロード

iris = datasets.load_iris()

import pandas as pd

data=pd.DataFrame({

    ‘sepal length’:iris.data[:,0],

    ‘sepal width’:iris.data[:,1],

    ‘petal length’:iris.data[:,2],

    ‘petal width’:iris.data[:,3],

    ‘species’:iris.target

})

# 学習・テストを分ける

from sklearn.model_selection import train_test_split

X=data[[‘sepal length’, ‘sepal width’, ‘petal length’, ‘petal width’]]  #フィーチャー

y=data[‘species’]  # ラベル

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% 学習 30%テスト

#ランダムフォレスト

from sklearn.ensemble import RandomForestClassifier

# Gaussian Classifier作成

clf=RandomForestClassifier(n_estimators=100)

clf.fit(X_train,y_train)

y_pred=clf.predict(X_test)

# Accuracy計算

from sklearn import metrics

print(“Accuracy:”,metrics.accuracy_score(y_test, y_pred))

 

Accuracy: 0.977777

 

#予測

clf.predict([[2, 5, 4, 1]])

 

array([1])

 

#重要度の計算

from sklearn.ensemble import RandomForestClassifier

clf=RandomForestClassifier(n_estimators=100)

clf.fit(X_train,y_train)

RandomForestClassifier(bootstrap=True, class_weight=None, criterion=’gini’,

            max_depth=None, max_features=’auto’, max_leaf_nodes=None,

            min_impurity_decrease=0.0, min_impurity_split=None,

            min_samples_leaf=1, min_samples_split=2,

            min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1,

            oob_score=False, random_state=None, verbose=0,

            warm_start=False)

import pandas as pd

feature_imp = pd.Series(clf.feature_importances_,index=iris.feature_names).sort_values(ascending=False)

feature_imp

import matplotlib.pyplot as plt

import seaborn as sns

# 図作成

sns.barplot(x=feature_imp, y=feature_imp.index)

plt.xlabel(‘Feature Importance Score’)

plt.ylabel(‘Features’)

plt.title(“Visualizing Important Features”)

plt.legend()

plt.show()

random_forest2

まとめ

この記事は、過度の問題を生じることなく、高精度で分類を解決するためにランダムフォレストのモデルを作りました。 ただ一つの欠点は、複数の決定木があるため学習期間が長いです。

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

https://www.datacamp.com/community/tutorials/random-forests-classifier-python