ざっくばらんメモ_12:kaggle

###kaggle seguro

code

このサイトを参考に,xgboostのパラメータチューニングを引き続き行う.

一部修正を加えつつ,一通り通しでやってみたが,

結果LB0.269 -> 0.236へ下がってまう.

どこかでチューニングのやり方が間違っているように思える.

ひとまず公式の評価指標がNormalized Giniなのでそれに合わせてみる.

しかし結果のsubmissionが上手く行かず. エラーとしては出力のレンジが[0, 1]に収まっていないというもの.

たしかにobjectiveをlinear regeressionでの学習をしていた事に気づいた.

ここをobjectiveをlogitstic regressionに切り替えて利用.

しかし結果はLB0.131で通常のrmsエラーより半減してしまった.

ざっくばらんメモ_10:kaggle, 創造性について

kaggle zillow

code

zillowは今週末で提出期限.

Kernelに公開されている手法で二種類のxgboostとlightgbmを組み合わせる事 で好成績を叩き出している手法が存在しているので, これらを取り入れる事にする.

kernelで公開されている手法とパラメータをそのまま使ってみる。

結果0.0655292 -> 0.0649626で結構改善.

しかしkernelで公開されている手法より性能は低いままであった.

結局は,学習そのものよりも前処理やアンサンブルなどに問題があると思われる.

他の公開手法を見てみても普通にxgboostやlightgbm等を使っているだけで 0.064台を達成出来ているので,もう少し前処理やモデルの組み合わせ方の部分に気を配るべきであった.

またモデルの学習などにおいて,適切のハイパーパラメータが選ばられているとは言えず, 次以後は簡単で良いのでちゃんとパラメータ選択を行う事にする.

kaggle Porto Seguro

新たなkaggle challengeとしてPorto Seguro’s Safe Driver Prediction Challengeへ取り込む事とする.

今回は保険会社からのお題で,ドライバが次年に保険適用申請するか どうかを予測するというもの.

問題自体はシンプルだが,今回扱うデータは2値出力のラベルがかなり偏っている のどそれを念頭に入れる必要がある.

こうしたimbalanceデータに対しては例えばwieghted lossの適用や, Subsampling+boosting,exemplar learning的の手法などがある.

消費と創造の関係

何かを消費するたびに何かを知る事が出来る.

その知る事に付随した驚きや感動を覚える事で,それをまた期待 しさらなる消費によって,さらに知ろうとする.

しかし消費を続ける内に新たに知る事の絶対量は減っていき, 最終的に物足りなさを感じるようになる.

あるいは今まで知った事に基いて,これから知りたい事に対する興味の 方向性が決まってくると,消費される物がその方向性に対して 正確に最適化されていない事に気づき,ストレスを感じるようになる.

こうした状態に至ると初めて消費から創造へのシフトが起きる.

この時,創造の動機は自己の内へ向いている.

自分が本当に知りたい(消費したい)事は何かを探求し,それを創造する 過程で知る(消費する)事を達成する.

ここで創造されたものは,自己の興味に最適化しており,創造されたもの(消費されるもの) と自己の興味が接近し,理想的には一体化する.

これはまさに自己表現の形であると考えられる.

ただ上記した創造の動機は自己の内だけでなく外にも向いている場合が多く, その場合,社会的な承認欲求(あるいは自己超越?)などと組み合わさっている と思われる.

ざっくばらんメモ_9:kaggle, 技術適応力,コラボ重視の仕事スタイル

kaggle zillow

アンサンブルとresnet regressionを組み合わせるも結果は対して変わらず.

根本的のアプローチが間違っていると思われる.

kernelで公開されている手法では,割りと単純なregression tree系の手法を 組み合わせるだけで,ただ組み合わせる時の重み選択はかなり詳細に行われている.

そこで,今まで作ってきたモデルの重み付け和に関して, 線形回帰での学習を行っておき,学習した重みを用いてアンサンブルする.

ー結果,微量の改善.しかし順位に対した影響なし

