ベイズ推定と最尤法

こんにちは。

今日は多項式回帰を通じてベイズ推定最尤法について話していきたいと思います。

 

まず準備したダミーデータはこちら

f:id:ois-blog:20191217170046p:plain

ダミーデータと真の分布

青い点が今回観測された(とする)データです。

本来はオレンジの曲線上に乗るはずのデータが、なんらかのノイズによりずれてしまっていると考えます(実際は意図的にずらしました)。

 

さて、多項式回帰を使って、観測された青い点からオレンジの曲線=真の分布を予測しようという試みます。

 

多項式回帰とは

y=w_0+w_1x+w_2x^2+...+w_nx^n

の形で真の分布を予測するものです。

本来はモデルエビデンスの評価によって何次式になるか予想するのですが、今回は10次式で固定します。

あとは観測されたデータからw_0〜w_{10}を学習するだけ。

 

まずは最尤法を試してみましょう。

観測値と予測値のずれが最小になるようにします。

解析的に解けるのですが、途中計算は割愛します。

w=(X^TX)^{-1}X^Ty

Xとyが観測データです。この数式に観測データをあてはめてグラフを描いたのがこちら

f:id:ois-blog:20191217172813p:plain

最尤法グラフ

大まかには形を捉えていますが、細かいところでグニャグニャと曲がりノイズまで学習してしまっています。

その代わり全ての観測データを通っています。

今回はそこまでひどくありませんが、学習データに適合しすぎて真の分布とはかけ離れてしまうことを過学習と言います。

最尤法は過学習を起こしやすいという点があります。

 

今度はベイズ推定をしてみましょう。

ベイズ推定の場合は最尤法と違い重みwを一つの値として求める(点推定)ではなく、確率分布として求めます。

ベイズの定理により観測データを学習した重みwの事後分布と、重みwを固定した時のyの分布を掛け算すれば、yとwの同時分布になります。

これをwについて積分消去(周辺化)することで、あらゆるwをその確率を考慮して重み付けしたyの分布が求まります。

これが予測分布です。

今回は重みwの分布としてガウス分布を使用したので解析的に予測分布を求めることができ、スチューデントのt分布になります。

その期待値をグラフ化したのがこちら

f:id:ois-blog:20191217174028p:plain

ベイズ推定グラフ

微妙にずれてはいますが、最尤法のようにグニャグニャと曲がってはいません。真の分布をよく捉えていると思います。

 

ベイズ推定の良さが少しでも伝わったでしょうか?

ベイズ推定の理論についてはかなりはしょった書き方になってしまいましたが、今回伝えたかったのは

 

最尤法→簡単だが過学習しやすい

ベイズ推定→やや難しいが過学習を起こしにくい

 

です。

 

〜統計検定2級 合格記〜

こんにちは。

今日は統計検定2級を受けた時のレポを書きたいと思います。

 

統計検定2級を受けるにあたってまず最初に勉強したのが、

 

統計学入門 東京大学出版会

 

言わずと知れた”赤本”です。

文体はやや硬いものの、高度な数学は使っておらず、目で追うだけでさらさら読めました。

念のため2回読んだのですが、やはり2周するとかなり理解度が上がります。

 

そして公式テキストで過去問を解きました。

 

1回目 55%

2回目 65%

3回目 75%

4回目 80%

 

と順調に正答率は上がったのですが、その後は70〜80%の間で伸び悩み、

6割で合格とはいえ少し不安でいました。

 

そこで、評判はめちゃくちゃ悪いのですが、標準テキストを購入。

ほぼ1日で読みました笑

最後の方は少し難しかったので試験に関連する部分だけつまみ読み。

評判の割には読みやすく内容も濃いいい本だったと思います。

(改訂されたからかも?)

 

過去問(6回分)をほぼ2周していざ試験。

 

今回受けたのはCBT方式の試験で、パソコンスクールで受験しました。

 

90分 32問(過去問の筆記試験は34,35問でした)

 

序盤は表やグラフの読み取りなど割と簡単で地味な問題が続きます。

中盤になると確率や確率分布の問題(計算ミス注意)。

終盤は区間推定や検定、回帰分析でした。

 

序盤→中盤→終盤 と確実に難易度が上がっていきます。

そして終盤になるともう疲れてくるので問題文読むのもしんどいです‥

 

それでもなんとか最後まで解き、結果は‥

 

88点(合格点は60点)

 

まさかの初見の問題では自己ベストでした笑

 

やはり資格に向けて勉強すると成長を感じます!

これからもG検定や統計検定1級など、チャレンジしていきたいですね!

リッジ回帰と正則化

こんにちは!

今日は正則化について扱っていきます。

