焦点

でっかいことに焦点を

【データサイエンティスト046】コンペ応募:大手ヘッジファンドX: 金融モデリングチャレンジ

現在、Pythonを用いたデータ分析の練習として
DeepAnalytics(データ分析コンペサイト)の
「大手ヘッジファンドX: 金融モデリングチャレンジ」という
コンペに参加中です。

deepanalytics.jp

deepanalytics.jp

えぇ、現金なもので、
勉強するより1位50万円のコンペに
チャレンジすると、身の入り方が違う!笑

もっというと、、

できないと50万円持って行かれる!
だともっと身が入るんでしょう。。

ともあれ、このわかりやすいやる気で
色々と昨年から勉強がてらプログラムを回し
わかってきた内容を棚卸しがてらまとめてみます。

このコンペで面白いところは

他参加者との情報共有は可能
コンテスト参加者が他参加者と本コンテストの予測に関連するデータ・ソースコードを共有する行為は可能です。
ブログなどでの情報発信も行っていただいて構いません。 というところですね。 *1

以下、半年前の自分に向けて、書いてみる。

1. この記事のカバーする範囲

Pythonをインストールして設定、上記のコンペに応募するまで。

期限は1/15なのであと少し!*2

2. この記事の対象

マクロやC+などプログラムが書けるけど
Pythonは初めて、
機械学習も初めましての人。

だいたいのインストールや環境変数設定などは
ググればできる、という( ゚д゚ )彡そう!じゃない、層に向けて。

イメージでいうと工学の大学院卒、企業でエンジニアしてますーという人かね。

3. 注意点

こちらプログラミングについては超素人です。
まともに習ったのはPascalだけ、、、(なぜ?)
あとは自学自習。

眉に唾をつけてどうぞ。

4. 実際の手順

1.1 Python インストールから応募まで

qiita.com

基本的に上に従って下さいませ。笑

Windows10の方がPythonインストールする際は下記が親切。

Anaconda を利用した Python のインストール (Windows) – Python でデータサイエンス

Anacondaというパッケージでインストールすると
後日のパッケージ追加などもしやすい。
CUIに慣れている人以外はとっつきやすいのでAnacondaが吉だと思います。

Pythonインストールしたあと、
どうやって走らせるかには大きく4つの方法がある。

結論から言うと、
データ分析の際は Anacondaで環境設定したら自動でついてくる
Jupyter Notebookというブラウザ環境で動かせる環境がお薦め。

Jupyter Notebook を使ってみよう – Python でデータサイエンス

メリットは、リアルタイムで結果を見ながら調整できるので
コンパイル→結果確認の手間が削減できること。

必要ならエクセルのピボットテーブル並(いや、それ以上?)の機能も使えます。*3

その他の手法として、
 ①テキストエディタ
 ②インストール版の開発環境(ソフト)
   PycharmやAtomが有名
 ③オンライン版の開発環境
があります。
必要ならぐぐってみてください。

ここではJupyterがおすすめです。
(僕はここ(どれでやる?)で引っかかってぐるぐる回り猛烈に時間を損した、、、)

1.2 わからなかったら遡るところ

kohei327.hatenablog.com

基本的なところから、DeepAnalyticsへの応募までカバーしてくれます。
Udemyは時々キャンペーンで1400円?などになるのでそこを待つのもよし、かな。

1.3 次のステップ(僕は今ここ)

1.1で紹介したサイトのデフォルト設定でちゃんと点数が出ました! (点数はヒミツ) 。 デフォルトだと何も考えなくてもここまでの精度は脅威としか言えない。。

さて、ここから取る作戦は2つ。
このパラメータを調整するか他の手法に手を出してみるか。
まずは他の人が何を使っているか分析!

ちゃんとDeepAnalyticsがまとめてくれています。
データ投稿→Rankingの下の方。
オプトDSL・DeepAnalyticsコンテスト『大手ヘッジファンドX: 金融モデリングチャレンジ』

現時点でソフトウェアはPythonが一番人気、2位Rの6倍以上。

ここで着目したのが解析手法。
1位(23.4%)のBoostingってなんだ、、、
2位(17.2%)はLogistic Regression、ロジスティック回帰。これはわかるような気もする。。

