【機械学習入門第6回】ランダムフォレストをpythonで実装する

機械学習の基礎を学ぶための「機械学習入門」。以下のページを参考にして、日本語解説を加えました。ソースコードは以下にあります。

Random Forests
Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

前回の学習不足と過学習で学んだように、決定木において、葉がたくさんある深い木は各予測がその葉にある少ないデータから得られているため過剰適合します。一方で、葉が少ない浅い木は、初めて出会うデータに対して分類できないことが多く、パフォーマンスが低下します。

今日の最も洗練されたモデリング技術でさえ、過適合と過適合の間の”スイートスポット”を見つけ出すのに苦労します。しかし、多くのモデルにはパフォーマンスの向上につながる巧妙なアイデアがあります。 例としてランダムフォレストを見てみましょう。

ランダムフォレスト

ランダムフォレストは多くのツリーを使用し、各ツリーの予測を平均して予測を行います。 通常、単一の決定木よりもはるかに優れた予測精度が得られます。デフォルトのパラメーターでうまく機能することも多いです。(モデリングを工夫すればさらに優れたパフォーマンスのモデルを得られますが、適切なパラメーターを見つけ出すことに苦労します)

ランダムフォレストのコーディング

これまで、決定木で分類するためのデータを整理するためのコードを書いてきました。今回もこれを利用します。データセットはこちらからダウンロードできます。

https://www.kaggle.com/dansbecker/melbourne-housing-snapshot

import pandas as pd

melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 

melbourne_data = melbourne_data.dropna(axis=0)

y = melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 
                        'YearBuilt', 'Lattitude', 'Longtitude']
X = melbourne_data[melbourne_features]

from sklearn.model_selection import train_test_split

train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)

scikit-learnで決定木を構築したのと同様に、ランダムフォレストモデルを構築します。今回は、DecisionTreeRegressorの代わりにRandomForestRegressorクラスを使用します。

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

forest_model = RandomForestRegressor(random_state=1)
forest_model.fit(train_X, train_y)
melb_preds = forest_model.predict(val_X)
print(mean_absolute_error(val_y, melb_preds))
191669.7536453626

誤差(MAE)が191,669でした。これは、前回までに検討した決定木で得られた予測誤差243,495を大幅に下回っており、決定木よりランダムフォレストの方が高い精度が得られることがわかります。

より精度を向上させるために

このランダムフォレストのモデルにいは、さらなる改善の余地がある可能性があります。 単一の決定木の最大深度を変更したのと同じように、ランダムフォレストのパフォーマンスを変更できるパラメーターがあります。 しかし、ランダムフォレストモデルの最も優れた機能の1つは、この調整を行わなくても、一般的に適切に機能することです。

以上で、機械学習の基礎は終了です。

このまま、より精度を向上させるためにパラメータを調子てもよいでしょうし、実務にランダムフォレストを活用してみるのもよいと思います。Let’s do it !!

コメント

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