Pythonのサンプルコード付きで分かりやすく解説している記事はないかな…。
この記事では、上記のような悩みを解決していきます。
この記事の想定読者
- 機械学習を勉強している人
- 回帰木と決定木についてよく分からない人
- Pythonのサンプルコードが見たい人
想定している読者は、上記のとおりです。
この記事では「回帰木(決定木)のPythonを使った実装と理論面の解説」を紹介していきます。
決定木って、分かりやすいと言われているものの、最初はよく分からないですよね…。
この記事を読めば、機械学習を勉強したばかりの方でも、回帰木(決定木)の仕組みが分かるようになりますよ。
個人的なおすすめ
僕のおすすめは、まず実装をしてみて全体を俯瞰した後に、理論を学習していく方法です。
よって、先にPythonコードを紹介して、その後に理論を書きます。他のサイトとは順番が違うかもですが、ご容赦くださいm(_ _)m
※githubにnotebook形式でコードを置いておきましたので、必要に応じてgit clone
してください。
Contents
【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