Python

Pythonで機械学習を学ぶ 決定木

条件分岐を繰り返しクラス分けする方法。

以下の銀行のデータセットで実験します。

データは、ポルトガルの銀行機関のダイレクトマーケティングキャンペーンに関連している。

データセットは4つある。

1) bank-additional-full.csv、全例(41188)と日付順(2008年5月から2010年11月まで)の20の入力がある

2) bank-additional.csvには、1)からランダムに選択された例題の10% (4119)と20の入力が含まれています

3) bank-full.csv には、すべての例題と 17 の入力が含まれており、日付順に並べられている

4) bank-full.csv (例題の10%と17個の入力を3からランダムに選択したもの)

最小のデータセットは、より計算量の多い機械学習アルゴリズム(SVMなど)をテストするために提供されている。分類の目標は、クライアントが定期預金(変数y)を購読するかどうか(yes/no)を予測すること。

入力変数

1 – 年齢(数値)

2 – 職種 (カテゴリ別)

3 – 婚姻関係(カテゴリ別)

4 – 学歴(カテゴリ別)

5 – default: クレジットはデフォルトしているか(カテゴリ別)

6 – 住宅:住宅ローンはあるか(カテゴリ別)

7 – ローン:個人的なローンを組んだことがあるか(カテゴリ別)

8 – contact: 連絡先の通信タイプ(カテゴリ別)

9 – 月: 最後に連絡を取った年の月(カテゴリ別)

10 – day_of_week: 最後に連絡を取った曜日(カテゴリ別)

11 – duration: 最後の接触時間、秒単位(数値)

その他

12 – キャンペーン: このキャンペーン中に、このクライアントに対して実行されたコンタクト数(数値、最後のコンタクトを含む)

13 – pdays:前回のキャンペーンから最後に連絡を受けてから経過した日数(数値)

14 – 前:本キャンペーンの前に、このクライアントのために行われたコンタクト数(数値)

15 – 成果:前回のマーケティングキャンペーンの成果(カテゴリ別)

社会的・経済的属性

16 – emp.var.rate: 雇用変動率 – 四半期ごとの指標(数値)

17 – cons.price.idx: 消費者物価指数 – 月次指標(数値)

18 – cons.conf.idx: 消費者信頼感指数 – 月次指標(数値)

19 – EURIBOR3M: EURIBOR 3ヶ月レート – 日次指標(数値)

20 – 雇用者数:雇用者数 – 四半期ごとの指標(数値)

出力

21 – y – 顧客は定期預金を購読したか? (バイナリ: ‘yes’, ‘no’)

データの読み込みと確認と整理

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# 読み込み
# url = 'https://archive.ics.uci.edu/ml/datasets/Bank+Marketing'

data = pd.read_csv("./bank-full.csv",
                   header=None, skiprows=1, delimiter=";")

data.columns = ['age', 'job', 'marital', 'education', 'default', 'balance', 'housing', 'loan',
                'contact', 'day', 'month', 'duration', 'campaign', 'pdays', 'previous', 'poutcome', 'y']

# 使うものに絞る
data = data[['age', 'balance', 'housing', 'loan', 'duration',
             'campaign', 'pdays', 'previous', 'y']]

# 変換
data['housing'] = data['housing'] == 'yes'
data['loan'] = data['loan'] == 'yes'
data['y'] = data['y'] == 'yes'

# 確認
print('データ形式:{}'.format(data.shape))
print(data.head())
print(data.dtypes)

モデルの構築と評価

# 目的変数、説明変数
X = data.drop('y', axis=1)
y = data['y']

# 訓練データ、テストデータの準備
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# 学習
model = DecisionTreeClassifier(
    criterion='entropy', max_depth=5, random_state=0)
model.fit(X_train, y_train)

# 結果
print('train:{:.3f}'.format(model.score(X_train, y_train)))
print('test:{:.3f}'.format(model.score(X_test, y_test)))

結果

train:0.894
test:0.892