【データサイエンティスト046】コンペ応募:大手ヘッジファンドX: 金融モデリングチャレンジ
現在、Pythonを用いたデータ分析の練習として
DeepAnalytics(データ分析コンペサイト)の
「大手ヘッジファンドX: 金融モデリングチャレンジ」という
コンペに参加中です。
えぇ、現金なもので、
勉強するより1位50万円のコンペに
チャレンジすると、身の入り方が違う!笑
もっというと、、
できないと50万円持って行かれる!
だともっと身が入るんでしょう。。
ともあれ、このわかりやすいやる気で
色々と昨年から勉強がてらプログラムを回し
わかってきた内容を棚卸しがてらまとめてみます。
このコンペで面白いところは
他参加者との情報共有は可能
コンテスト参加者が他参加者と本コンテストの予測に関連するデータ・ソースコードを共有する行為は可能です。
ブログなどでの情報発信も行っていただいて構いません。 というところですね。 *1
以下、半年前の自分に向けて、書いてみる。
1. この記事のカバーする範囲
Pythonをインストールして設定、上記のコンペに応募するまで。
期限は1/15なのであと少し!*2
2. この記事の対象
マクロやC+などプログラムが書けるけど
Pythonは初めて、
機械学習も初めましての人。
だいたいのインストールや環境変数設定などは
ググればできる、という( ゚д゚ )彡そう!じゃない、層に向けて。
イメージでいうと工学の大学院卒、企業でエンジニアしてますーという人かね。
3. 注意点
こちらプログラミングについては超素人です。
まともに習ったのはPascalだけ、、、(なぜ?)
あとは自学自習。
眉に唾をつけてどうぞ。
4. 実際の手順
1.1 Python インストールから応募まで
基本的に上に従って下さいませ。笑
Windows10の方がPythonインストールする際は下記が親切。
Anaconda を利用した Python のインストール (Windows) – Python でデータサイエンス
Anacondaというパッケージでインストールすると
後日のパッケージ追加などもしやすい。
CUIに慣れている人以外はとっつきやすいのでAnacondaが吉だと思います。
Pythonインストールしたあと、
どうやって走らせるかには大きく4つの方法がある。
結論から言うと、
データ分析の際は
Anacondaで環境設定したら自動でついてくる
Jupyter Notebookというブラウザ環境で動かせる環境がお薦め。
Jupyter Notebook を使ってみよう – Python でデータサイエンス
メリットは、リアルタイムで結果を見ながら調整できるので
コンパイル→結果確認の手間が削減できること。
必要ならエクセルのピボットテーブル並(いや、それ以上?)の機能も使えます。*3
その他の手法として、
①テキストエディタ
②インストール版の開発環境(ソフト)
PycharmやAtomが有名
③オンライン版の開発環境
があります。
必要ならぐぐってみてください。
ここではJupyterがおすすめです。
(僕はここ(どれでやる?)で引っかかってぐるぐる回り猛烈に時間を損した、、、)
1.2 わからなかったら遡るところ
基本的なところから、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)
以上!