PythonとScikit-LearnによるRandom Forestアルゴリズム

ランダムフォレストは、アンサンブル学習に基づく教師あり機械学習アルゴリズムの一種である。アンサンブル学習とは、異なる種類のアルゴリズムや同じアルゴリズムを複数回結合して、より強力な予測モデルを形成する学習の一種である。ランダムフォレストアルゴリズムは、同じ種類の複数のアルゴリズム、すなわち複数の決定木を組み合わせることで、木の森を形成するため、「ランダムフォレスト」と呼ばれている。ランダムフォレストアルゴリズムは回帰と分類の両方のタスクに使用することができる。

ランダムフォレストアルゴリズムの仕組み

ランダムフォレストアルゴリズムを実行するための基本的な手順を以下に示す。

  1. データセットからN個のランダムなレコードを選ぶ。
    1. N個のレコードをもとに決定木を構築する。
    1. アルゴリズムに必要な木の本数を選択し、ステップ1、2を繰り返す。
    1. 回帰問題の場合、新しいレコードに対して、森の中の各木はY(出力)の値を予測する。最終的な値は、forest内のすべての木が予測した値の平均を取ることで計算できる。また、分類問題の場合は、forest内の各木が新しいレコードが属するカテゴリを予測する。最終的に、新しいレコードは多数決で選ばれたカテゴリに割り当てられる。

ランダムフォレストを利用するメリット

どのようなアルゴリズムでもそうですが、それを使うことにはメリットとデメリットがあります。次の2つのセクションでは、分類と回帰にランダムフォレストを使用することの長所と短所を見ていきます。

  1. ランダムフォレストアルゴリズムは、複数の木があり、それぞれの木はデータのサブセットで学習されるため、偏りがない。基本的に、ランダムフォレストアルゴリズムは「群衆」の力に依存しているため、アルゴリズム全体の偏りが少なくなる。
    1. このアルゴリズムは非常に安定している。新しいデータが1つの木に影響を与えることはあっても、すべての木に影響を与えることは非常に難しいため、データセットに新しいデータポイントが導入されても、アルゴリズム全体にはあまり影響がない。
    1. ランダムフォレストアルゴリズムは、カテゴリと数値の両方の特徴を持つ場合にうまく機能する。
  2. 4.ランダムフォレストアルゴリズムは、データに欠損値がある場合や、うまくスケーリングされていない場合にもうまく機能する(ただし、この記事ではデモンストレーションのために特徴のスケーリングを行っただけである)。

ランダムフォレストを利用するデメリット

  1. ランダムフォレストの主な欠点は、その複雑さにある。多数の決定木が結合されているため、より多くの計算資源を必要とする。
    1. 複雑であるため、他の類似のアルゴリズムと比較して、学習に多くの時間を必要とする。

この記事の残りの部分では、PythonのScikit-Learnライブラリを使用して、分類だけでなく回帰の問題を解決するためにランダムフォレストアルゴリズムを実装する方法を説明します。

その1: 回帰のためのランダムフォレストの使用

このセクションでは、Scikit-Learnを使用して回帰問題を解くためにランダムフォレストをどのように使用できるかを勉強します。次のセクションでは、ランダムフォレストを用いて分類問題を解決します。

問題定義

この問題は,ガソリン税(セント),一人当たりの所得(ドル),舗装された高速道路(マイル),運転免許を持つ人口の割合から,アメリカの48州におけるガソリン消費量(百万ガロン)を予測するものである.

解決策

この回帰問題を解くために、Scikit-Learn Pythonライブラリを介してランダムフォレストアルゴリズムを使用します。この問題を解決するために、伝統的な機械学習パイプラインに従います。以下のステップを踏んでください。

1. ライブラリのインポート

以下のコードを実行し、必要なライブラリをインポートしてください。

import pandas as pd
import numpy as np


2. データセットのインポート

この問題のデータセットは、以下の場所で入手できます。

302 Moved

このチュートリアルのために、データセットは「D」ドライブの「Datasets」フォルダーにダウンロードされています。ご自身の設定に合わせて、ファイルパスを変更してください。

以下のコマンドを実行し、データセットをインポートしてください。

dataset = pd.read_csv('D:Datasetspetrol_consumption.csv')


データセットがどのようなものかを見るには、次のコマンドを実行する。

dataset.head()


| | Petrol_tax | Average_income | Paved_Highways | Population_Driver_license(%) | Petrol_Consumption