Boostingについて色々勉強しつつとりあえず走らせてみた。

結果デフォルトでも0.6942に!
今の1位が0.6917(▲0.0025)なのでほぼ僅差やないか!
と思ったら50位でも0.6928(1位から+0.0011)なので超団子状態やないか!

うーん、パラメータ調整でとにかくGridSearchを走らせてみた(超初心者)が終わらない。
いつ終わるのか。。。終わらないのか。。
PC2台あるので1台は放置で様子見。

なんとか50位以内に食い込んでみたい。

参考:最後に現状のソフト貼り付け(今見てもぐずぐずです、、、恥さらしに)。

from sklearn.ensemble import GradientBoostingClassifier
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
train = pd.read_csv("train.csv")
test = pd.read_csv('test_updated.csv')
submit = pd.read_csv("sample_submit.csv", header=None)
X_train = train
X_train.head(1)
data_id period c1 c2 c3 c4 c5 c6 c7 c8 ... c80 c81 c82 c83 c84 c85 c86 c87 c88 target
0 2 train1 0.65557 -0.000022 -0.000539 -0.001075 0.0 0.0 0.21339 0.0 ... -0.023358 -0.017041 0.0 0.060697 0.0 0.0 0.0 -0.000202 -0.14022 1

1 rows × 91 columns

del X_train['data_id']
X_train.head(1)
period c1 c2 c3 c4 c5 c6 c7 c8 c9 ... c80 c81 c82 c83 c84 c85 c86 c87 c88 target
0 train1 0.65557 -0.000022 -0.000539 -0.001075 0.0 0.0 0.21339 0.0 0.009358 ... -0.023358 -0.017041 0.0 0.060697 0.0 0.0 0.0 -0.000202 -0.14022 1

1 rows × 90 columns

del X_train['target']
X_train.head(1)
period c1 c2 c3 c4 c5 c6 c7 c8 c9 ... c79 c80 c81 c82 c83 c84 c85 c86 c87 c88
0 train1 0.65557 -0.000022 -0.000539 -0.001075 0.0 0.0 0.21339 0.0 0.009358 ... -0.006942 -0.023358 -0.017041 0.0 0.060697 0.0 0.0 0.0 -0.000202 -0.14022

1 rows × 89 columns

train = pd.read_csv("train.csv")
test = pd.read_csv('test_updated.csv')
train.head(1)
data_id period c1 c2 c3 c4 c5 c6 c7 c8 ... c80 c81 c82 c83 c84 c85 c86 c87 c88 target
0 2 train1 0.65557 -0.000022 -0.000539 -0.001075 0.0 0.0 0.21339 0.0 ... -0.023358 -0.017041 0.0 0.060697 0.0 0.0 0.0 -0.000202 -0.14022 1

1 rows × 91 columns

train.shape
(560000, 91)
X_train.shape
(560000, 89)
y_train = train['target']
X_test = test
X_cols = test.columns.tolist()[1:]
y_cols = ["target"]
X = train[X_cols].as_matrix().astype("float")
y = train[y_cols].as_matrix().astype("int").flatten()
from sklearn import model_selection
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size = 0.1,random_state=42)
clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1,max_depth = 3).fit(X_train,y_train)
pred = clf.predict(X_test)
expe = y_test
score1 = clf.score(X_test, y_test)
pred
array([0, 0, 0, ..., 0, 0, 0])
expe
array([1, 0, 1, ..., 0, 1, 1])
score1
0.56908928571428574
X = test[X_cols].as_matrix().astype('float')
result = clf.predict_proba(X)
submit[1] = pd.DataFrame(result)[[1]]
submit2 = submit.iloc[:,0:2]
submit2.head()
0 1
0 1466096 0.345723
1 1466102 0.514188
2 1466110 0.500592
3 1466113 0.522926
4 1466115 0.484685
submit2.to_csv("submit2.csv", header=None, index = None)

以上!

*1:コンテスト終了後のソースコードの公開・共有は禁止とのことで終了後はソースコード削除しますぅー。

*2:真面目にやってるので、ライバル増やしても仕方ないけど、こんな辺鄙なブログでライバルは増えないでしょう。

*3:https://qiita.com/Hyperion13fleet/items/c99dbbc6bdb455804847