【第10回・最終回】python100本ノック をやってみた(ノック46-50)

Python 機械学習

今回は第10回、ノック46〜ノック50までをやっていきたいと思います。
「Python実戦データ分析100本ノック」は、pandas の使い方やデータサイエンスを実戦的に学べる書籍なのでぜひ手に取ってみてください。

Python実践データ分析100本ノック  レビューでも実用的と高評価ですね。

今回の目的は、決定木という方法を用いて退会予測モデルを作る事です。

ノック46:文字列型の変数を処理できるように整形しよう

文字列のままでは、機械学習モデルに入れられないため、男=1,女=0 というようにダミー変数化します。

 

target_col = ["campaign_name", "class_name", "gender", 
"count_1", "routine_flg", "period", "is_deleted"]

predict_data = predict_data[target_col]<
predict_data.head()

get_dummies 関数で一括でダミー変数化します

predict_data = pd.get_dummies(predict_data)
predict_data.head()

del predict_data["campaign_name_通常"]
del predict_data["class_name_ナイト"]
del predict_data["gender_M"]
predict_data.head()

2者択一のものは男、女でそれぞれダミー変数化しなくても良いので、

それぞれのものは消しておきましょう

ノック47:決定木を用いて退会予測モデルを作成してみよう

いよいよ決定木モデルを作成しましょう。

from sklearn.tree import DecisionTreeClassifier を使用します。

exit と conti の数を合わせて比率を50:50にします。

その後、データを結合して isdeleted をy として、その予測モデルを作成します。

from sklearn.tree import DecisionTreeClassifier
import sklearn.model_selection
exit = predict_data.loc[predict_data["is_deleted"]==1]
conti = predict_data.loc[predict_data["is_deleted"]==0].sample(len(exit))
X = pd.concat([exit, conti], ignore_index=True)
y = X["is_deleted"]
del X["is_deleted"]
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X,y)
model = DecisionTreeClassifier(random_state=0)
model.fit(X_train, y_train)
y_test_pred = model.predict(X_test)
print(y_test_pred)

実際の正解との比較を行うためのデータフレームを作成しましょう

results_test = pd.DataFrame({"y_test":y_test ,"y_pred":y_test_pred })
results_test.head()

ノック48:予測モデルの評価を行ない、モデルのチューニングをしてみよう

y_pred と y_test を比較して、正解率を算出しましょう。

correct = len(results_test.loc[results_test["y_test"]==results_test["y_pred"]])
data_count = len(results_test)
score_test = correct / data_count
print(score_test)

正解率は0.87なので87% が正解率ということになります。

print(model.score(X_test, y_test))
print(model.score(X_train, y_train))

正解率の評価は、model.score 一発で出ます。

今回は test データに対し train データの方が正解率が高いため、

過学習がおきている事がわかります。

次は、モデルパラメータをいじってモデルを簡易化しましょう。

X = pd.concat([exit, conti], ignore_index=True)
y = X["is_deleted"]
del X["is_deleted"]
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X,y)
model = DecisionTreeClassifier(random_state=0, max_depth=5)
model.fit(X_train, y_train)
print(model.score(X_test, y_test))
print(model.score(X_train, y_train))

max_depth=5 にする事で、学習を5段階でやめているようなイメージです。

すると、正解率が 92% に上昇しています。

ノック49:モデルに寄与している変数を確認しよう

model.feature_importances で退会するかどうか判定するのに重要な因数をチェックできます。今回の場合は、count_1 つまり1ヶ月前の利用回数が最も重要であるという事ですね。

importance = pd.DataFrame({"feature_names":X.columns, "coefficient":model.feature_importances_})
importance

ノック50:顧客の退会を予測しよう

いよいよ仕上げです。ノック40でやったように、モデル人物を作ってみましょう。

count_1 = 3
routing_flg = 1
period = 10
campaign_name = "入会費無料"
class_name = "オールタイム"
gender = "M"

次にデータ加工を行いましょう。

if campaign_name == "入会費半額":
campaign_name_list = [1, 0]
elif campaign_name == "入会費無料":
campaign_name_list = [0, 1]
elif campaign_name == "通常":
campaign_name_list = [0, 0]
if class_name == "オールタイム":
class_name_list = [1, 0]
elif campaign_name == "デイタイム":
campaign_name_list = [0, 1]
elif campaign_name == "ナイト":
campaign_name_list = [0, 0]
if gender == "F":
gender_list = [1]<
elif gender == "M":
gender_list = [0]
input_data = [count_1, routing_flg, period]
input_data.extend(campaign_name_list)
input_data.extend(class_name_list)
input_data.extend(gender_list)

最後に予想してみましょう。predict で退会予測をします。

print(model.predict([input_data]))
print(model.predict_proba([input_data]))

このモデルだと、98%の割合で退会しているという結果が出ました。

お疲れ様でした。これで5章の機械学習モデル作成部分は終了です。生データを加工して、学習モデルを当てはめるという流れを学習できたのはかなり貴重だったと思います。
Python実戦データ分析100本ノックの学習メモは今回で最終回です。
一度では理解できなかったことも多かったので、また復習してみたいと思います。

目次に戻る方はこちらまで。