| 0 | 9.0 | 3571 | 1976 | 0.525 | 541 |
| 1 | 9.0 | 4092 | 1250 | 0.572 | 524 |
| 2 | 9.0 | 3865 | 1586 | 0.580 | 561 |
| 3 | 7.5 | 4870 | 2351 | 0.529 | 414 |
| 4 | 8.0 | 4399 | 431 | 0.544 | 410 |

データセットの値はあまりうまくスケーリングされていないことがわかります。アルゴリズムを学習する前に、それらをスケールダウンすることにします。

3. 学習用データの準備

このセクションでは、2つのタスクを実行する。最初のタスクは、データを「属性」と「ラベル」セットに分割することである。その結果、データはトレーニングセットとテストセットに分割される。

以下のスクリプトは、データを属性とラベルに分割する。

X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values


最後に、データをトレーニングセットとテストセットに分割する。

from sklearn.model_selection import train_test_split


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)


4. フィーチャースケーリング

我々のデータセットはまだスケーリングされた値ではないことが分かっています。例えば、Average_Incomeフィールドは数千の範囲の値を持っていますが、Petrol_see_taxは数十の範囲の値を持っています。したがって、データをスケーリングすることは有益です(ただし、前述したように、このステップはランダムフォレストアルゴリズムにとってそれほど重要ではありません)。そのために、Scikit-Learn の StandardScaler クラスを使用します。そのために、以下のコードを実行します。

# Feature Scaling
from sklearn.preprocessing import StandardScaler


sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)


5. アルゴリズムの学習

データセットのスケーリングが完了したので、次はこの回帰問題を解くためのランダムフォレストアルゴリズムを学習する番です。以下のコードを実行してください。

from sklearn.ensemble import RandomForestRegressor


regressor = RandomForestRegressor(n_estimators=20, random_state=0)
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)