技術における適応力を付けるには

技術は日進月歩であり、それに素早く適応していかなければ自分の能力はすぐに陳腐化してしまう。

しかし適応するには学習コストはどうしてもかかる。

それを削減するにはどうしたらよいのか。

学習コストの中で最も高くつくのは時間である。

時間が経つと学ぼうとしている事自体も陳腐化してしまい、結果として得られる効果も薄れてしまうからである。

では時間を減らすにはどうしたらよいか

1.金で時間を買う

これは外注すると言い換えても良いかもしれない。

学びたい事の本質を見極め、それ以外は賢く外注してしまうのが良い。

2.必要な事だけをやる

1.とも関連するが、目的を常に明確化し、そのために最低限必要な事を見極め、それだけを速やかに行う事が理想である。

しかし必要な事を見極めるのは簡単ではなく、実際はやりながら修正を加えていく事がほとんどになる。

3.評価可能な事をやる

評価可能でない事を目標にしてしまうと、その目標を具体化、細分化する事が難しく、つまり↑の1.2.を行う事も難しくなる。

また目標が達成されたかどうかの見極めも難しい。

ただし数値化にこだわると評価可能な事があまりにも少なくなるのでそこはトレードオフである。

4.リスクを知り、リスクを取る

3.で言う評価可能な事をやるのは実際は難しく、大抵は不明瞭な部分を残したまま進まざるを得なくなる。

そうした不明瞭な最中に素早く決断して前に進んでいく事も大事である。

この時、闇雲にやってしまうと失敗ばかりになってしまうのでここもまたバランスが難しい.

人材の流動性がないから目的の人材とコラボする日本のスタイル

アメリカでは,ほしい人材がいればヘッドハントしていく.

日本ではそれが難しいから,コラボをしようとする.

その場合,相手にもメリットがあり,win-win関係が結べるならば ビジネスとして理想的だが,そうでない場合(こっちの方が多い)は こちらからお金を出して協力してもらう.

これは間接的な雇用のようなもの.

しかしお金だけで解決しない利害関係もあるので, 契約関係の問題が面倒である.

似たような事は社内の部署間でも起きている.

またアメリカでは必要でなくなった人材は比較的解雇しやすい.

しかし終身雇用の文化が強い日本ではそれは難しい.

それに対して(ジェネラリスト?)教育を社員へ施し, 社内外で任意のコラボ(調整)が得意な人材を生み出す事で, 上記のスタイルを最大限確立しようとする.

しかしそれに失敗した人材はいわゆる窓際族になってしまう.

ざっくばらんメモ_8:kaggle, projective space

kaggle

Resnet regressionモデルを stackingを含めたアンサンブルモデルの中へ 組み込んで見る.

現在学習中(結構時間がかかる)

projective spaceを利用した線分及び面の表現

(x, y)2次元ユークリッド空間における線分は ax + by + c = (x, y, 1)(a, b, c)T = 0 の形式で表す事ができる.

ここで,l = (a, b, c)を線分と呼ぶ.

この時,係数をk倍した場合の kax + kby + kc = (kx, ky, k)(a, b, c)T = 0 も同じ線分を表しているため,このkに関する軸wを新たに含んだ (x, y, w)の3次元空間をprojective spaceと呼び, 対応する線分上の点を(x/w, y/w)で代表して表現する.

ここで,(x, y, w)が線分上の点を表す条件は 上式で(kx, ky, k)を(x, y, w)で置き換えれば, (x, y, w)(a, b, c)T = 0 になる.

これは面表現に拡張する事が可能で,今度は(x, y, z)3次元ユークリッド空間で 考えた時,ある3次元直線ax + by + cz + d = 0があってそれを法線として捉えれば 対応する平面を構成出来る.

すると結局3次元直線だけを考えておけば良い事になる. 対応するprojective space(x, y, z, w)表現は ax + by + cz + dw = 0 となる.

