決定木モデルを使った機械学習とデータマイニングプロセスを体験しよう!

投稿者:

今回の記事では、決定木モデルを使って過去データから機械学習し、未知のデータに対する予測をおこないます。機械学習によるデータマイニングに必要なプロセスの中で、Tableauプロダクトを使った見える化を加えていくと、どんな風にプロセスが変わっていくのかポイントを紹介していきます。

今回は以下のステップで進めていきます。


① データの収集

② データの理解

③ 予測モデルの作成と評価

④ 予測の実施と精度の評価

⑤ モデルの再作成と再評価


 

では早速データマイニングのプロセスを一緒に見ていきましょう!

① データの収集

今回は機械学習のサンプルデータとしてよく用いられる、銀行の顧客マーケティング(テレマーケティング)データを以下のサイトからダウンロードします。分析の準備としてどのようなフィールドが存在するのか、得られる情報はできる限り前もって入手しましょう。

Bank Marketing (with social/economic context) (UCI Machine Learning Repository)

こちらのデータには2008年 から2013年の間のポルトガルの銀行顧客の行動履歴、経済指標と、その顧客が実際に定期預金を申し込んだかどうかの情報が記録されています。

出典:A data-driven approach to predict the success of bank telemarketing

ファイルについてはの説明は以下のようにあります。”bank-additional-full.csv ”の方を訓練データとして利用してみたいと思います。

1) bank-additional-full.csv with all examples (41188) and 20 inputs, ordered by date (from May 2008 to November 2010)

2) bank-additional.csv with 10% of the examples (4119), (上記から 10%のサンプルを取ったもの)

それぞれのフィールドの説明は以下のようになります。

※ 16. employ variation rate の説明

※ 19. 欧州銀行間取引金利

 

② データの理解

まずはTableau Prepから接続し、ざっくりとしたデータ内容を確認してみましょう。

Tableau Prepを使うと、データの分布や、NULL値の有無を確認することができます。接続してからステップを追加すると、すぐにこの分布が見れるので、例えばこのデータは年齢は30歳から35歳のデータが多いということや、職業は ”admin” 、”blue -collar”、”technician”が多いことなどが分かります。”married”(既婚者)は”single”(独身者)よりパッと見て2倍ほど多いですね。(灰色のバーが分布の多さを示します。)

この時点で、ミススペルのあるものは修正、表記の揺れがあるものは一つにグルーピングしたり、NULL値が多いフィールドは削除したり、何らかの方法で補完したり、例えばレコードに含まれるデータがIDだけで意味が分からないものについては、マスター表と結合し、意味のあるデータにする等のデータ準備を行います。今回のデータでは、特にデータ準備の必要はなさそうです。 因みに、month とday_of_week は入っていますが、yearもdayもないので、このデータから時系列的な分析はできなそうです。(残念ながら)

では、Tableau Desktopから接続して、もう少しデータの中身を詳しく見ていきましょう。

一番大切な目的変数(予測する対象)であるテレマーケティングによって定額預金を契約したか否か(今回は決定木モデルを使ってこれを予測するのですが)について見てみると、実際に定額預金の申し込みをした(yes)のは 11.27% であることが分かります。定額預金の申し込みまでこぎつけるのはそんなに簡単なことではないようですね。 Tableauの表計算を使ってパーセント比率で表示し、目的変数”y”で色分けすると簡単に比率が確認できます。

次はカテゴリごとにどのような傾向があるか確認してみましょう。行に”housing”(持ち家の有無) をドラッグすると持ち家の有無ごとに契約成立の確率が確認できます。持ち家の有無は特に申し込みに関係がなさそうです。

では次に、”duration” (最終接触時間(秒))と申し込みの有無の関係を見てみましょう。ここで、最終接触時間(秒)は連続値でありカテゴリカルな値ではないので、上のような棒グラフで確認ができません。こういった場合、Tableau では“ビン”を作成して、連続値を一定の区間に区切り、カテゴリカルな区分に変えることができます。ビンを作成すると、連続値(メジャー)だった”duration”について、ディメンジョンとして”duration(bin)”が作られます。ビンのサイズ(区切りのサイズ)も簡単に変更することができます。ここでは100秒ごとのビンを作ります。

