MachineLearning

【Pythonコードあり】回帰木(決定木)で予測する【理論面も解説】

回帰木 決定木 Pythonコード
回帰木(決定木)がよく分からない人
回帰木(決定木)がよく分からない人
機械学習について勉強しているんだけど、回帰木(決定木)がよく分からないな…。

Pythonのサンプルコード付きで分かりやすく解説している記事はないかな…。

この記事では、上記のような悩みを解決していきます。

 

この記事の想定読者

  • 機械学習を勉強している人
  • 回帰木と決定木についてよく分からない人
  • Pythonのサンプルコードが見たい人

想定している読者は、上記のとおりです。

 

この記事では「回帰木(決定木)のPythonを使った実装と理論面の解説」を紹介していきます。

決定木って、分かりやすいと言われているものの、最初はよく分からないですよね…。

 

この記事を読めば、機械学習を勉強したばかりの方でも、回帰木(決定木)の仕組みが分かるようになりますよ。

 

個人的なおすすめ

僕のおすすめは、まず実装をしてみて全体を俯瞰した後に、理論を学習していく方法です。

よって、先にPythonコードを紹介して、その後に理論を書きます。他のサイトとは順番が違うかもですが、ご容赦くださいm(_ _)m

 

githubにnotebook形式でコードを置いておきましたので、必要に応じてgit cloneしてください。

 

【Pythonコードあり】回帰木(決定木)でボストンの住宅価格を予測する

 

scikit-learnに標準で用意されている「ボストンの住宅価格」のデータに対して、回帰木を使って住宅価格の予測していきます。

 

ボストン住宅価格

ボストン 住宅価格 データフレーム

上記のようなデータ構造になっています。このデータを使って住宅価格MEDVを予測していきます。

 

回帰木の使い方① : とりあえず使ってみる

 

回帰木の実装で使うソースコードは、次のようになっています。

# 1.必要なライブラリのimport
import pandas as pd
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor # ボストンのように価格を予測する

from sklearn import datasets
from pandas import DataFrame
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import r2_score
%matplotlib inline

# 2.データセットの読み込み
boston = datasets.load_boston()
df = DataFrame(boston.data, columns = boston.feature_names)

# 3.データの分割
X = df.loc[:, ["LSTAT"]]
y = df.loc[:, "MEDV"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 4.モデルの作成&学習
model = DecisionTreeRegressor(max_depth=3)
model.fit(X_train, y_train)

# 5.学習させたモデルを使って予測する
pred = model.predict(X_test)

# 6.MSEと決定係数で回帰モデルの評価
mse = mean_absolute_error(y_test, pred)
mse

r2 = r2_score(y_test, pred)
r2

jupyter notebookに書いている内容をコピペしているので、若干見づらいかもですが、全体的な流れは上記のとおりですね。

githubにipynb(notebook形式)を置きましたので、ご活用ください。

 

今回は説明変数をLSTAT(人口あたりの地位が低い人の割合)にしていますが、デフォルトだけでも説明変数には全部で13種類使えます。

ここから新しく特徴量を作成すれば、さらにモデルの精度を向上できたりするので、そこらへんは是非チャレンジしてみてくださいm(_ _)m

 

 

回帰木の使い方② : GridSearchも実装

 

先ほどのipynb(notebook)に、下記のコードを追記すると、GridSearchまで実装可能です。

# 7. 必要なライブラリのimport
from sklearn.model_selection import GridSearchCV

# 8. 使用するモデルの作成
model2 = DecisionTreeRegressor()

# 9. GridSearchするときのパラメータ設定
 params = {
        'max_depth': list(range(1, 10)),
        'min_samples_leaf':list(range(1,10,2))
    }

# 10. GridSearchを使って回帰木を学習させる
grid_search = GridSearchCV(model2, param_grid=params, cv=5)
grid_search.fit(X_train, y_train)

# 11. GridSearchの実装で最もよかったスコア&そのときのパラメータを出力する
grid_search.best_score_
grid_search.best_params_

# 12. GridSearchで作成したモデルを使って予測する
pred = grid_search.predict(X_test)

# 13. 決定係数を使ってモデルの評価をする
r2 = r2_score(y_test, pred)
r2

上記のとおりです。

GridSearchのパラメータについては、改善の余地ありまくりなので、こちらも色々と試してみてくださいm(_ _)m

 

そもそも決定木とは?【実装→理論で確認する】

 

「そもそも決定木とは何か」ですが、単純な識別規則を組み合わせて、複雑な識別境界を得る方法です。

ざっくり言うと、簡単な条件たちを組み合わせて、複雑な仕分けをやっていく方法になります。

 

「複雑な仕分け」というのは、たとえば下記のとおりです。

  • 「昼の気温15℃、夜の気温5℃」は寒いのか?
  • 「昼の気温15℃、夜の気温5℃」の日は、何枚重ね着するか?

このような識別を、決定木では簡単な条件を組み合わせて判定していきます。

 

そして、この簡単な条件の作成方法、言い換えると決定木の作成方法には、CARTやC4.5などがあります。

 

ここからは、scikit-learnに標準で搭載されているアヤメのデータセットを使って、決定木モデルについて解説していきます。

 

こちらは後日足していきますm(_ _)m