🤖

Pythonで決定木による機械学習を行う

2022/05/14に公開

基本的な決定木である、DecisionTreeRegressorと、複数の決定木を用いて各構成木の予測を平均化することで予測を行う、RandomForestRegressorの使い方を紹介します。

筆者はPythonも機械学習も圧倒的初心者ですが、自分なりの理解をメモがてら記事にしてみました。優しいマサカリお待ちしています。

DecisionTreeRegressor

必要モジュールのimportをします。
pandasと、平均絶対誤差の算出に使うmean_absolute_error、データの分割に使うtrain_test_split、決定木モデルのDecisionTreeRegressorです。

import pandas as pd
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor

訓練用データをCSVから読み込み、解析に使うカラムと予測対象のカラムを設定します。

# 訓練データ読み込み
file_path = '../input/data.csv'
data = pd.read_csv(file_path)

# 解析に使うカラムを設定する
features = ['Rooms', 'Bathroom', 'Landsize']
X = data[features]

# 予測対象カラムを設定する
y = data.SalePrice

データを訓練用と検証用に分けます。
訓練と検証で同じデータを使ってしまうと精度が100%になってしまうはず。

# データを訓練用と検証用に分ける
train_X, val_X, train_y, val_y = train_test_split(X, y)

モデルを作成し、訓練用のtrain_Xtrain_yを使って学習させます。

# モデル作成
model = DecisionTreeRegressor()

# モデル学習
model.fit(train_X, train_y)

決定木の"葉"の枚数を指定してモデルを作成することもできます。
"葉"の枚数によって予測の精度が変わるため、一番誤差が少ない枚数を指定すると良さそうです。

# モデル作成
model = DecisionTreeRegressor(max_leaf_nodes=500)

# モデル学習
model.fit(train_X, train_y)

モデルを使って予測を実行させ、実際のデータと比較してモデルの精度を算出します。

# 学習したモデルに検証用データを渡して予測する
val_predictions = model.predict(val_X)

# 予測したデータと実際のデータを渡して平均絶対誤差を評価する
val_mae = mean_absolute_error(val_predictions, val_y)
print("MAE: {:,.0f}".format(val_mae))

RandomForestRegressor

RandomForestRegressorをimportします。

from sklearn.tree import RandomForestRegressor

モデルを使って予測を実行させ、実際のデータと比較してモデルの精度を算出します。

# モデル作成
model = RandomForestRegressor()

# モデル学習
model.fit(train_X, train_y)

モデルを使って予測を実行させ、実際のデータと比較してモデルの精度を算出します。

# 学習したモデルに検証用データを渡して予測する
val_predictions = model.predict(val_X)

# 予測したデータと実際のデータを渡して平均絶対誤差を評価する
val_mae = mean_absolute_error(val_predictions, val_y)
print("MAE: {:,.0f}".format(val_mae))

RandomForestRegressorDecisionTreeRegressorと異なり、max_leaf_nodes等のパラメータを指定せずとも、デフォルトのパラメータでうまく機能するようです。とはいっても、更に精度を求める場合はここらへんもチューニングする必要が出てくるのでしょうか。

パラメータの種類や詳細はまだ勉強していないので、もっと勉強してみたいと思います。

Discussion