u-ryo's blog

various information for coding...

Category: Ai

RapidMiner

| Comments

今、会社の業務の一部(先月から0.75)でAI、機械学習をやっています。 題材としてSignate【練習問題】銀行の顧客ターゲティング をやっています。 業務時間中に色々試せるのはありがたいです。 PythonやR、kerasやGoogle Colaboratoryや Azure上のVM with GPUとか貰って試していたのですが、 結局RapidMiner使ってみました。 KSKのtutorialで勉強して、 色々と回せるようになりました。 確かに簡単ですねこれ。 でも、分かって来るとその限界や欠点も見えてきました。 また、課題に対する知見も溜まってきたので、忘れないうちに。

  • 基本的な流れは、Read CSV(train.csv)Cross Validation(Gradient Boosted TreesApply ModelPerformance(Binominal Classification))とRead CSV(test.csv)を合わせて→Apply ModelSelect AtributesWrite CSVRapidMiner flow inside cross validation
  • CSVのreadでは、まず最初の列のidをid、最後のyをlabelに指定、その他のattributesについては、yes/no 2値のものをbinominal、dayをintegerではなくpolynominalにするのがpointか。
  • dayとmonthから日付にしては? と思っていたのだが、pdateを見ると同じ月日でも何百日のものもあって複数yearsありそう、且つyearは特定できなさそう(365日毎でもない)
  • ならいっそday/monthをfeatureから落とすと精度が落ちる
  • せめてmonthだけでもdateとして認識できないかと試したがdate format指定をmmmでは出来なかった(小文字だから?)
  • ウリのAutoModelを試したところ、data file指定、fieldsのcorrelationから落とすattributesを指定、複数種類のmodelを実行、その後modelのparameterをいじれてsimulationが出来、modelに対する理解が進むというもの。AutoModelではGBoostよりDeepLearningが僅差で良かったがAUC 0.89程度
  • 自分でcross validationするようにして色々なmodelerを試したところ、Deep Learningも良かったがGradient Boosted TreesがAUC 0.90と最強だった
  • なのでGBoostでparameter tuningを。number of treesはdefaultの20からぐっと増やした方が。max depthはちょっとでも大きすぎるとダメ。learning rateもちょっとでも増やすと精度は落ちる
  • あんまり細かくtuningしても、結局randomizeの影響が大きい。小数点以下3桁程度のぶれは出てしまう。即ち、全く同じparametersで試しても結果が違う。reproducibleをcheckしても、cross validationの仕方が違うので、全てのrandom性を注意深く固定しないとならないし、randomのseedを探索する事になってしまうのもアホらしい
  • 仮にmodelingが出来たとして、これをserviceとして抜き出すのは難しそう。RapidMiner Serverを買えということか。そういうところで彼らは商売をしているのだろう。
  • GPUが無くても速い(30秒程度)のは、MultiThreadを使っているからか。topを見ていると気持ちいいくらいmulti coresを使っている。流石はJavaである。
  • よく言われるXGBoostというmodelerは無く、Gradient Boosted Treesがそれ相当
  • one-hot vector化しようと思ってNominal to Numericalを前処理に入れたら精度が落ちた。その出力をよく見たら、これ単に非numericalなattributesを落としてるだけ。何これ。じゃぁっていうんでNominal to Binomialにしてみても全く同じ。えー、RapidMinerではone-hot vector化、簡単に出来ないの!? 他の言語ではチョー簡単なのに。
  • RapidMiner、凄く簡単ですけど、これはinput dataがone fileで数万recordsしか無いから、でしょう。これが画像群だったらこうはいかないでしょう。

現時点で最良の結果(5/11/2018現在68位)

https://signate.jp/competitions/1/leaderboard#scoreboard

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
number of trees: 205
maximal depth: 5
min rows: 10.0
min split improvement: 0.0
number of bins: 20
learning rate: 0.1
sample rate: 0.8

PerformanceVector:
accuracy: 90.89% +/- 0.42% (mikro: 90.89%)
ConfusionMatrix:
True:	1	0
1:	1638	935
0:	1536	23019
AUC: 0.933 +/- 0.006 (mikro: 0.933) (positive class: 0)

これ以上AUCを上げるには、 RapidMinerじゃない何か、RかPythonを使って、 入力dataもone-hot vector化して、とかしないとならないような気がします。

Alpaca Algo

| Comments

こういうの、あったんですねー。すごいすごい。 Alpaca Algo、かつてのCapitalicoだそうですが、 自分でindicatorを指定して、勝ちpattern(負例も!)を指定して、 そうすると裏で超高速に事例を学習し、 back testまで速攻でやってくれるとは! 幾つか試してみましたけど、テキトーにやっても、 back testでプラスになったりするので、おぉー! と思ってはみたものの。 back testの期間をdefaultの3ヶ月ではなく、 1年とか、特に2016年を入れると、 途端に物凄い成績悪くなります。 なんでー!? 2016年って何か違ったんでしょうか。 っていうか、2017年の方がおかしい? とにかく、何か違うようです。

patternに当てはまったら通知もしてくれるというので、 試してみます。 まだ本番への適用は怖い感じですが。

9日朝、2回通知来ましたけど、以降はさっぱり当たりませんでした。 デモ取引では、10:05にentryして15:48現在まだ売買成立してません。 ドル円上下15pipsなので、day tradeにはちょっと大きめの幅なんでしょう。

色々試してみると、

  • 10〜20はpattern入れて、って書いてありますが、あんまり入れると取引回数少なくなる?
  • 負例も入りますが、負例はいくら入れても学習対象としてcountされません。入れた方がいいのかどうなのか、よくわかりません。
  • back testでは、どのくらいの精度で当てはめてentryして、どのようにexitするかで当然成績は大きく変わってきますが、「全部お任せ!」にしておいた方が一番成績いいみたい、です。「最適な○○を最適化」とかって具体的には何やってんのかさっぱりですけど、グラフではなく数値で見ると、利食い損切りpipsがわかるので何となく。
  • 売り・買い両方揃えないとダメかしらん。
  • 範囲はどこまで指定したらいいのか、よくわからないですが、何となく学習してるのはindicatorがどうのというより値動き(ローソク足)だけっぽい? いやでも確かにindicatorの種類だけ変えると結果変わるのでindicatorも見てるんでしょうけど...