前回FXデータに対して重回帰分析を行いましたが、重みはさほど大きくなりませんでした。これはもともとのデータが直線的だったからです。

 

しかし一般的にデータが直線的であるとは限らず、すると重みがとても大きい値になることがあります。これを過学習と呼びます。

 

過学習してしまうと、学習データにはよく当てはまるのですが、未知のデータに対する予測精度は下がってしまいます。

 

そこで過学習を防ぐために重みが大きくならないようにするのが正則化です。

正則化された回帰分析はラッソ回帰リッジ回帰が有名ですが、ここでは実装が簡単なリッジ回帰を行うこととします。

 

まずはこちらの画像、

f:id:ois-blog:20191205094929p:plain

観測されたデータと真の分布

青い点が観測された10個のデータ

赤いラインは本来観測されるべき真の値です。

このようにデータを観測すると誤差がでます

 

誤差のあるデータから本来の分布を探し出すのが回帰分析です。

 

まずは普通に多項式回帰をしてみます。

あえて過学習しやすいように9次の多項式回帰です。

結果がこちら

f:id:ois-blog:20191205103244p:plain

正則化なしの回帰分析

赤い線が正解、緑が回帰分析で予測した曲線です

青い点(観測データ)は全て通っているものの、赤い線をうまく捉えているとは言いづらいです。

 

そこで正則化をして重みの絶対値を小さい値に抑えてみました。

するとこちら

f:id:ois-blog:20191205103519p:plain

正則化した回帰分析

多少のズレはあるものの赤い線の特徴をだいぶ捉えているのがわかります。

観測データの外れ値は無視されていますね。

 

 

FXを機械学習!〜重回帰分析〜

こんにちは!

 

前回はFXデータの単回帰分析を行いました。

今回は重回帰分析を行なっていきたいと思います。

 

単回帰分析と違うところは、説明変数が複数あるところです

 

単回帰分析では、

目的変数 円/ドル

説明変数 先月の円/ドル

としましたが、

 

今回の重回帰分析では、

目的変数 円/ドル

説明変数 円/ドル、円/ユーロ

としました。

 

CSVから読み込んだデータがこちら

f:id:ois-blog:20191202104218p:plain

CSVデータ

これを3次元グラフに表すと、

f:id:ois-blog:20191202104313p:plain

3次元散布図

わりと直線状に分布しているのがわかりますね。

 

ここで重回帰分析を行なっていきます。

単回帰分析では直線で予測グラフが表されましたが、重回帰分析では平面(または超平面)で予測グラフが表されます。

 

今回は説明変数2つでの重回帰分析なので、

y=w_0+w_1x_1+w_2x_2

という式で表されます。

x1は先月の円/ドル、x2は先月の円/ユーロです。

w0,w1,w2は学習された重みです。

 

学習の結果、

w_0=3.70254341

w_1=0.98374897

w_2=-0.01556721

となりました。

 

グラフ化すると、

f:id:ois-blog:20191202105317p:plain

予測グラフ

アングルの問題で平面に見えづらいですが、きれいにデータにそったグラフが描かれているのがわかります(オレンジが平面)。

 

また、予測精度であるMSEは

MSE=7.524662088736376

となり、単回帰分析の時より精度が上がっているのがわかります。

 

FXを機械学習!〜単回帰分析〜

こんにちは!

今日からFXのデータを使って色々なアルゴリズムを試してみた結果を記事にしていきたいと思います。

 

初回は線形回帰の基礎の基礎、単回帰分析です。

回帰分析というのはざっくりいうと数値を予測するアルゴリズムです。

その中で最もシンプルなのが単回帰分析です。

 

予測したい数値データのことを目的変数と言います。

予測のために使うデータ説明変数と言います。

 

単回帰分析は目的変数1つ、説明変数1つの簡単な線形回帰分析です。

 

今回は

目的変数→円/ドル

説明変数→先月の円/ドル

として単回帰分析してみました。

 

まずはpandasでcsvを読み込みます。

f:id:ois-blog:20191127111559p:plain

FXデータ

 

1月前のデータを準備します。

f:id:ois-blog:20191127111659p:plain

データ加工後

 

この時点で散布図を書くと下のようにほぼ直線状にデータが並んでいますね。

これは単回帰分析でもそこそこの成果が期待できそうです。

※単回帰分析は直線の予測グラフです

f:id:ois-blog:20191127111847p:plain

先月データと当月データの散布図

 

そして単回帰分析を実行してみました。

予測のグラフは

 

y=w_0+w_1x

 

で表されます。w0やw1は重みと言って、この重みをデータから学習します

単回帰分析を実行したところ、

 

w_0=2.6093959201067203

w_1=0.975487319458586

 

となりました。

 

予測グラフを図示してみましょう。

