条件分岐を繰り返しクラス分けする方法。
以下の銀行のデータセットで実験します。
データは、ポルトガルの銀行機関のダイレクトマーケティングキャンペーンに関連している。
データセットは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