Random Forest Regressionに関するこの記事へようこそ。
まず、回帰の意味を簡単に説明します。
機械学習における回帰とは?
回帰とは、機械学習の手法の一つで、ある範囲の値を予測するために使用されます。
例として、従業員の給与とその経験年数を考えてみましょう。
このデータに対する回帰モデルは、たとえデータセットに対応する給与がない年であっても、従業員の給与を予測するのに役立つ。
ランダムフォレスト回帰とは?
ランダムフォレスト回帰はアンサンブル学習の一種です.しかし、アンサンブル学習とは何でしょうか?
アンサンブル学習では、複数のアルゴリズムや同じアルゴリズムを複数回組み合わせて、元のモデルよりも強力なモデルを作るのです。
木に基づく予測は、多くの予測を考慮するため、より正確です。
これは平均値を用いるからです。
データセットに何らかの変更があった場合、1つのツリーには影響があっても、ツリーの森には影響がないため、これらのアルゴリズムはより安定している。
ランダムフォレスト回帰を行うための手順
これは4段階のプロセスで、私たちのステップは以下の通りです。
- 学習セットからランダムにK個のデータ点を選ぶ。
-
- これらのK個のデータ点に関連する決定木を構築します。
-
- 構築したい木の本数Nを選び、ステップ1、2を繰り返す。
-
- 新しいデータポイントについて、N本の木のそれぞれが、問題のデータポイントのYの値を予測し、新しいデータポイントに、予測されたYの値のすべての平均を割り当てる。
PythonによるRandom Forest Regressionの実装
我々の目標は、決定木のチームを構築することです。
それぞれが従属変数について予測を行い、ランダムフォレストの最終的な予測はすべての木の予測の平均となります。
この例では、予測に基づいて給与を予測するSalary – positionsデータセットを使用します。
使用したデータセットは、https://github.com/content-anu/dataset-polynomial-regression で見ることができます。
1. データセットのインポート
numpy、pandas、matplotlibの各ライブラリを用いて、モデルを実装します。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
dataset = pd.read_csv( 'Position_Salaries.csv' )
dataset.head() |
データセットのスナップショットは以下の通りです。
X = dataset.iloc[:, 1 : 2 ].values
y = dataset.iloc[:, 2 ].values
|
2. データの前処理
データの前処理はあまり行いません。
特徴量の行列とベクトル化された配列を特定するだけです。
from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 10 , random_state = 0 )
regressor.fit(X,y) |
3. ランダムフォレスト回帰のデータセットへのフィッティング
sklearnのensembleライブラリからRandomForestRegressorをインポートします。
RFRクラスのコンストラクタを使用して、リグレッサーオブジェクトを作成します。
パラメータは以下の通り。
- n_estimators : 森に含まれる木の数。(デフォルト=10)
基準(criterion) : デフォルトはmse (平均二乗誤差)。これも決定木に含まれる。
random_state
y_pred = regressor.predict([[ 6.5 ]])
y_pred |
リグレッサーのラインは以下の通りです。
#higher resolution graph X_grid = np.arange( min (X), max (X), 0.01 )
X_grid = X_grid.reshape( len (X_grid), 1 )
plt.scatter(X,y, color = 'red' ) #plotting real points
plt.plot(X_grid, regressor.predict(X_grid),color = 'blue' ) #plotting for predict points
plt.title( "Truth or Bluff(Random Forest - Smooth)" )
plt.xlabel( 'Position level' )
plt.ylabel( 'Salary' )
plt.show() |
以下のようにテスト予測を行うだけです。
from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 100 , random_state = 0 )
regressor.fit(X,y) |
#higher resolution graph X_grid = np.arange( min (X), max (X), 0.01 )
X_grid = X_grid.reshape( len (X_grid), 1 )
plt.scatter(X,y, color = 'red' )
plt.plot(X_grid, regressor.predict(X_grid),color = 'blue' )
plt.title( "Truth or Bluff(Random Forest - Smooth)" )
plt.xlabel( 'Position level' )
plt.ylabel( 'Salary' )
plt.show() |
この記事もチェック:Pythonでデータセットから別のデータセットへピボットテーブルを作成する
4. 結果の可視化
y_pred = regressor.predict([[ 6.5 ]])
y_pred |
作成されたグラフは以下の通りです。
from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 300 , random_state = 0 )
regressor.fit(X,y) |
5. 上のグラフの解釈
このグラフでは、1本の決定木よりも多くのステップを得ることができる。
区間と分割の数が多くなった。
階段の段数が増えた。
すべての予測は10票に基づいている(10本の決定木を用いている)。
ランダムフォレストは、これらの区間ごとに多くの平均を計算します。
多くの木が同じ究極の平均に収束するため、木の数が多ければ多いほど、精度は高くなる。
6. 100本の木のモデルを再構築する
#higher resolution graph X_grid = np.arange( min (X), max (X), 0.01 )
X_grid = X_grid.reshape( len (X_grid), 1 )
plt.scatter(X,y, color = 'red' ) #plotting real points
plt.plot(X_grid, regressor.predict(X_grid),color = 'blue' ) #plotting for predict points
plt.title( "Truth or Bluff(Random Forest - Smooth)" )
plt.xlabel( 'Position level' )
plt.ylabel( 'Salary' )
plt.show() |
上記の100本の木に対して形成されたリグレッサーの式は以下の通りです。
y_pred = regressor.predict([[ 6.5 ]])
y_pred |
7. 100本の樹木のグラフを作成する
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
dataset = pd.read_csv( 'Position_Salaries.csv' )
dataset.head() X = dataset.iloc[:, 1 : 2 ].values
y = dataset.iloc[:, 2 ].values
# for 10 trees from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 10 , random_state = 0 )
regressor.fit(X,y) y_pred = regressor.predict([[ 6.5 ]])
y_pred #higher resolution graph X_grid = np.arange( min (X), max (X), 0.01 )
X_grid = X_grid.reshape( len (X_grid), 1 )
plt.scatter(X,y, color = 'red' ) #plotting real points
plt.plot(X_grid, regressor.predict(X_grid),color = 'blue' ) #plotting for predict points
plt.title( "Truth or Bluff(Random Forest - Smooth)" )
plt.xlabel( 'Position level' )
plt.ylabel( 'Salary' )
plt.show() # for 100 trees from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 100 , random_state = 0 )
regressor.fit(X,y) #higher resolution graph X_grid = np.arange( min (X), max (X), 0.01 )
X_grid = X_grid.reshape( len (X_grid), 1 )
plt.scatter(X,y, color = 'red' )
plt.plot(X_grid, regressor.predict(X_grid),color = 'blue' )
plt.title( "Truth or Bluff(Random Forest - Smooth)" )
plt.xlabel( 'Position level' )
plt.ylabel( 'Salary' )
plt.show() y_pred = regressor.predict([[ 6.5 ]])
y_pred # for 300 trees from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 300 , random_state = 0 )
regressor.fit(X,y) #higher resolution graph X_grid = np.arange( min (X), max (X), 0.01 )
X_grid = X_grid.reshape( len (X_grid), 1 )
plt.scatter(X,y, color = 'red' ) #plotting real points
plt.plot(X_grid, regressor.predict(X_grid),color = 'blue' ) #plotting for predict points
plt.title( "Truth or Bluff(Random Forest - Smooth)" )
plt.xlabel( 'Position level' )
plt.ylabel( 'Salary' )
plt.show() y_pred = regressor.predict([[ 6.5 ]])
y_pred |
グラフの段数は、森の木の本数の10倍にはならない。
しかし、予測はうまくいくでしょう。
同じ変数で結果を予測してみましょう。
8. 300本の木のモデルを再構築する
上記のコードスニペットの出力は、以下のリグレッサを生成します。
9. 300本の木のグラフ
上記のコードは次のようなグラフを生成します。
では、予測をしてみましょう。
上のコードの出力は以下の通りです。
Complete Python Code for Implementing Random Forest Regression (ランダムフォレスト回帰を実装するための完全なPythonコード)
上記のコードの出力は、グラフと予測値です。
以下はそのグラフです。
まとめ
10本の木のモデルでは,経験年数6.5年の給与は167,000円と予測されました。
100本の木モデルでは158,300円、300本の木モデルでは160,333.33円と予測されました。
したがって、木の数が多ければ多いほど、より正確な結果が得られることになります。