sklearn.ensembleライブラリのRandomForestRegressorクラスは、ランダムフォレストを用いて回帰問題を解くために使用されます。RandomForestRegressor クラスの最も重要なパラメータは n_estimators パラメータである。このパラメータはランダムフォレストに含まれる木の本数を定義する。まずは n_estimator=20 から始めて、我々のアルゴリズムがどのように動作するかを見てみましょう。RandomForestRegressor` の全てのパラメータの詳細はこちらで確認できます。

6. アルゴリズムの評価

機械学習の問題を解く最後のステップは、アルゴリズムの性能を評価することである。回帰問題では、アルゴリズムを評価するために、平均絶対誤差、平均二乗誤差、二乗平均平方根誤差が使用される。以下のコードを実行し、これらの値を求める。

from sklearn import metrics


print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))


出力は次のようになる。

Mean Absolute Error: 51.765
Mean Squared Error: 4216.16675
Root Mean Squared Error: 64.932016371


20本の木を使った場合、平均二乗誤差は64.93で、平均ガソリン消費量(576.77)の10%より大きいです。これは、推定量(木)の数が少ないことを示していると思われる。

推定量の数を 200 に変更すると,次のような結果となる。

Mean Absolute Error: 47.9825
Mean Squared Error: 3469.7007375
Root Mean Squared Error: 58.9041657058


次のグラフは,推定量に対する RMSE(Root Mean Squared Error)の値が減少している様子を示している.ここで,X 軸は推定量の数,Y 軸は二乗平均平方根誤差の値である.

推定量の増加に伴い、誤差の値が減少していることがわかる。200を超えると誤差の減少率が小さくなるので、n_estimatorsの数は200が適当である。木の本数や他のパラメータを変更することで、より良い結果を得ることができるかもしれない。

第2回:ランダムフォレストを使った分類の方法

問題定義

この課題は、ウェーブレット変換された画像の分散、歪度、エントロピー、曲率の4つの属性に基づいて、銀行券が本物かどうかを予測することである。

解決策

これは2値分類問題であり、この問題を解くためにランダムフォレスト分類器を使用します。この問題を解くためのステップは、回帰のステップと同様です。

1. ライブラリのインポート
import pandas as pd
import numpy as np


2. データセットのインポート

データセットは、以下のリンクからダウンロードすることができます。

302 Moved

データの詳細情報は、以下のリンクから入手可能です。

UCI Machine Learning Repository: banknote authentication Data Set

データセットをインポートするコードは以下のとおりです。

dataset = pd.read_csv("D:/Datasets/bill_authentication.csv")


データセットを上位から見るには、次のコマンドを実行します。

dataset.head()


| 分散|歪度|カートーシズ|エントロピー|クラス
| — | — | — | — | — | — |
| 0 | 3.62160 | 8.6661 | -2.8073 | -0.44699 | 0 |
| 1 | 4.54590 | 8.1674 | -2.4586 | -1.46210 | 0 |
| 2 | 3.86600 | -2.6383 | 1.9242 | 0.10645 | 0 |
| 3 | 3.45660 | 9.5228 | -4.0112 | -3.59440 | 0 |
| 4 | 0.32924 | -4.4552 | 4.5718 | -0.98880 | 0 |

回帰データセットと同様に、このデータセットの値はあまりうまくスケーリングされていません。このデータセットはアルゴリズムを学習する前にスケーリングされます。

3. 学習用データの準備

以下のコードでは、データを属性とラベルに分割しています。

X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values


以下のコードで、データをトレーニングセットとテストセットに分割する。

from sklearn.model_selection import train_test_split


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)


4. フィーチャースケーリング

前回と同様に、Feature Scalingも同じように動作します。

# Feature Scaling
from sklearn.preprocessing import StandardScaler


sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)


5. アルゴリズムの学習

データセットのスケーリングが完了したので、この分類問題を解決するためにランダムフォレストを学習させることができます。そのために、以下のコードを実行します。

from sklearn.ensemble import RandomForestRegressor


regressor = RandomForestRegressor(n_estimators=20, random_state=0)
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)


回帰の場合は、sklearn.ensemble ライブラリの RandomForestRegressor クラスを使用します。分類には、sklearn.ensemble ライブラリの RandomForestClassifier クラスを使用する。RandomForestClassifierクラスもn_estimatorsをパラメータとして受け取ります。前回と同様に、このパラメータはランダムフォレストの木の本数を定義します。今回も20本の木からスタートします。RandomForestClassifier の全てのパラメータに関する詳細は、こちらを参照してください。

6. 6. アルゴリズムの評価

分類問題では、アルゴリズムを評価するために、精度、混同行列、精度リコール、F1値などが用いられます。これらの値を求めるには、以下のスクリプトを実行する。

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score


print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))
print(accuracy_score(y_test, y_pred))


出力は次のようなものになる。

[[155    2]
    1  117]]
              precision   recall   f1-score   support


0       0.99     0.99       0.99       157
           1       0.98     0.99       0.99       118


avg / total       0.99     0.99       0.99       275


0.989090909091


20本の木を使ったランダムフォレスト分類器の達成した精度は98.90%です。次のグラフに示すように、以前とは異なり、この問題では推定量の数を変えても結果は大きく改善されませんでした。ここで,X軸は推定量の数,Y軸は精度を示しています.

98.90%はかなり良い精度なので、推定量を増やしてもあまり意味がないことがわかります。推定量を増やしても、精度はそれ以上向上しないことがわかります。

精度を上げるためには、RandomForestClassifierクラスの他のパラメータを弄って、今回の結果を上回れるかどうか試してみることをお勧めします。

さらに上を目指す – 手作りのEnd to Endプロジェクト

好奇心旺盛なあなたは、もっと先を目指したいと思っていませんか?そんなあなたには、ガイド付きプロジェクトがおすすめです。「ハンズオン住宅価格予測 – Pythonによる機械学習” をご覧ください。

をご覧ください。
このプロジェクトでは、Scikit-LearnとKerasのモデルから住宅価格を予測するために、従来の機械学習モデルや深層学習モデル、アンサンブル学習、メタラーを利用した強力な構築方法を学ぶことができます。
>
>
>

Tensorflowの上に構築された深層学習APIであるKerasを使って、アーキテクチャを試し、積み重ねたモデルのアンサンブルを構築し、メタラーナーのニューラルネットワーク(レベル1モデル)を訓練して、家の価格を割り出すことにします。

ディープラーニングは素晴らしいものですが、それに頼る前に、浅い学習アルゴリズムのような、より単純な技術で問題を解決することも試みることをお勧めします。ベースラインの性能は、ランダムフォレスト回帰アルゴリズムに基づくものです。さらに、Scikit-Learnを使用して、バギングや投票などの手法により、モデルのアンサンブルを作成することも検討します。

これはエンドツーエンドのプロジェクトであり、他の機械学習プロジェクトと同様に、探索的データ分析から始まり、データ前処理を経て、最後に浅い学習と深い学習のモデルを構築して、以前に探索しクリーニングしたデータに適合させることになります。

タイトルとURLをコピーしました