ここでn = (a, b, c)は法線ベクトル(必ずしも単位長でない)で 原点から平面への距離は D = w / ||n|| で表せる.(http://mathinsight.org/distance_point_plane)

ざっくばらんメモ_7:kaggle、ベンフォードの法則、他者の学習規則の学習

kaggle zillow challenge

前回出したresnetの結果をアンサンブル予測のなかに組み込んで 予測を行ってみる.

ー結果,0.0657365で改善ならず.

 resnetはアンサンブルしない方が良い事になってしまった.

 もう少しresnetの学習を続けてみて,再トライする.結果0.0657484でほぼ変わらず

Let’s See Your Digits: Anomalous-State Detection using Benford’s Law, kdd2017

ベンフォードの法則は自然に生てくる数字の発生頻度がある決まった法則に従う事を示す理論である。

本論では、その事実を最近のWebサービスであるWikipediaTwitterGitHubなどに対して成り立つ事をまず示す。

そしてこの事を利用して、ベンフォードの法則から外れた事象を異常として検知するシステムを提案している。

ベンフォードの法則自体は昔からある法則で、これから外れた事象を異常として検知する考え方も昔から 存在したが、それをWebサービス(ビックデータ?)へ適用可能な形に構築し、かつそれがしっかりと 働く事を示したという点で新規性があるのかもしれない。

Learning to Model Other Minds

マルチエージェントシステム的な設定を考えた時に, 他者の存在を考慮に入れて学習を行うようにする手法は すでに提案されてきているが,本論では特に, 他者もまた学習している事までを考慮に入れて, 効率よく自分の目的を最大限達成しつつ他者との協調を行えるようにしている.

この事が重要な理由は,この設定は最近注目されている分野である Multi agent reinforcement learning, hierarchical reinforcement learning (learning to learnも 含まれる?), adversarial net等,複数ある目的関数を同時に最適化するタスク全てに 適用可能だからである.

ここで提案されているエージェントは他者がどのようなpolicyを持ちパラメータ更新を行うかを モデル化し,他者のpolicy及びlearning stepへどのように影響を及ぼしていけば, 最終的に自己のrewardを最大化できるかを考慮に入れる事が可能になる.

これにより,従来の他者を考慮に入れない同時最適化では到達出来ない ナッシュ均衡を実現していく事が可能になる.

ざっくばらんメモ_6:kaggle, C++のVisitor

kaggle Zillow challenge

前回まででresent based regressionが動くようになったので 今回はモデルのセーブとテストデータに対する予測を行えるようにする.

結果無事resnetベースの推論モデルによる予測ができるようになってきた ので早速ある程度学習してからテストデータで予測をしてみる.

ー結果改善はせず.スコア0.0688108,学習が足りないのかもしれない.  もう少し学習を続けてみる事にする

C++におけるVisitorの仕組み

Visitorという設計概念を用いることで,入力の型に限定されない汎用的な関数を設計する事が可能となる.

これはelementとvisitorクラスから成り立っている.

まず始めにベースクラスとしてのelementを作成.ここではaccept関数を宣言しておき またありえる各elementのtype毎のベース関数を定義しておく.

次にベースクラスとしてのvisitorを作成.visit関数を作成した全てのelement typeに対して作っておく.

続いて各elementにおいてaccept関数を定義し,引数として入ってきたvisitorクラスのvisit関数をコールするようにする.

そしてvisitor derivedなクラスを定義し,その中で具体的なvisit関数の定義を行う.

この時,visit関数は引数としてelementクラスをとるため,各elementクラスに対して定義が必要になる.

以上の設計において,クライアントはvisitor derivedなクラスのinstanceを作成し, それらはelementクラスのaccept関数の引数として用いられる.

ここでは,elementクラスのaccept関数で定義した通り,引数のvisitorクラスのvisit関数が実行されることになる.

結局,最終的に実行されるvisit関数はelement,visitorクラス双方に依存して動作を変化させられる.

この設計は,複数typeのelement/visitorを再帰的に適用したい場合などにおいて便利な設計になる.