はじめに
最近は、AutoMLと言われるプログラミングをしないで、簡易に機械学習を実現できるサービスも増えてきました。
ただ、機械学習のプログラミングを全く知らずに、AutoMLだけで機械学習を知った気になるのは、自動運転の車でドライビングテクニックを語るようなもの(違うか)。
そこで、基本的な機械学習の手順を整理しておきたいと思います。(とはいえ、scikit-learnをそのまま使いますが。。。
例として、小売で実施しているキャンペーンの反応有無を、商品の購入金額から予測するモデルをつくりましょう。
分析環境
Google Colaboratory
対象とするデータ
resultをキャンペーンの反応有無、product1~を商品の購入金額として作成します。
id | result | product1 | product2 | product3 | product4 | product5 |
---|---|---|---|---|---|---|
001 | 1 | 2500 | 1200 | 1890 | 530 | null |
002 | 0 | 750 | 3300 | null | 1250 | 2000 |
1.データ準備
元データは普段から、BigQueryに入っているのですが、それを手元にもってきて、データフレーム(df)に入れたところから、データの準備をスタートします。
1-1.欠損値補完
外れ値等は事前に除外していますが、id別の商品購入金額出すと必ず欠損が出る(その商品を買っていない)ため、欠損値を補完する必要があります。この様なケースだと、その商品を買っていないため、ゼロで補完が最適ですが、それ以外に平均値や中央値で補完するケースもあります。
#ゼロで補完
df.fillna(0, inplace=True)
#平均値で補完
df.fillna(df.mean(), inplace=True)
#中央値で補完
df.fillna(df.median(), inplace=True)
#レコードを削除
df.dropna(inplace=True)
1-2.特徴量選択
特徴量の選択は、モデルの学習時間短縮や精度向上に必須なのでぜひ実施しましょう。
個人的には、AutoMLはそのためだけでも実施する価値があるのではないかと思っています。
特徴量の選択方法は、Filter Method, Wrapper Method, Embedded Methodの3種類があります。
それぞれの詳しい解説は、こちらが分かりやすかったです。
今回は、モデル学習をしながら変数を選択するEmbedded Methodを用います。
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
# 目的変数
label_col = "result"
# 説明変数(特徴量)
feature_cols = ["product1","product2","product3","product4","product5"]
# numpy配列に変更
label = np.array(df.loc[0:, label_col])
features = np.array(df.loc[0:, feature_cols])
# 変数選択
## ここでは分類を想定して、ランダムフォレスト(RandomForestClassifier)を用いる
clf = RandomForestClassifier(max_depth=7)
## Embedded Methodを用いて変数を選択
feat_selector = SelectFromModel(clf)
feat_selector.fit(features, label)
df_feat_selected = df.loc[0:, feature_cols].loc[0:, feat_selector.get_support()]
1-3.学習データ・検証データ分割
データ準備の最後として、データを学習用と検証用に分けます。
from sklearn.model_selection import train_test_split
# 目的変数と説明変数を分割
state = np.random.RandomState(1)
train_features, test_features, train_label, test_label = train_test_split(features, label, random_state=state)
2.データ分析
さて、データの準備ができたので、購買傾向からResultを予測するモデルを作成しましょう。
分類器は、シンプルながら高い精度が期待できる、ランダムフォレストを用います。
精度向上を図るために、Grid SearchとCross Validationを実施しましょう。
from sklearn.model_selection import GridSearchCV
# 分類器
estimator = RandomForestClassifier()
# パラメーター
param = {
'n_estimators': [5, 10, 50, 100, 300],
'max_features': [10, 20],
'min_samples_split': [3, 5, 10, 20],
'max_depth': [5, 10, 20]
}
# 分析実行
clf = GridSearchCV(
estimator,
param_grid=param,
cv=5
)
clf = clf.fit(train_features, train_label)
3.モデル評価
できたモデルを評価します。単純に、沢山の人のresultを当てられたという正確性(Accuracy)だけではなく、resultが「1」になると予測した人のうちどこまでが正解だったのかという適合率(Precision)や、実際にresultが「1」だった人をどこまで補足できたかという再現率(Recall)も見ていきます。
それぞれの指標の意味については、こちらが詳しかったです。
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
accuracy=accuracy_score(test_label, clf.predict(test_features))
precision=precision_score(test_label, clf.predict(test_features))
recall=recall_score(test_label, clf.predict(test_features))
print("Accuracy : ", accuracy*100, "%")
print("Precision : ", precision*100, "%")
print("Recall : ", recall*100, "%")
これらの結果として、各精度が狙ったレベルを超えれば、ひとまずOKというところでしょう。
おわりに
自分の頭の整理も兼ねて、超基本的な機械学習の手順(というか、scikit-learnの手順)をまとめてみました。
今後、他の手順も整理していくとともに、新たなテクノロジー・サービスも使っていきたいと思います。