【sklearn】DecisionTreeRegressorの使い方が分かる【Kaggle Course – Intro to Machine Learning 1-3】データの解釈と決定木を使った機械学習モデルの構築

Kaggle

アメリカのデータ分析コンペKaggleでは、世界中の優秀なデータサイエンティストによって作成された様々なeラーニング教材が無料で公開されています。

その中でも、この記事では以下の講座について解説します。

ただ、全編英語ですし、ところどころ説明を省略しているところもあるので、私なりにかみ砕いて解説していきます。

この記事で取り扱うクラスは以下の通りです。

sklearn.tree.DecisionTreeRegressor

How Models Work(モデルの動かし方)

Introduction(イントロダクション)

まずは、機械学習のモデルがどのように機能し、どのように使用されるのか、その概要を説明します。ここで使用するのは最もシンプルなモデルの1つである決定木です。

例として、不動産価格を決定木で予測してみる場合を考えてみましょう。

わかりやすくするために、最もシンプルな決定木から始めます。下図の決定木では、ベッドルームの数によって枝が2つに分岐し、家の価格を予想しています。

ここで、家の予測価格は、決定木を作るときに使ったデータのうち、同じカテゴリーに分類される家の平均価格となっています。

つまり、使用したデータでベッドルームが1つしかない家の平均価格は$178,000、2つ以上ある家は$188,000となっていることから、上記のモデルが作られたのです。シンプルな決定木ではありますが、あながち的外れではないということが分かるかと思います。

ここで、この決定木を作るために使ったデータを「トレーニング(訓練)データ」と呼びます。

Improving the Decision Tree(決定木を改良する)

実際のトレーニング(訓練)データには、ベッドルームの数だけでなく、土地の広さ、立地条件など多くの要素が入っていますので、作成する決定木は上記のものより、もっと深くなります。

Basic Data Exploration(基本的なデータ探索)

Using Pandas to Get Familiar With Your Data(Pandasを使ってデータの扱いに慣れよう)

データを操作するのに便利なPandasの使い方を勉強します。

Pandasライブラリの最も重要な部分は、DataFrameです。DataFrameはテーブルとして考えられるタイプのデータを保持します。ExcelやSQLデータベースのテーブルに似たものです。

まずはPandasのライブラリをインポートしましょう。

import pandas as pd

次に、csvファイルからデータを読み込み、データの統計情報を出力します。

# save filepath to variable for easier access
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
# read the data and store data in DataFrame titled melbourne_data
melbourne_data = pd.read_csv(melbourne_file_path) 
# print a summary of the data in Melbourne data
melbourne_data.describe()

Interpreting Data Description(データを解釈する)

describeで読みだしたデータの意味は以下の通りです。

カラム 意味
count データの個数
mean 平均値
std 標準偏差(データの広がり度合い)
min 最小値
25% 下から25%番目の値
50% 下から50%番目の値(中央値)
75% 下から75%番目の値
max 最大値

countが他の列に比べて少ないと、その列には欠損値があるということが分かります。

Your Turn(練習問題)

最後に、Kaggle notebook上で実際のコードを使った練習問題を解いてみましょう。

Your First Machine Learning Model(初めての機械学習モデル)

Selecting Data for Modeling(モデル構築のためのデータを選ぶ)

 

先ほどは決定木のモデル構築のために「ベッドルームの数が2個以上あるかどうか(Bedroom2)」というデータだけを選びました。

新しくどのデータを選ぶかを考える前に、DataFrameのcolumnsプロパティ(下記コードの4行目)を使用して、データセット内のすべての列のリストを見てみます。

import pandas as pd
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
melbourne_data.columns
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',
       'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',
       'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',
       'Longtitude', 'Regionname', 'Propertycount'],
      dtype='object')

データを選ぶには2つのアプローチがあります。

  • ドット記法: 予測対象(y)を選ぶ
  • カラムリストからの選択: 特徴量(X)を選ぶ

Selecting The Prediction Target(予測対象を選ぶ)

まず、機械学習で何を予測するかを決めます。

ドット記法(”.”ドットを使ってプロパティにアクセスする)を使って、予測対象(y)を選択します。

下記のコードで、メルボルン(melbourne_data)の住宅価格(Price)をに格納します。

y = melbourne_data.Price

Choosing “Features”(特徴量を選ぶ)

次に、モデルで予測に使用する列(特徴量)を選びます。

今回の例では、住宅価格Priceを決定するために使用する列を選びます。すべての列を特徴量として使用することもできますが、あえて特徴量を少なくした方が良い場合もあります

複数の特徴量を選択するには、下記のように角括弧 [] の中に引用符 ” 付きで列名を指定します。

melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']

次に、選択した特徴量をXに格納します。

X = melbourne_data[melbourne_features]

describeで統計情報を出力してみましょう。

X.describe()

すべて数値データですね。また、データの欠落はなさそうです。

次にheadメソッドで、データの上位5行を確認してます。

X.head()

Building Your Model(モデルを構築する)

次に、scikit-learnというライブラリを使って、機械学習モデルを構築していきます。

下記はモデル構築の流れです。

1.定義 どの機械学習モデルを使うのかを決め、パラメータを指定する
2.学習 与えられたデータからパターンを学習する
3.予測 学習済みのモデルを使って未知のデータを予測します
4.評価 モデルの予測がどの程度正確かを評価します。

以下のコードでは、このうち1、2を表現しています。scikit-learnで決定木モデルDecisionTreeRegressorを定義し、特徴量Xと予測対象yを指定して学習しています。

from sklearn.tree import DecisionTreeRegressor

# Define model. Specify a number for random_state to ensure same results each run
melbourne_model = DecisionTreeRegressor(random_state=1)

# Fit model
melbourne_model.fit(X, y)

ようやく決定木のモデルの完成です!ちなみに、random_stateに整数の値を指定すると毎回の実行結果が同じになるため、モデルに再現性が生まれるので、オススメです。

いよいよ、このモデルを使って住宅価格を予測(モデル構築の3番目)してみましょう。実際は、すでに住宅価格が分かっている住宅(訓練データ)ではなく、未知の住宅(テストデータ)に対して予測を行いますが、今回は訓練データを使って予測を行います。

print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))
Making predictions for the following 5 houses:
   Rooms  Bathroom  Landsize  Lattitude  Longtitude
1      2       1.0     156.0   -37.8079    144.9934
2      3       2.0     134.0   -37.8093    144.9944
4      4       1.0     120.0   -37.8072    144.9941
6      3       2.0     245.0   -37.8024    144.9993
7      2       1.0     256.0   -37.8060    144.9954
The predictions are
[1035000. 1465000. 1600000. 1876000. 1636000.]

決定木を使った予測結果が出ましたね。

Your Turn(練習問題)

最後にKaggle notebook上で実際のコードを使った練習問題があるので、知識の定着のためにもトライしてみてください。

今回は決定木を使った機械学習モデルの構築について学びました。機械学習の流れの基礎が抑えられる、いい講座だったと思います。次回はモデルの評価や、オーバーフィット、アンダーフィットについて学んでいきます。

以上、最後までお読みいただきありがとうございました。

コメント

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