はじめに
前回の記事こちらの続きとなります。
今回は、具体的にどのような解法をしたかを記載していきたいと思います。
とはいえ、目標としていた6.8の壁を超えるものは作成できなかったので、解法といっても色々と試したことや失敗したことなどを中心に書きたいと思います
お正月に放送される芸能人が格付される番組で、はずれのくせにもっともらしく話している人を見るように読みすすめていただけたらと思います。
まずは、Dataiku使ってみてよかったところ
・初期設定が不要(ダウンロードですぐに使えた)
初期設で断念すること多々ありますよね
・前処理などもエクセルちっくに操作できる
表形式のデータを加工していくのでわかりやすい。
・ボタンもわかりやすい
色々試しました
・一部日本語UI対応でさらにわかりやすくなった
・コード対応もしているので、Nocoderから成長してもずっと使える
(AI分析系各社のデモを見せてもらう機会が何度かあったがこのように広い範囲で使えるのはなかった)
次にDataikuでちょっと不便だったところ
・無料版であるからかどうかは不明ですが、常時ネット接続が必要
寝る前に、実行して朝結果を見ようとしたら、ネット接続が切れていて結果が反映できなかった
(これはPC又はネットワークの問題なのでDataikuさん悪いわけではありません。だたローカルだけでモデル実行中が可能であれば、便利なのになと感じました)
では、記載していきます。
~日付に対する前処理や他の方も記載されているので、その部分は省略しています
金融機関目線での特徴量作成に挑戦
データカラムの少なさに悩む
金融機関による融資は、5大原則(安全性、収益性、成長性、公共性、流動性)に基づいて行われます。しかし、融資実行時にこれらの原則が守られていなかったり、途中でこれらの原則が崩れたりした場合、デフォルトが発生するリスクが高まります。業種や企業規模に見合った融資が行われているか、売上の減少による返済負担率の上昇がないかなど、検証したい点は多々ありますが、業種詳細、決算データ、事業計画書がなければ、そのようなアプローチは困難です。キャッシュフローのみで判断することも、経営者の人柄を評価することも、時系列データを用いることもできません。また、経験上、経理担当者やキーマンが突然辞めると、資金繰りが悪化し、不渡りが発生しやすくなり、結果として倒産するケースが多いですが、そのようなデータも今回は入手できません。これらを考慮すると、金融機関の担当者は、融資先を決定するために多くのデータを必要としていることが理解できます。
さらに、アメリカの融資制度については、田舎の地域金融機関で勤務している(現在は営業店勤務でもない)私には、さらに理解が難しいと感じていました。
でも、これからの時代、いやすでに時代は「融資可否をすぐに判断してくれる」機関から借り入れを行う人が多くなってきていることを考えると、与えられたデータで即時判断していくというスキームを金融機関が持たなければ競争に負けていくなと思います。そのためには、多くの人がデータに気軽に触れ、知見を出し合っていかなくてはいけないのではないでしょうか。そんな時代にDataikuのようなNoCoderでも簡単に取り掛かれるシステムはとてもありがたいです。
とりあえず仮説的に特徴量を作成してみる(操作画面については、ブログ用に再作成しています)
(仮説1)お金借りて事業増やせて雇用も増やせている先は、デフォルトしにくいのではないか?
(仮説2)金融危機(2008年)に貸出したものは、倒産しやすいのではないか?
仮説1はこのように作成検証しました
・加工は、「準備」でできます
・ステップを追加を押して
・出来ることがでてくるので、検索のところにifを入れるとif文を操作できる(create if,~をクリック
・この画面が出てくるので式のところを変更していきます。
どこを変更するかとても分かりやすいです
・まずは、CreateJobが1以上をJob=1それ以外を0とします
条件を新しい式として追加したい場合は、select or add a columnのところに新しいカラム名をいれます
APPLY を押すとjobの列を追加されました
同様にRetainedJobが1以上をkoyo(ローマ字かい!)=1それ以外は0を追加します
(やり方は同じです)
仮説を検証してみます。チャート機能のピポットを使って集計してみます
ダッシュボードで表示することも可能です
計算加工も出来ると思うのですが、まだ使いこなせてないので計算はエクセルで行いました
既存貸出に関しては、仮設1は該当しそうですが、新規貸出に関しては、仮設1は該当しなさそうです。
一般的な統計によれば、新しく設立された企業の約半数は、開業後5年以内に閉業するということを踏まえると、新規起業で雇用したが事業そのものがうまくいかず、人件費が負担となり倒産したというストーリーはあり得ることですし、新規事業がなく雇用増の場合もまたデフォルト率は高そうなので
この2つを条件1として1を立てる処理を作成しました。
仮説2については、年の抽出はDataikuの「日付の要素を抽出」機能を使えば一瞬でできました。
すごいです。
こちらも同じようにピポットを作成しましたが、計算の方法を使いこなせておらずエクセルです
2008年や2009年実行はそう多くなくその数年前ほうがデフォルトしていることが多いようです
危機の前に好景気ありという一般通説があり、その勢いで企業や業務拡大を狙ったが危機が起きて金融引き締めで貸し渋りなどの影響でデフォルトしたのかもと予想がたつのでこの指標も追加しました。
その他追加した特徴量としては、設備資金(term>=120)(運転資金は最長10年までなので貸出10年以上は設備資金となる)、一人当たりの貸出、不動産バブルの破裂が金融危機を引き起こしたことを踏まえ業種として不動産・建設に「1」などを追加しました
モデルの構築
Metricsの部分は、Slackで記載していただいた式を追加しカスタムしました。
コンペの評価に合わせて作成可能なのも便利です。これで正しい評価ができます
特徴量どうしで相関の高いものは削除しました
相関もデータの統計というところからすぐに作成できました
こちらの画面はまだ日本語対応にはなっていないので、翻訳機能で日本語化します
私はまだ全然使いこなせていませんが、統計的にデータを判断するためのツールも沢山あるようです。
自身が成長して、データを仮説以外で判断したくなった時にも便利ですね。
自動で色々提案してくれたりもしますが、相関は上位10の表示となるため全部を見たいので今回は相関を作成するところからやります
相関は多変量解析のなかにあります
相関を見たい変数を右に移動させてカード作成をクリック
色が濃いほど相関が強いです。これをみると
Termとsetubi
DisbursementGrossとGrAppvとSBA_Appvと1人当たりの貸出金は強い相関があるようです
確かに貸金は金額が多いほうが保証金額も高くなるし正の相関があるのは納得できます
設計のFeatures handlingで特徴量として使用するかどうかONOFFできるので、ここをONOFFしながら
色々試せるのもいいですね。(準備のところで削除してしまうことも可能ですが、ここで色々ためすのもありかなと思います
色々やりすぎて気が付けばモデル100個ぐらいためしていました(これでまだ1部です)
windows版はβ版なので、結果表示がおかしくなり、これなんのモデルだっけな?がありました
もしかしたら私がモデル作りすぎたせいかも?!
あと、アンサンブルの時も、モデルの作成方法によってはエラーとなる場合があります
このあたりは、回避方法があるのか、そもそもこのパターンの時はアンサンブルしてはいけないのか?自身のこれからの勉強の課題です
その後モデルを選択しデプロイするなどは、他の方も書かれているので省略します。
失敗編
不均等データにはSMOTOが効くというのを聞きつけtrainデータ(作成過程でKnownに変更)を2分割する過程でSMOTO処理を試みました
コードはこんな感じです
# -*- coding: utf-8 -*-
import dataiku
import pandas as pd, numpy as np
from dataiku import pandasutils as pdu
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import ADASYN
# Read recipe inputs
known = dataiku.Dataset("known")
known_df = known.get_dataframe()
# known_df内のすべての日付/時刻列を探索し、それらをUnixタイムスタンプに変換
for col in known_df.select_dtypes(include=['datetime64[ns]']).columns:
known_df[col] = known_df[col].apply(lambda x: x.timestamp() if pd.notnull(x) else x)
# train_test_splitを使用してデータを分割
df_train, df_test = train_test_split(known_df, test_size=0.2, stratify=known_df['MIS_Status'])
# 訓練データセットの特徴量とターゲットを分ける
X_train = df_train.drop('MIS_Status', axis=1)
y_train = df_train['MIS_Status']
# SMOTEをインスタンス化
smote = SMOTE(random_state=42)
#smote = ADASYN(random_state=42)
# 訓練データセットにSMOTEを適用
X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)
# SMOTE適用後の訓練データ(特徴量とターゲット)を結合
train_smote_df = pd.concat([X_train_smote, y_train_smote], axis=1)
# Write recipe outputs
testsmoto = dataiku.Dataset("testsmoto")
testsmoto.write_with_schema(df_test) # df_testを書き出すことを意図している場合
trainsmoto = dataiku.Dataset("trainsmoto")
trainsmoto.write_with_schema(train_smote_df)
※コードのほとんどは生成系AIに書いてもらいました
この2つにわけたものを設計でそれぞれtrainとtestデータに設定しモデルを実行
ただそれでは手元スコアも全然あがりませんでした
ここからが失敗の内容です
今考えるとトリッキーなことをしてしまいます。(やっているときはすごいアイデアを思いついた!)と感激しています そうSMOTOでわけたものを元にモデル分析をやってしまいます
おそらくコーダーの皆さんや経験値の高い方は、あちゃ~~となっているでしょう。
結果はこうです。すごい高スコアがでました
この時自分は天才かもしれないと思った自分がはずかしい。
分割時テスト用に作成データを利用しモデル検証です。自分で作成したモデルを検証してみます。
結果は下の0.604のほうで、上はSMOTOをADASYNに変えて検証したときの結果です
色々試して時系列的に比較できるのもいいですね。
手元結果がよかったのはただ過学習を起こしていただけでした。
評価機能がないと張り切って投稿していたかも。
とっちらかってしまったフォロー図はこちらです。
まとめようとしてさらにわかりにくくなってしまいました。
この辺りのまとめ方も今後の課題です。
最後に
チュートリアルから約3週間程度でしたが、Dataikuは使い始めまでの壁が低いので、Nocoderな私でもそこそこ使いこなして、コンペに楽しく参加することができました。(第一回は散々でしたんで)
Dataikuの基本的操作から詳しい操作まで自分の操作実力を証明する資格もあります
詳しくはこちらです
(私は基本操作のみ取得できました)
少しステップアップして、コードを追加する際は、一部設定を行わないといけないことがあり、エラーが起こってしまいました。
日本ユーザ用グループ がありそこで質問させていただいたら、解決まで根気よく教えていただきました。(今見たら26回もやりとりしていた)
Dataikuの皆様(ユーザー含む)たくさん助けて頂きありがとうございました。
今回のコンペでは、「何が起こるかわからないので、前もって行動を」を学びました。
でもその残念さよりももっと使い方をマスターし、Dataikuでほかのコンペにももっと参加したくなりました。そこで評価を上げていくことがDataikuを会社にも導入してもらえる一番の道な気がします
やっぱりデータ探索は、楽しいですね
突然の
理不尽な出来事で
他に投稿したり選びかたっかりしたかったのにできず、くや
しい思いをした人も多いのではないでしょうかでも振り返れば
いい思い出だったりします
第三回もあったら参加するぞ~~