同一データに関する
ディープラーニング
アプローチ
1
照山 康平
IT系ベンダー会社勤務
◦ メインフレームのOS開発
◦ AI関連お手伝い
情報系大学学部卒
AI歴半年くらい
◦ ちゃんとやりだしたのはここ3,4カ月
2
機械学習とディープラーニングの関係
機械学習
AI(人工知能)
ディープラーニング
(深層学習)決定木
ランダムフォレスト
SVM, etc ニューラルネットワーク
3
機械学習とディープラーニングの違い
今回、Bank Marketingデー
タセットを使って、ディープ
ラーニングでの分析に挑戦
4
使用した環境
OS
◦ CentOS Linux release 7.6.1810 (Core)
GPU
◦ なし
CPU
◦ 72 cores / Intel(R) Xeon(R) Gold 5118 CPU @ 2.30GHz
RAM
◦ 756GiB
プログラミング環境
◦ Python3.6 + Keras 2.2.4 , backend=TensorFlow
5
扱うデータセット
Bank Marketing Dataset
ポルトガルの銀行機関のテレマーケティングで、
クライアントが定期預金を契約するか(変数y)を
予測するデータセット
年齢、職業、ローン等の情報がある。
◦ もともとはUCI機械学習リポジトリに掲載されていたもの
出展:http://lovedata.main.jp/2018/12/28/data-mining-process/
6
扱うデータセット
こんなデータ
出展:https://www.kaggle.com/janiobachmann/bank-marketing-dataset
7
事前処理
実際にデータを読み込んで中身を確認
◦ 特徴抽出などは機械が行うので、基本的にデータをいじるようなことはしない。
しかし、このままでは機械が読めないので、事前に機械が読みやすいよう前処理を行う
8
事前処理
ラベルエンコーディング(文字→数値変換)
◦ 機械は文字列(カテゴリデータ)を認識できないので、数値データに変換する
9
カテゴリデータを数値化すれば、とりあえず訓練できるのでやってみる
◦ 中間層(全結合層) 3つ、各層のユニット数32のネットワーク
モデル作成・訓練
:
入力層 中間層×3 出力層
:
: : :
10
モデル評価
精度9割超えてて、
上出来?
11
モデル評価
精度9割超えてて、
上出来?
予測したいのはこの
y=yesの部分
12
実はこのデータセットかなり偏っている!
⇒ このままでは良い訓練ができないので、
事前準備と訓練内容を精査していく
モデル評価
精度9割超えてて、
上出来?
予測したいのはこの
y=yesの部分
極端に言えば、常に0(No)を返す関数
def func(x):
return 0
でも8割近くの精度が出てしまう!
13
事前処理(追加)
OneHotエンコーディング(数値→OneHotベクトル変換)
◦ ラベルエンコーディングでカテゴリを数値にしただけでは、そこに大小関係が生まれてしまい、機械で
適切に扱えなくなる ⇒ このため、OneHotベクトル化が必要
Animal
鳥
犬
猫
Animal
0
1
2
LabelEncode
bird dog cat
1 0 0
0 1 0
0 0 1
OneHotEncode
鳥<犬<猫という
扱いになってしまう
カテゴリ数分のダミー変数を用意して、
対応する列だけを1,他を0にしたベクト
ルに変換する
例)
14
事前処理(追加)
pandas.get_dummies()
◦ pandas.DataFrameなら、pandas.get_dummies()メソッドでラベルエンコーディングとOneHotエンコーディ
ングを一気にやれるのでそっちの方が楽
day_of_week : [“fri”, “mon”, “thu”, …] を数値化&OneHotエンコードカテゴリ以外のデータはそのまま
15
標準化
◦ 数値を、平均0,分散1に加工する=大体-1~1の範囲に収束
◦ 各特徴量のスケールが異なるデータや、スケールが大きいデータで、
重みを更新しようとすると学習が遅い/進まなくなってしまう。
⇒ データを標準化して、特徴間のスケールの差を小さくまとめる。
事前処理(追加)
例)𝑦 = x1 𝑤1 + x2 𝑤2で𝑦 =2な学習を行う場合
(1)入力x1, x2が1付近の場合
誤差の等高円(error surface)が円形に近づく
(2)入力x1, x2のスケ-ルが大きい場合
誤差の等高円(error surface)は楕円形になる
出展:http://www.renom.jp/ja/notebooks/tutorial/preprocessing/normalization/notebook.html
16
事前処理(追加)
標準化(続き)
◦ 同様の目的で、正規化(値を0~1に圧縮する)もあるが、今回のデータのように、値のスケールが必
ずしも明確ではない場合は標準化を行う。
◦ 画像のRGBなどは1~255で明確なので正規化を使う
◦ 標準化も、対象データの母集団が正規分布になっていないと逆効果になるので注意(今回のデータは大体大丈夫そう)
表は見やすいようにDataFrame化したものです。
実際にはnumpy.ndarrayで出力されます。
17
中間層の数
◦ 基本的には、3層以上から とされている
◦ 増やしすぎると、誤差の伝播がうまくいかなくなるのと、単純に時間がかかる
◦ 一般的な考え方:
◦ ①層の数は、始め適当に多めにとって学習させる
◦ ②過学習したら正則化やDropoutで調整
◦ ③タスクを実行するのに十分な層数だと分かったら、性能が変わらない程度に徐々に少なくしていく
(「蒸留」と呼ばれる手法)
◦ 今回は、2値分類であり、それほど表現力を必要としないデータなのと、当日まで時間がないので、
まずは3層で行う
ユニット数
◦ 本来必要と思われる次元数を設定する
◦ しかしそんなの数分からない・・・。
◦ 少ないと、本来必要だった情報が削られることになるので、仮にちょっと多めに設定しておく
⇒ ここから、過学習したらL1,L2正則化で調整するなりDropoutを入れるなりでチューニングしていく
モデル作成
:
: : :
出力値計算
誤差伝播(重み更新)
正解値
(教師データ)
出力値
誤差
18
ユニット
モデル作成
正則化
◦ 過学習を抑えるための手法
◦ 学習では、𝑦 = 𝑓(𝑤, 𝑥)の𝑤を求めることが目的となるが、 𝑤の取りうる値に際限ないと過学習しがちに
なる ⇒ この𝑤に制約を持たせるのが正則化
◦ 層毎に適用される↓
◦ 基本的に、過学習したら調整していく(最初は、なしでやってみる)
数値が大きいほど、
制約がきつくなる
19
改めて、モデルを準備
◦ 変えたのは、ユニット数増やしたくらい。
◦ metricsには、精度(Accuracy)を出してもあまり意味がないので、y=yesとなる場合の適合率、再現率、
F1スコアを出す関数を自作(こんなの↓)して指定している。
モデル作成
20
モデル訓練
バッチサイズ
◦ 学習を行う最小の単位(ミニバッチ)
◦ このサイズの単位にデータがサンプリングされ、最終的に重みの更新が行われていく
◦ 今回のように偏りのあるデータでは、バッチサイズを小さくしすぎると1つのミニバッチの中に多い方の
データしかない、ということが出てくる=そのミニバッチでは、少ない方のニューロンの学習がされない
⇒ このため、ある程度多めのサイズを取る
◦ 多すぎると逆に学習が進まなくなるのでやりながら調整・・・
バッチサイズが小さいと・・・
十分なバッチサイズなら
:
: : :
ラベル2の学習がされない
ラベル2の学習もされる
ミニバッチ訓練データ ニューラルネットワーク
21
ラベル2の
データ
ラベル1の
データ
モデル訓練
エポック数
◦ 試しながら上げていけばいい(と思う)
◦ 最初は適当な値(10~20程度)で試していき、まだまだ上がりそうなら多めに、若干上がりそうなら少な
目に追加学習していく。
◦ 上がり方が寝てきたり、訓練とテストで差が出たりしたら終わり(その前に終わらしたい)
最初に数十回で訓練 数増やして追加訓練
まだまだ上がる!
まだ上がる?
もう無理?
少しだけ追加訓練
若干やりすぎ
例)
22
◦ バッチサイズ=256, エポックはとりあえず20回でループ
◦ callbacksのlivelossesplot.PlotLossesKeras()は、訓練しながらmetricsをプロットしてくれる素敵クラス
◦ 結果⇒
モデル訓練
なぜかvalidationのF1スコアが出ない・・・が、
F1score = 2*precision*recall/(precision+recall)
で導けるのであまり気にしない
23
モデル訓練
まだまだ上がりそうなので、エポック数を多めにして追加訓練
テストデータで予測した各種指標
24
モデル訓練
まだまだ上がりそうなので、エポック数を多めにして追加訓練
テストデータで予測した各種指標
!?
25
まとめ
データの前処理はかなり重要
× ディープラーニングなら入力データそのままで、機械がいい感じに加工してくれる
〇 データの理解と前準備が大切
◦ 異常値が混じっていないか? ⇒ ETL
◦ 誤ったスケールで学習していないか?⇒ 標準化・正規化
◦ カテゴリデータが数値のままになっていないか? ⇒ OneHotベクトル化
◦ そのそもデータは足りているか? ⇒ データ収集
・・・ 今回のデータセットでは、たまたまこれらがうまく整っていたためか、(異常な)超高精度!
ただ、せっかく良いモデルができてもそれを説明できないと使ってもらえない・・・。
◦ このためにも、データの理解は必要になってくる
ディープラーニングにおいても、BIと連携していくことは重要
26

Deeplearning bank marketing dataset