高みを目指すブログ

都内近郊に住む暇を持て余した理系大学生が日常を綴るブログです。主なトピックは、勉強系では金融工学、人工知能、プログラミング、python、日常系では、色々なことを書いて行こうと思います。

機械学習とベイズ統計学

はじめに

本記事は機械学習ベイズ統計学の関係性を頭を整理するために個人的にまとめたものです。学部生の見解ですので、その辺を踏まえた上でご覧になってください。

機械学習とは?

wikipediaに概要がかなりよくまとまっていたので引用します。

センサやデータベースなどから、ある程度の数のサンプルデータ集合を入力して解析を行い、そのデータから有用な規則、ルール、知識表現、判断基準などを抽出し、アルゴリズムを発展させる。なお、データ集合を解析するので、統計学との関連が深い。 そのアルゴリズムは、第一にそのデータが生成した潜在的機構の特徴を捉え、複雑な関係を識別(すなわち定量化)する。第二にその識別したパターンを用いて、新たなデータについて予測を行う。データは、観測された変数群のとりうる関係の具体例と見ることができる。一方、アルゴリズムは、機械学習者として観測されたデータの部分(訓練例などと呼ぶ)を学習することで、データに潜在する確率分布の特徴を捉え、学習によって得た知識を用いて、新たな入力データについて知的な決定を行う。(https://ja.wikipedia.org/wiki/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92)

つまり機械学習とは、

  1. データが生成した潜在的機構の特徴を捉え(特徴抽出)、複雑な関係を識別し(モデルの学習)
  2. 識別したパターン(学習したモデル)を用いて、新たなデータについて予測を行う

ためのアルゴリズムやその過程のことを言います。これだけではいまいちピンとこない気がするので、もう少し具体的に見ていきましょう。


例えば、猫が写っている写真があるとしてコンピューターがこれを読み込み、猫が写っていると認識できるようなシステムを作りたいとします。まずはじめに、取り込んだ画像データを定量的に扱えるものにしなくてはなりません。方法は様々ですが、画像データが64×64ピクセルならば各ピクセルごとのRGB値などを利用するとしたら、少なくとも64×64次元のベクトルとしてデータを数値化できます。しかし、このままでは次元数が大きすぎるの*1で、うまく次元圧縮などをする必要性などが出てきます。詳しい方法は避けますが、概ねここまでのプロセスのことを特徴抽出と言います。

次はモデルの学習ですが、まずはどのモデルを使うかを選択しなければなりません。モデルの精度などはデータの種類により一長一短ですが、自分が対処している問題が、回帰問題なのか分類問題なのかである程度使うべきモデルを絞ることができます(まぁ半分以上のモデルは回帰も分類もどっちもできると思いますが笑)。先の猫の画像の例などは分類問題に当たります。モデルが選択できたら、データをフィッティングしてパラメーターをチューニングします。これがいわゆるモデルの学習です。特にこの段階で行われる学習は、教師ラベル(猫の画像の例なら、全ての画像データに対してそれぞれ猫が写っている、写っていないという情報のこと)が与えられた元でそれに近づけるようにパラメーターをチューニングするので教師あり学習と言います。逆の、教師ラベルの無い教師なし学習は前段階の特徴抽出の段階で行われることが多いです。

モデルの学習が終わったら、最後に新しいデータをモデルにインプットして帰ってきた出力をモデルがはじき出した将来予測とします。この一連の作業を機械学習と呼んでいるということです。

ベイズ統計学とは?

次にベイズ統計学について見ていきましょう。ベイズ統計学は数学的に難解なイメージが強いですが、大元は以下の一つのいたってシンプルな式に集約されます。

{ \displaystyle
P(A|B) = \frac{P(B|A)P(A)}{P(B)}\propto P(B|A)P(A)
}

みなさんご存知条件付き確率の計算式です。これを言葉で言い換えると「事後確率P(A|B)は尤度P(B|A)と事前確率P(A)の積に比例する」ということを意味しています。これがベイズ統計学の本質です。統計的に得られたデータをこの式に組み込んで、出力される事後確率から様々な意味を見出していきます。

では何故ベイズ統計学は数学的に難解なのか?尤度と事前確率が得られればすぐに事後確率を計算することはできず、ある一つの手順を踏むことになります。それは基準化定数を求めるという作業です。ちゃんと説明すると、上の式にある通り尤度と事前確率の積だけでは事後確率に比例するだけであり、イコールではありません。故に確率の和が1である(もしくは確率密度関数を全区間積分したら1となる)という性質を利用することで比例の度合い(これを基準化定数という)を計算する必要があります。この時に尤度と事前確率の積の確率分布を周辺化するために積分計算を行わなくてはなりませんが、これが積分値が解析的にも止まらない都合上計算不能に陥ることが多いです。従って、事後確率も解析的に与えられないので、なんとかサンプリングをしようとして考え出されたのがかの有名なマルコフ連鎖モンテカルロ(MCMC)だったりします。話がかなり込み入ってしまいましたが、要約するとベイズ統計学

  • 理屈自体はシンプルで、極論言うと条件付き確率の計算式を用いるだけ
  • しかし、すぐに解析的に計算不能に陥るので高度なサンプリング手法が必要になる

って感じになるかと思います。

機械学習の中に見るベイズ統計学

さてここからが本題の機械学習ベイズ統計学の関係についてですが、時間の都合上明日に回します。ごめんなさい笑

まとめ

*1:次元の呪いという問題があります。詳しくはまたいつか…

明日あたりに

機械学習ベイズ統計学の関係性について個人的に整理したいので、記事にまとめようと思います。 今日は所用でずっと作業してて疲れたのでもう寝ます。笑

明日からまた頑張ろう

JAFEE2日目

2日目の午前はボラティリティセッションでしたが、SVモデルとHawkes過程を組み合わせたStochastic Hawkes過程のベイズ推定はかなり興味が湧きました。拡散ジャンプ過程のジャンプ項をHawkes型のジャンプ項に置き換えるというのは自然な発想ですが、それを実際に組み込んできちんとベイズ推定を行なった研究は貴重だと思います。僕も後でじっくり予稿集を読んでみようと思いました。

他には、ポートフォリオ最適化のセッションで、複数ペアトレード戦略の論文の発表も面白かったと思います。ペアトレードは昔から知られる有名かつ有用な投資手法ですが、機関投資家などがこれを行おうとすると、流動性の問題などからペアの組数を複数に増やさなくてはなりません。こうした問題に直面した時にどのように考えれば良いかということに示唆を与えてくれるような内容でした。また、確率分布推定のセッションでは収益率分布の推定をより正確に行うGRTという手法に関する発表でした。実際、特定の銘柄の収益率分布の推定というのは難しい問題で、いくら過去のデータを多く利用してヒストグラムを描いてもそれはあくまでヒストリカルな分布であって、その分布にそぐわない予期せぬ変動というのは将来十分起こりうります。そうした時に、オプションの価格などから収益率を逆算?する形で投資家などの期待感を織り込んだ収益率分布を推定するというのは大変興味深いなと思いました。

その他色々面白い発表がありましたが、僕の学会レポートはこの辺にしときます。学会に参加したのは去年の夏ぶりの2回目ですが、やはりこういう場所で色々な発表を聞くとその学問領域の全体像みたいなものが浮き彫りになりますし、現状どういう課題に直面しているのかというのもわかるので、自分の研究のテーマ決めなどにとても役立つと思うので、行って聞きに行くだけでも有意義だと改めて思いました。またこれは金融系の学会特有の傾向ですが、実務家の方々も大変多く参加されていらっしゃるので、アカデミアでは聞けないような実務の生々しい部分なども垣間見ることができるのも面白いです。暇を持て余している僕みたいな大学生は是非一度学会に行ってみることをオススメします。(笑)

JAFEE1日目

学会1日目から面白い話がたくさん聞けました。午前は高頻度セッションでしたが多次元Hawkes過程を用いた注文到着過程の分析は非常に興味深かったです。近年ティックデータ分析でとりわけ板情報をちゃんと分析しようという流れがある中で、多次元Hawkes過程は非常に有用な手段であると改めて実感しました。特に今日の発表では、注文を買いor売り×成り行きor成り行き変化or指値orキャンセルの8種類に分類し、8次元Hawkes過程に当てはめて、さらにHawkesカーネルをノンパラメトリックに推定して相互作用を検証していたので、これをさらに突き詰めれば市場分析だけでなく高頻度のシステムトレードにも応用できる可能性があると思います。

信用リスクのセッションではHawkesグラフというHawkes過程の応用システムを用いて企業の倒産リスクの伝搬構造を視覚化する研究も面白かったです。指数型減衰カーネルを用いたパラメトリック推定とノンパラメトリック推定を比較していましたが、どうやらノンパラの方がよりよくHawkesグラフを再現できるようです。また創業企業の信用リスクモデルの研究は創業企業には財務データが存在しないという縛りの元で、どのように信用リスクを計量すべきかという問題に対し、発表者が働いている日本金融政策金庫の融資データなどを利用した分析も素晴らしかったです。また創業企業の信用リスクを説明する要素として、インターネットデータなどのテキストマイニングを利用できる可能性を示唆してくれたのは面白そうだと思いました。

その後のFinTechセッションでは東大システム創成の和泉さんの貴重なお話が聞けました。今の人工知能で市場予測はどのくらいできるのかという話では、人工知能は過去のパターンを見つけ出すことは得意だが、構造の変化に弱いといったことをおっしゃっていました。その理屈だと、マイナス金利導入、UKのEU離脱、大統領選挙と様々なイベントがあった2016年は人工知能を使ったトレードにおいては厳しい年であったかもしれませんね。また、人口市場でのシミュレーションの有効性も和泉さんの話とその後の研究報告でとても納得できました。

明日はSVモデルのベイズ分析やポートフォリオの話がありますが、それも楽しみです。

明日学会行ってきます

明日、JAFEE(日本金融・証券計量・工学学会)の冬季大会に参加してきます。事前のパンフレットでかなり興味の湧くトピックをたくさん目にしたので、結構楽しみです。学会の内容をここでも簡単にレポートできたらと思います。

macに買い換えた話

もうかれこれ2ヶ月くらい前に自分のノートpcをmacbook proに買い換えた。大学に入ってからpcは買わずに親父のおさがりのだいぶ古いレッツノートを使っていたが、何かと不便が多かったので親からの支援金とバイト代で大学3年の秋にしてようやく新品のパソコンを手に入れたのだった。

それからというもの、色々な作業が何かと捗るようになった。特に、pythonを使ったデータ解析や機械学習などの実装を行うときは、インストールが必要なモジュールがかなり楽に入れられるようになり、大いに助かっている。windowsコマンドプロンプトとは違って、macのターミナルはunixであることが大きいらしい。mac自体のuiも大変気に入っており、もともとipadなどをよく使っていたせいもあるのか操作はすぐに慣れ 、非常に快適に使わせてもらっている。スタバでドヤ顔macとはよく言ったもので、macを使っていると自分がスマートになったかのように錯覚するような何かがあることも納得できる。

ちなみにうちの某大学はmac利用者が異常に多い。理工学部はそうでもないが文系学部は半分以上はmac利用者である。意識高い系の嗜みとしてmacを使っているか、本当にお気に入りで使っているかは置いておいて(笑)

pythonでYahoo!ファイナンスのニュース記事をスクレイピングする(1)

はじめに

近年、機械学習ビッグデータ人工知能分野の実務への応用が急速に増してきており、webの数値データを利用したりテキストを分析することでマーケティングに生かそうとすることが当たり前のように行われるようになった。また研究に於いても、web上の記録やデータから人間行動を解き明かそうとする研究が盛んに行われている。そうした中で必須となっているのが、web上のデータをプログラミングで抽出する「クローリング」や「スクレイピング」と言った技術である。

今回の記事では、スクレイピングの最も基本的な部分を実際のpythonコードを示すとともに紹介する。

何故pythonなのか

スクレイピングに関する本は多く出版されていると思うが、その多くはpython言語で記述されている。何故スクレイピングと言えばpythonなのか?これは1つに強力なサードパーティーライブラリの存在が大きいと思う。具体的にはrequests、Beautiful Soup等のライブラリを駆使するだけで、簡単にスクレイピングが可能になる。そして収集したデータをそのままpandasを使って整形しcsvに出力できることもできる。まぁとにかくpythonでやると大変楽ができるのである。スクレイピングの主な流れは以下のようである。

  1. google chromeの検証機能を使って取りたいデータの在りかを特定する
  2. requestsを使ってhtmlのテキストを取得する
  3. Beautiful Soupを使ってhtmlを解析する
  4. 必要な情報のみを切り抜く

google chromeの検証機能を使って取りたいデータの在りかを特定する

まず、スクレイピングしたいソースを確認する。今回は以下のニュース記事の本文のテキストをスクレイピングすることを目標とする。 f:id:aifinance:20170213233627p:plain スクレイピングしたい部分をドラッグして選択し、右クリックから検証を押すと次のようにhtml内のどの部分に本文があるかが特定できる。 f:id:aifinance:20170213234207p:plain 今回はclass=“ymuiContainerNopad clearFix s170"のdivの中に本文があることがわかる。

requestsを使ってhtmlのテキストを取得する

目的のテキストの在りかがわかったところで、次にrequestsを使ってhtmlのテキストをとってくる。

url = 'http://news.finance.yahoo.co.jp/detail/20170213-00000381-jijf-bus_all' # スクレイピングしたいサイトのURL
res = requests.get(url) # requestsのgetメソッドを使ってレスポンスを得る
html = res.text # 得られたレスポンスをtextに変換する

これで、htmlのテキストをとってくることができた。

Beautiful Soupを使ってhtmlを解析する

次にBeautiful Soupを使うがこれは以下の1行で済む(超簡単!)。

soup = BeautifulSoup(html, "html.parser")

必要な情報のみを切り抜く

最後に必要な部分のみの情報を切り抜いたらお仕舞いだが、実はここが一番面倒臭いときもある。

text_div = soup.find('div', {'class': 'ymuiContainerNopad clearFix s170'}) # 目的のテキストのあるブロックを切り抜く
text_div.get_text() # テキストのみを抽出
text = text_div.get_text().replace('\n', '') # \nを取り除く
text = text.replace('\u3000', '') # \u3000を取り除く

まとめ

以上のコードをまとめると以下のようになる。

import requests
from bs4 import BeautifulSoup

url = 'http://news.finance.yahoo.co.jp/detail/20170213-00000381-jijf-bus_all' 
res = requests.get(url) 
html = res.text [f:id:aifinance:20170214162021p:plain]
soup = BeautifulSoup(html, "html.parser")
text_div = soup.find('div', {'class': 'ymuiContainerNopad clearFix s170'})
text_div.get_text()
text = text_div.get_text().replace('\n', '')
text = text.replace('\u3000', '')

print(text)

結果は以下の通り。 f:id:aifinance:20170214162021p:plain 確かに、目的のテキストを文字データとして抽出することができた。 ここから色々遊ぶためにはMeCabにぶち込んで形態素解析したり、文字データを特徴ベクトル化したりなどの前処理が必要だがそういった込み入った話はまた次回以降に繰り越すことにする。