さっそく”duration(bin)”を行にドラックすると。明らかにduration”が短い(例えば300秒以下)では申し込みが少ない(オレンジ色が少ない)傾向が明らかに分かりますね。これはコールセンターで顧客との会話時間が短い場合は申し込みが少ない、つまり真剣に話を聞いてもらえない場合は申し込みにも繋がらないということがこの時点で推測できます。逆に600秒(10分)以上話を聞いてもらえる場合は申し込みに繋がる割合が高そうです。

メジャー(連続値)同士の相関関係を確認するには散布図を書いてみると良いでしょう。同じメジャーを行と列にドラッグして散布図を書いてみます。オレンジ色の点は実際に申し込みのあったもの、青色はなかったものです。ここから、申し込み(オレンジ色)の分布が高いところはどこか?メジャー同士に相関関係があるのか、面白い傾向がある組み合わせを探します。

duration との関係に焦点を当てて可視化をしてみます。やはり、durationが長いと申し込みが多い(Y軸上部にオレンジ色が分布している)ということが分かります。

更に duration と campaign (現キャンペーンにおける接触回数)に焦点を当てると、接触回数は短いかつ接触時間が長いところで申し込みがある(グラフ中央左にオレンジ色が分布している)ことや、接触回数が多いと接触時間も短くなくなる(グラフ右側は縦軸の値が低い)ようです。これは、何回もコンタクトを取っていると、むしろしつこいと思われて話を聞いてもらえないということなのでしょうか・・・何回もアタックすれば良いというものではなさそうです。

このように、データをあらかじめ理解しておくことで、予測モデルを作成した時に、本当に納得いくモデルになっているのかを判断する際に必要な前提知識を準備しておくことができます。

 

③ 予測モデルの作成と評価

それでは、早速予測モデルを作成してましょう。今回は決定木モデルをPythonのscikit-learnに含まれるDecisionTreeClassifierを利用します。決定木モデルの説明については、ここでは割愛しますが、Udemy講座:【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門(株式会社SIGNATE)で勉強させていただきました。(この講座がPython を使って予測するということについて基礎から紹介されていて本当に分かりやすかったです、ありがとうございます!)

先ほどの訓練データを学習して、モデルを作成します。ここからはJupyter Notebookを利用します。実行したコマンドの詳細は添付のJupyter Notebook(.ipynb) ファイルを参照ください

必要なライブラリを読み込み、訓練データを読み込みます。

目的変数と説明変数をそれぞれ抜き出します

カテゴリカルなデータはそのままではモデル作成に利用できないのでダミー変数化(カテゴリごとに1または0の値を持つフィールドに分割)をし、決定木モデルを作成します。ここでは、ハイパーパラメータの調整で ” max_depth =3 ” (木構造の深さ – モデルの複雑度) を指定します。

Graphviz というツールを使って、作成された決定木モデルを可視化します。

読み方としては、青色の濃い部分は目的変数である、定額預金の申し込みが有(yes) が多い分類、逆にオレンジ色は少ないということになります。青色が濃いところに注目すると、duration <=172.5 ではない(つまり duration > 172.5) かつ pdays <= 16.5 の区分の青色が濃いです。つまり、duration > 172.5 かつ pdays <= 16.5  である場合に、申し込みが有る可能性が高いということになります。前回キャンペーンのコンタクトから16.5日以内にで、コンタクト時間が172.5秒以上の場合申し込みをする可能性が高いという事ですね。

duration と pdays の分布と申し込み有の確率の分布をTableau を使って可視化をしてみます。duration, pdays の両方にビンを作成しクロス表にします。その区分での申し込み=yだった割合を色にします。青が濃いところは申し込み=y の比率が多いところということになります。どうでしょうか?確かにクロス表の右上(duration > 172.5 かつ pdays <= 16.5 )の領域でいろが濃い区分が集中しているように見えますね。このように、作成されたモデルに納得感があるかどうかを確認するためにも一度可視化してみるというのはアリかもしれません。

④ 予測の実施と評価

次に、テストデータに対して実際に予測をしてみます。③で訓練データから学習したモデルを実際にテストデータに対して利用し、申し込み=yes となる確率を計算します。ここでは既に訓練データからランダムに10%のサンプルを取ったファイルが用意されていましたので、これをテストデータとして利用します。テストデータは実は訓練データの一部なのですから、実際に申し込みがどうだったのかのフィールドも含まれています。つまり、決定木モデルで計算された予測値と実際の値がどうだったかを比較し、予測が当たっていたかどうかを確認することができるのです。

