第2回金融データ活用チャレンジにDataikuのノーコードでチャレンジしてみた

## 概要
夏秋といいます。
2月15日までSIGNATEで開催されていた「第2回金融データ活用チャレンジ」に参加してました。
普段は金融機関に勤めていて、データ分析とは無縁の仕事をしていますが、去年の「第１回金融データ活用チャレンジ」に参加してPythonと機械学習を勉強し、データ分析コンペの楽しさに触れました。
第１回に参加した時は「Databricks」というプラットフォーム上でPythonを使用してデータ分析をしていたのですが、今回は「Dataiku」というプラットフォーム上でノーコードでデータ分析ができるとのことで、今回はそちらを使ってノーコードでのデータ分析にチャレンジしてみました。
コンペの成績まずまずでしたが、データ分析初心者の目線から去年のフルコードと今回のノーコードの差について説明できればと思い、この記事を書くことにしました。

また、本記事はコンペにおいて「精度での入賞」と別に設けられている企業賞（Dataiku賞）にも応募するため記事でもあります。
賞の評価基準である「分析のプロセスの透明性・革新性、予測精度の高さ」を評価してもらうために、拙いながらデータ分析の手法も書き留めます。（受賞要件に予測精度の高さがあるので上位入賞していない自分にはあまり関係ないとは思いますが、Dataiku賞の盛り上げに一役買えれば幸いです）

## 「第2回金融データ活用チャレンジ」について
公式ページはこちらです。
https://signate.jp/competitions/1325
（今回は投稿用のページが参加者限定になっていたので、投票結果などはこちらからは見れません）
 
## コンペの成績
最終評価：0.6813971（224位）
![図１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714806/4b4ef1fd-4861-c053-c895-bb887e848618.png)


最終日にシステムトラブルがあり、最終評価データを１つしか選択できない状態のまま締め切りになってしまったため、若干心残りなところがありますが、データの最終評価がまあまあ良かったので、今回のコンペの結果としては十分かなと思っています。
ただ、途中から暫定評価のスコアを上げることに注力してしまって、自分のバリデーションの結果を信用できなくなってしまったことが悔やまれます。
最終結果を見てみるとバリデーションと最終結果がある程度連動していたので、「Trust your CV」（自分の評価を信じろ）というKaggleの格言を身にしみて感じました。

メインとなるDataikuのFlowはこんな感じです。

![図２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714806/74d5602b-bb6c-8166-ec40-bb480df66793.png)

見た目がかなりぐちゃぐちゃですが、やってることはシンプルです。
もっとスマートなやり方があると思うんですが、これが限界でした。
 
## データ確認・前処理
データの確認・前処理についてはDataikuのハンズオンで説明されたやり方を踏襲し、Visual recipesのPrepareを使用して、データの型の整理や日付データの変換を行いました。
Dataikuを使用して一番感動したポイントはここで、「データの可視化」「データの欠損値・異常値の発見」といったデータ分析の第一歩を苦労なく実行してくれるのは本当に感動しました。

![図３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714806/ba6bc803-986e-fa6c-0567-c3a9f97eac19.png)


データ名の近くのバーが欠損値・異常値を表していて、緑が正常値・グレーが欠損値・赤が異常値ではないか？とDataikuが判別した値です。
 
去年フルコードで初めてデータ分析した時は、まずデータの全容をつかむまでかなりの時間がかかったので、その作業に時間がかからないのは本当に素晴らしいと思います。
 
## 特徴量の追加
月並みですが、金額の割り算・年数の引き算などの特徴量を追加しました。
Dataiku上ではVisual recipesのPrepareを使用しました。

Prepare機能は「どんな加工がおこなわれたかのログが残る」「実行内容をグループ化して整理するのも簡単」「オンオフボタンがあり、加工をいったんやめる⇒やっぱ加工する、といった動きがしやすい」とデータ分析する人の使いやすさにこだわってる感じが伝わってきます。
![図４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714806/5c5408ce-ae22-3e10-645b-13aa94eb53db.png)

画面左に加工履歴がすべて表示され、ここから加工履歴をグループ化したり、加工作業を一時的にオフにしたりすることが可能です。
個人的にはこのオンオフボタンが感動しました、、、すばらしい、、、


次に、City・LowDoc・Sector・RevLineCr・State・BankStateについて、それぞれターゲットエンコーディング・カウントエンコーディングを行いました。
追加で、例えばLowDocとSectorの文字列を単純に連結するなど、それぞれの特徴量を連結した特徴量を作成し、これらについてもターゲットエンコーディング・カウントエンコーディングを行いました。
Dataiku上ではVisual recipesのGroupを使用して、データごとのTrainデータ内での個数・MIS_Statusの平均（Ave）を取得し、それをTrainデータ・TestデータにJoinしました。
※本来はtrainデータを分割してエンコーディングすることが望ましいのですが、今回は実装する実力が足りなかったこととデータ量がそれなりにあるので、問題ないだろうと判断して進めました。ただ、Cityだけは１つしかないレコードが多いためか、ターゲットエンコーディングするとかなり評価が悪化したので、外しました。

