Kaggleで始める機械学習入門でKaggleのアカウントを作成して、一通りの操作ができました。次はKaggle learnの以下の初級講座を使って機械学習の基礎を学習します。
この初級講座は7回のレッスンで構成されており、各回は解説パート(tutorial)と実践パート(exercise)に分かれています。実践パートでは、コンペと同様のNotebookでコードを動かす形になります。
実際にやってみた感想です。
<良かった点>
・1回1時間程度でサクッとできる
・1回あたりの内容は比較的かんたんで理解しやすい
・解説パートで学んだコードを実践パートで入力し、答え合わせできるので達成感がある
<悪かった点>
・すべて英語…
英語なのは仕方ないですね。DeepLに頼りながら読み進めました。
内容としては、まず決定木を使ってシンプルなモデルを構築します。次にその結果を評価する方法を学び、良いモデルとそうではないモデルについて学習します。最後にランダムフォレストに挑戦し、住宅価格コンペに投稿して完了です。
モデル作成 → 評価 → モデル修正 → 再評価 → ・・・
という一連の流れを体験できたのがとてもよかったです。
以下、要点のメモです。
1. How Models Work(モデルの仕組み)
今回の講座で主に取り上げる決定木に関する説明です。この回は解説パートのみで、実践パートはありません。
これは寝室が多い住宅のほうが高くなる、という決定木モデルの例です。実際のモデルではものすごい数の分岐に枝分かれします。
2. Basic Data Exploration(基本的なデータ探索)
pandasを使ってデータを取り込み、データの特徴を確認する方法を学びます。
import pandas as pd
data = pd.read_csv('path_to_data_file.csv')
data.describe()
data.head()
3. Your First Machine Learning Model(最初の機械学習モデル)
まずは最もシンプルなモデルである決定木を使い、とりあえず直感でやってみよう、という回です。
訓練データの中から、最終的に予測したい値(コンペではyと呼ばれます)と、解析で使う値(コンペではxと呼ばれ、複数の項目を含みます)を選択します。今回使うデータは住宅価格なので、yはpriceになります。配列だからでしょうか、Xは大文字になってます。
y = data.Price
X = data['col','for','predict']
scikit-learnを使ってモデルを構築し、次の流れで解析します。
- define: どのようなモデルにするか定義します
- fit: データからパターンを捉えます。これが一番重要
- predict: 予測します
- evaluate: モデルがどのくらい正確なのか評価します
この回ではpredictまでで、evaluateは次回行います。
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor(random_state=1)
model.fit(X, y)
model.predict(X.head())
4. Model Validation(モデルを検証する)
mean absolute error(平均絶対誤差、MAE)という指標を使って予測精度を検証します。
このとき注意すべきこととして、訓練データで評価してはいけません。モデルは訓練データから作っているので当然高精度になりますが、もし訓練データが偏っていたら他のデータには役に立たないモデルです。
scikit-learnのtrain_data_split関数を使って、あらかじめデータを訓練データと検証データに分けておき、検証データで評価します。
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# 訓練データでモデルを構築
model = DecisionTreeRegressor()
model.fit(train_X, train_y)
# 検証データで予測と評価
pred = model.predict(val_X)
mean_absolute_error(val_y, pred)
訓練データでMAEを評価すると(やってはいけないやつです)、434.7というとても小さな誤差になります。一方、検証データで評価すると265806.9でした。ぜんぜん違いますね。265806.9がこのモデルの実力、ということになります。
5. Underfitting and Overfitting(アンダーフィッティングとオーバーフィッティング)
決定木の重要なパラメータとしてツリーの深さがあります。
ツリーが深すぎると1つの葉に含まれる要素が少なくなり精度が落ちます。これをオーバーフィッティングと言います。逆にツリーが浅すぎると1つの葉に含まれる要素が多すぎて外れる可能性が高まります。これをアンダーフィッティングと言います。オーバーフィッティングとアンダーフィッティングの間にあるスイートスポットを見つけましょう。
ツリーの深さは、モデル構築時にmax_leaf_nodesパラメータとして制御できます。いくつかの深さに対して、forループでMAEスコアを比較します。
from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor
# MAEを求める関数
def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
model.fit(train_X, train_y)
pred = model.predict(val_X)
mae = mean_absolute_error(val_y, pred)
return(mae)
# いくつかのツリー深さに対して評価
for max_leaf_nodes in [5, 50, 500, 5000]:
my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
print("Max leaf nodes: %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
Max leaf nodes: 5 Mean Absolute Error: 347380
Max leaf nodes: 50 Mean Absolute Error: 258171
Max leaf nodes: 500 Mean Absolute Error: 243495
Max leaf nodes: 5000 Mean Absolute Error: 254983
となったので、ツリー深さは500がよさそうです。
6. Random Forests(ランダムフォレスト)
次に、もっと洗練されたモデルであるランダムフォレストを学びます。決定木では1つのツリーを構築しますが、ランダムフォレストでは複数のツリーを使い、それらを平均化します。決定木ではツリーの深さをチューニングしましたが、一般にランダムフォレストでチューニング不要です。
ランダムフォレストを実行するコードはとてもかんたんです。
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
model = RandomForestRegressor(random_state=1)
model.fit(train_X, train_y)
pred = model.predict(val_X)
print(mean_absolute_error(val_y, pred))
MAE 191669.7という今までより高いスコアが出ました。
7. Machine Learning Competitions(機械学習コンペ)
最後は住宅価格という練習用のコンペに参加してみよう、という内容です。
といっても、今まで学んだ内容の復習だけですので、特に身構える必要はありません。
ここまで学習すると修了証明書がもらえます。ちょっとうれしいですね。
まとめ
以上で機械学習モデルを構築して評価する、そしてモデルを修正して再度評価する、という基本的なフローを学習しました。実際にコードを作って動かしているので納得感がありますね。
さらにモデルを改良する方法やもっと高度なモデルについては中級編で学習します。お疲れ様でした。