テストデータを確認します。もちろんデータ構造は訓練データと同じです。

同様にダミー変数化をし、先ほど作成したモデルを利用して予測値を計算します。予測値は0から1の間の確率として計算されます。1に近ければ申し込み=yとなる確率が高いということになります。予測値と実際の結果をTableau で比較するためにテストデータのファイルに得られた予測値をフィールドとしてくっつけ、ファイルに出力します。

これだけでは、どれだけ予測が当たっているのかわかりませんね。Tableau を使って予測がどれだけ当たっていたか直感的な可視化をしてみましょう。縦軸(行)に実際の申し込み (no  / yes )を表示し、横軸(列)に予測 ( no / yes )を表示するクロス表を作成します。予測値は実際には0から1の連続値ですから、0.5以上をyes、0.5未満をnoで切ることにします。左上は実際がno、 予測もnoで「正解」、右下は実際がyes、予測もyes で「正解」です。それ以外は予測と実際が異なるので「不正解」となります。

正解率(Correct Rate) =(正解の個数)/ (正解+不正解の個数)として計算すると、max_depth = 3 のモデルでは正解率が 91.28 % となりました。

下の図では一つ一つの粒が顧客レコードに対応し、予測と実際の分類によって表示される場所が異なります。色については申し込む予測確率を表し、青に近ければ申し込み=yの確率が低い、オレンジが濃ければ申し込み=yの確率が高いことを意味します。

右上は予測がyes だたけれども、実際はno だった不正解のカテゴリですが、予測の色は薄いので、予測値としても中間の微妙な値(0.5に近い)だったことが分かります。

もう一つ予測結果を評価するTableau の可視化の方法を紹介します。箱ひげ図と密度(Version 2018.3)を利用する方法です。横軸に実際の申し込み (no / yes )を表示します。縦軸に予測値を配置し分布を箱ひげ図で表します。このままでは分布の数が分からないので、表示方法を密度として分布が高い場所を赤色に、低い場所を緑色とするグラデーションを用います。この図からは、申し込み=no で申し込み予測も0に近い点が密集しているということ、実際の申し込み=yes だった顧客に対する予測値は0 ~0.8 の間に分散しているということが分かります。

⑤ モデルの再作成と再評価

さて、ここまで来たら、さらに正解率の高めるためには何とかしたくなるのは当然ですね・・・。予測精度を高めるには、それこそKaggle等で多くのデータサイエンティストがしのぎを削っているように、多種多様な技や知恵、想像を超える努力がある訳ですが、ここでは同じ決定木のモデルを使って、ハイパーパラメータのmax_depth (決定木のレベルの深さ)を変更してみます。

先ほどのモデル作成と全く同じ操作でmax_depth=6 を指定してモデルを再作成します。

GraphVizを使って可視化をします。先ほどよりも決定木の層が深くなり、より複雑な分類を行っていることが分かります。

同様に予測値を計算し、テストデータに新しい予測値を追加したデータセットを作成します。

先ほどと同様に可視化を行います。今度は正解率が 0.9128 → 0.9182 と向上しています。右下の予測=yes 、結果=yes となっている集合が先ほどより大きく、色も濃くなっています。これは、予測値が1.0に近い値が出て(オレンジが濃い)、その顧客が実際に申し込みをしていた数が増えていた、つまり、申し込みをするという予測が実際にあたった数が多くなっていることを視覚的に表しています。

箱ひげ図の分布も確認してみます。決定木のレベルの深さを増やしたことで分岐の数が増えたため、予測値が分散し分布の数が増えています。また申し込み=y の箱ひげが若干上に上がっているので、実際の申し込み=yだった顧客に対する予測値は1(申し込みの確率が高い)に引き上げられていることが分かります。

予測モデルによって算出される予測値をTableau プロダクトを使って可視化することにより、数値だけでは伝えきれない理由の深堀や、可視化による直感的な理解を加えることで、更に説得力のあるメッセージを与えることができるのではないでしょうか。

Tableau ワークブックは こちらのTableau Public からダウンロード可能です。

Jupyter Notebook (ipynb)ファイルはこちらからダウンロード可能です。

以上、ご参考になれば幸いです。

 

 

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です