f:id:ois-blog:20191127113102p:plain

予測グラフ

オレンジの直線が単回帰分析でもとめた予測グラフです。

データによくフィットしていますね。

 

ちなみに線形回帰の精度には平均二乗誤差(MSE)がよく使われます。

今回のMSEは、

f:id:ois-blog:20191127113310p:plain

MSE

この数値でした。

悪くはない結果だと思います。

 

以上、単回帰分析でした!

 

機械学習自動化ツール 〜回帰編〜

前回の記事で機械学習自動化ツール〜分類編〜を扱いました。

そこで今回は〜回帰編〜です。

 

回帰というのは簡単に言ってしまえば数値の予測です(分類はカテゴリの予測でした)。

 

では今回の自動化ツールを使って回帰による予測をしていましょう。

f:id:ois-blog:20191120090217p:plain

学習データ

前回と同様の学習データです。

全ての項目のデータが揃っています。

 

f:id:ois-blog:20191120090430p:plain

予測用データ

こちらが予測用のデータ。身長のデータだけありません。

ここから

 

性別、体重、年齢 → 身長

 

の予測を行なっていきます。

 

この2つのデータを機械学習自動化ツールにインプットしてみましょう。

 

結果がこちら。

f:id:ois-blog:20191120090849p:plain

身長の予測結果

 

なんとも言えない結果ですね。当たっているような当たっていないような。

ちなみに「男」に1.0と入っているデータは男で、「女」に1.0と入っているデータは女です。この辺はUIを改善した方が良さそうですね。

 

特徴量の影響度合いは、

f:id:ois-blog:20191120091622p:plain

特徴量の影響度合

意外なことに年齢が大きく影響していました(個人的には体重の影響が大きいのと持ってました)。

 

正解率は、

f:id:ois-blog:20191120091754p:plain

正解率

ほぼ6割のなので悪くはないですが、分類の時よりは劣ってますね。

 

最後に各アルゴリズムの比較結果です。

f:id:ois-blog:20191120092008p:plain

アルゴリスム比較結果

今回はサポートベクターマシンはふるわなかったようですね。

線形回帰に正則化項をを使いしたリッジ回帰が一番でした。

ラッソ回帰正則化項を入れるという点では同じなのですがかなり引き離されています。

 

回帰に関してはまだ改善の余地があるかな、という状態です。

オリジナルのアルゴリズムを入れることなども検討していきたいと思います。

機械学習自動化ツール 〜分類編〜

初めまして。

オリエンタル情報システム、データサイエンティストの”たけまる”です。

今日から機械学習データ分析まわりの記事をかいていきますので、たまにみていただけると嬉しいです。

 

ということで早速機械学習の話題。

最近データサイエンティストの不足にともない、機械学習自動化ツールが流行っています。ということで当社でもプロトタイプを作ってみました。

 

対応しているのは教師あり学習で、

分類 → カテゴリの予測

回帰 → 数値の予測

 

とりあえずsklearnにあるアルゴリズムだけで対応してます。

 

では実際に分類の予測をしていきましょう(次回は回帰の予定)。

f:id:ois-blog:20191115092212p:plain

学習データのCSV

上のような学習データCSVで用意しました。

このデータを学習させて、

 

身長、体重、年齢 → 性別

 

の予測をしていきたいと思います。

 

予測用のデータはこちら。

f:id:ois-blog:20191115092622p:plain

予測用データのCSV

性別のところが抜けているのがわかります。

その他のデータも学習データとは違う値になっています。

 

この2つのCSVをインプットして予測させてみましょう。

 

結果がこちら。

f:id:ois-blog:20191115093008p:plain

性別の予測結果

かなり妥当な結果が得られていると思います。

 

それぞれの特徴量がどれだけ影響しているかもわかります。

f:id:ois-blog:20191115093253p:plain

特徴量の影響度合

そして正解率です。

f:id:ois-blog:20191115093405p:plain

正解率

かなり高い数値が出ています。

 

最後に各アルゴリズムの比較結果です(上の結果はベストなアルゴリズムの結果)

f:id:ois-blog:20191115093628p:plain

アルゴリズム比較結果

圧倒的にサポートベクターマシン(SVM)でした。

 

データによって適切なアルゴリズムは違います。

さらにいうとアルゴリズムを設定した上でハイパーパラメータのチューニングも行うことで高い精度が得られます。

それらは普通データサイエンティストがデータの形状から判断したり試してみたりするのですが、そのフローを自動化したのがこのツールです。

汎用性が高い分、オリジナルでアルゴリズムを組むよりは精度は劣るかもしれませんが、データをインプットするだけで予測できるので、手頃に機械学習ができるという大きな強みがあります。