この対応だけでFlowが最初の図のようなぐちゃぐちゃした形になってしまいました。
もっといいやり方があったと思うのですが、時間が足りませんでした。

 
## 機械学習
Dataiku上のVisual MLのAutoML Predictionを使って分析しました。（AlgorithmsはほぼLightGBMのみ）
この機能では、複数の分析手法を同時並行で実行したり、実行結果を並べてみることができます。
実行結果をすぐに見ることができるのはとても便利で、Feature importanceの上位６つがすぐに表示され、その詳細を見ることもクリックだけでできるのがかなり衝撃でした。
![図５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714806/afdb3639-1dc4-9ff2-4556-ac4153b0a424.png)
![図６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714806/eeb0d95c-6f8e-c73b-6b05-83735647fd36.png)



ここも去年フルコードで苦労したポイントです。例えばFeature importanceは、かなり大事な情報なのにPythonは呼び出すプログラムを実行しないと（というかそもそも知らないと）教えてくれません。
その点、Dataikuでは有用そうな情報については何もしなくても表示してくれるのでとても便利でした。
ちなみに、AutoML PredictionではMetricsをF1ではなく、AUC選択した場合のほうが評価が向上したケースがあるのですが、これはF1とmeanF1で閾値が異なるためにおきた事象ではないかと考え、F1だけでなくAUCもMetricsに加えて、比較しながら分析を進めました。

## 閾値調整とアンサンブル
AutoML Predictionで作成された結果をもとにproba_1の値をもとに下位10％を0（債務不履行）、それ以外を１（債務履行）となるように分割しました。
今回のコンペでは閾値をどう設定するかで評価が変わってきましたが、あまり振り回されてもいけないと思って、後半では10：90に分割するように固定しました。
また、いくつかの分析結果のproba_1を単純平均するアンサンブルも行いました。
特徴量を微妙に増減した結果やMetricsを変更した結果などをいくつか平均した結果を使用してアンサンブルしましたが、このアクションが一番スコア上昇に寄与していたと思います。
 
## ノーコードで苦労したポイント
今回のコンペで、「フルコードならあんなことやこんなことができたんだけど、ノーコードの環境にしちゃったからできない、、」ということがいくつかありましたので、まとめます。
もちろんこれはDataikuではできない、ということではなく、自分の知識不足によりDataikuで実現することができなかった、ということですので、あしからず。
（Dataiku上ではPythonで一部手作成するような実装も可能なのですが、Pythonのコードを昨年の記憶から引っ張り出すことができませんでした。）
 
・今回の評価指標がMeanF1スコアだったことから、バリデーションでMeanF1スコアを算出しようとしましたが、閾値ごと（例えば債務不履行の割合を0%から20%の1%刻み）のMeanF1スコアをDataiku上で作成しようとするとFlowがとんでもないことになってしまったので、実装することができませんでした。
・AutoML Predictionを使用したハイパーパラメータの調整をする際、F1スコアを高める方向に学習した結果がMeanF1スコアと連動しない、という事象が発生し、結果ハイパーパラメータの調整をあきらめました。（Slack上で関連する質問をしてDataiku担当の方に回答いただいたんですが、理解が追い付きませんでした、、、）
・繰り返しの処理を実装できませんでした。例えば、AutoML Predictionで「特徴量を一つずつ減少させた場合のmeanF1スコアの増減を確認したい」となったとき自分の知識ではAutoML Predictionを手作業で何度も起動するしかやり方を思いつきませんでした。繰り返しの処理が実装できれば、夜寝てる間にいろいろな分析を試してもらえるのに、、と思いながら日々ポチポチしていました。
 
## さいごに
Dataikuは本当に使い勝手がよかったです。
去年自力で調べながらなんとかやっていた部分が最初から実装されているので、初心者がデータ分析に触れるにあたって、こんなにありがたいものはないでしょう。
Dataikuでデータ分析に触れて、そのあと興味があればフルコードで分析精度を向上！という道筋が見えますが、そもそも実務ではそこまでの精度を求められないでしょうから、最初から最後までDataikuだけでいいんじゃないか、とすら思いました。
Pythonを知らないとデータ分析に触れられないのであれば、データ分析という分野の間口が狭すぎですからね。

今回は本業の関係であまり時間が取れなかったのですが、Dataikuのおかげでデータの確認・前処理にそれほど時間がかからなかったことから、ちゃんとデータ分析に時間をかけることができました。
また、Slack上でDataikuの使い方について何度か質問をさせてもらったのですが、Dataiku担当者の方のサポートも素早く丁寧で、安心して分析に集中することができました。
 
コンペ全体ではいろいろとトラブルがありましたが、あーでもないこーでもないといろいろ試して熱中する時間は本当に楽しいので、来年も開催されればいいな、と思っています。
その際は今回の反省を生かしてもっとDataikuを使いこなしてみたいです。