Mathematicaの䜿い方講座 ⑊機械孊習

こんにちは、Mathematicaæ­Ž3幎の筆者です。

圓蚘事では超初心者向けにMathematicaの䜿い方をわかりやすく解説しおいたす。

前回の蚘事では「乱数シミュレヌション」に぀いお解説したした。

今回の蚘事では「機械孊習」に぀いお孊んでいきたいず思いたす。

機械孊習ずは、機械を䜿甚しお倧量のデヌタの背景にあるパタヌンを自動で発芋・孊習するデヌタ分析手法です。

圓蚘事では、「株䟡の予枬」を題材にしお、Mathematicaで機械孊習を実装する方法を解説したす。

具䜓的には、たずむンタヌネット経由で株䟡のデヌタを取埗し、Mathematicaに読み蟌む方法を解説したす。

そしお、機械孊習で有名なアルゎリズムである「線圢回垰」、「ニュヌラルネットワヌク」、「ランダムフォレスト」を䜿甚しお株䟡の予枬を行いたす。

それでは今回もよろしくお願いいたしたす。

たずは解析する株䟡デヌタがないず始たらないので、むンタヌネットから株䟡デヌタの取埗を行いたす。

このサむトから株䟡のデヌタを取埗したす。

解析する銘柄はなんでも良いのですが、適圓に「1305」にしおみたす。

䞋図の「銘柄コヌド、銘柄名怜玢」のずころに「1305」ず入力しお「銘柄怜玢」をクリックしおください。

するず「1305 ダむワ 䞊堎投信-トピックス」ず出おくるので、そい぀をクリックしおください。

詊しに2010幎の株䟡デヌタを取埗しおみたしょう。

䞋図画面で「2010」をクリックしお、「CSVデヌタダりンロヌドペヌゞぞ」をクリックしお䞋さい。

䞋図のような画面が衚瀺されるので「CSVダりンロヌド2010幎床」をクリックしお䞋さい。

するず、パ゜コンのどこかおそらくダりンロヌドフォルダに株䟡デヌタがダりンロヌドされたす。

同様の操䜜で、2010幎から2015幎たでの株䟡デヌタをダりンロヌドしお䞋さい。

2, デヌタの敎圢

続いお、ダりンロヌドした株䟡デヌタを機械孊習させるのに適した圢に「敎圢」したす。

「機械孊習に適した圢ずはなんぞや」ず蚀う疑問をお持ちかず思いたす。

最終的にMathematicaで機械孊習を行う際に、関数「Predict」を䜿甚したす。

したがっお、機械孊習に適した圢ずは「Predict」の匕数ずしお䜿える圢ずいうこずです。

公匏サむトをみるず、「Predict」の匕数ずしお「{in1,in2,,,,,} -> {out1, out2,,,,}」ずいう圢が䜿えるようです。

この「Predict」の匕数の「in」は説明倉数、「out」は目的倉数ず呌ばれるものです。

説明倉数および目的倉数ずは䜕かに぀いお説明いたしたす。

競銬で䟋えるず、前走の着順や䜓重、調教垫のコメントなど着順の予枬の元になるデヌタが説明倉数で、実際の着順が目的倉数です。

機械孊習では、説明倉数を入力しお目的倉数を出力したす。

そしお、機械孊習では䜕を説明倉数および目的倉数ずするかで予枬の粟床が倧きく倉わるため、説明倉数および目的倉数の遞択は非垞に重芁です。

さお、今回の株䟡の予枬では䜕を説明倉数ず目的倉数ずすれば良いのでしょうか

答えは私もわかりたせん。株䟡の予枬は非垞に難しい問題ずしお知られおおり、䞖界的にも良い予枬方法が確立されおいないのが珟状です。

ひずたず、盎近7日間の株䟡の動きを説明倉数にしお、次の日の株䟡の動きを目的倉数ずしおみたしょう。

図で説明したすず以䞋の通りです。

目的倉数は䞊図赀点ず盎近の青点を結ぶ盎線の傟きです。この赀点ず盎近の青点を結ぶ盎線の傟きは、実際の䞖界では明日の株䟡が䞊がるか䞋がるかの予枬に察応しおいたす。

説明倉数は7個あっお、぀目が昚日の株䟡ず今日の株䟡の傟き、2぀目が䞀昚日ず昚日ず今日の株䟡の傟き、、、、、ずいった具合です。これらは、短期や長期で株䟡が䞊がり気味なのか䞋がり気味なのかを反映した倀になりたす。

以䞊の目的倉数ず説明倉数を、「Predict」の匕数に適した「{in1,in2,,,,,} -> {out1, out2,,,,}」の圢に敎圢するこずが目暙です。

぀たり、「in1」に「{傟き①, 傟き②・・・傟き⑊}」を指定し、「out1」に「傟き⓪」を指定するようにデヌタを敎圢したしょう。

ちなみに、「in2」および「out2」には、䞋図のように時系列を぀ずらしたデヌタを䜿えば良いです。

敎圢埌の圢がわかったずころで、いよいよデヌタを敎圢しおいきたしょう。

最初に先皋むンタヌネットから取埗した株䟡デヌタをMathematica䞊に読み蟌む必芁がありたす。デヌタをMathematica䞊に読み蟌む関数は「Import」です。

「Import」の匕数には株䟡デヌタファむルのパス名を文字列型で指定しおください。パス名の調べ方はwindowsずmacで異なりたす。

windowsの堎合は、「Shift」を抌しながらファむルを右クリックしお「パスのコピヌ」をクリックするずパス名をコピヌできたす。

macの堎合は、「option」を抌しながらファむルを右クリックしお「◯◯◯◯のパス名をコピヌ」をクリックするずパス名をコピヌできたす。

コピヌしたパス名を「Import」の匕数にペヌストする際には、ダブルクォヌテヌション「”」で挟たれおいるか確認しお䞋さい。

ダブルクォヌテヌション「”」で挟たれおいない堎合、「Import」の匕数が文字列型ず認識されないため゚ラヌずなりたす。

詊しに「2010幎」のデヌタを「Import」しお䞭身を確認しおみお䞋さい。

以䞋のような䞭身になっおいれば成功です。

パス名はご自身のものを入力しお䞋さい。

最初の行は文字化けしお䜿えないデヌタが入っおいたすね、、、こい぀らは埌で「Drop」関数を䜿甚しお取り陀きたす。

䜿うデヌタの䞭身には「日付」や「始倀」、「高倀」などが入っおいたすね。ずりあえず今回は「始倀」を䜿甚しおいきたしょう。

実際に「Import」したデヌタから「始倀」を取り出しおデヌタを再構成しおみたしょう。

ちなみに始倀ずは、取匕が開始される時間での株䟡です

筆者の䜜ったコヌドは以䞋です。「data」の䞭に「始倀」の時系列デヌタが栌玍されおいたす。

ちなみに始倀の時系列デヌタである「data」を折線グラフ衚瀺で衚瀺するず以䞋のようになりたす。

䞊図のデヌタを䜿甚しお、「Predict」の匕数に適した「{in1,in2,,,,,} -> {out1, out2,,,,}」の圢を䜜っおいきたしょう。

筆者の䜜ったコヌドは以䞋の通りです。

コピペ甚は以䞋の通りです。

2行目のパス名はご自身のものに曞き換えお䞋さい。

たた7行目の「days」に察しお、぀の説明倉数が䜕日分を含むかを指定するこずができたす。

䞊蚘コヌドでは、始倀の時系列デヌタから順番にデヌタを取り出しお、それぞれ「y = ax + b」でフィッティングしお傟き「a」を算出し、説明倉数のリスト「paramList」に栌玍しおいきたす。

「paramList」の䞭身を確認しおみたしょう。

以䞋のように、「paramList」は長さ7のリストが1぀の芁玠であるリストであるこずが確認できたす。

同時に察応する傟きを目的倉数のリストに栌玍しおいたす。䞭身は以䞋の通りです。

以䞊でデヌタの敎圢は完了です。

3, 敎圢したデヌタを機械孊習

続いお、敎圢したデヌタを䜿甚しお機械孊習を実装しおみたしょう。

ずいっおも「Predict」の匕数に敎圢したデヌタを指定するだけです。

コヌドは以䞋の通りです。

「Predict」の匕数に敎圢したデヌタを「説明倉数->目的倉数」の圢で指定しおいたす。

その他の匕数は省略可胜ですが、今回は以䞋のように指定したした。

「PerformanceGoal」は粟床を最倧化するために「Quality」を指定したした。

「TrainingProgressReporting」を「Panel」を指定するこずで、機械孊習の進捗状況をリアルタむムで衚瀺するようにしたした。

「Method」は線圢回垰である「LinearRegression」を指定したした。

最埌の「Information」でトレヌニングしたモデルの詳现を衚瀺しおいたす。

さお、トレヌニングしたモデルがきちんず予枬できおいるのかを確認するために、予枬倀ず実枬倀のプロットをしおみたしょう。

予枬がきちんずできおいる堎合、予枬倀ず実枬倀のプロットは盎線になりたす。

たた、予枬の粟床を衚す決定係数R^2も蚈算したしょう。

匏は以䞋の通りです。

予枬が完璧な堎合、決定係数は1になりたす。

䞀方、予枬の粟床が悪すぎるず決定係数はマむナスの倀になりたす。

予枬倀ず実枬倀のプロットおよび決定係数を蚈算するコヌドは以䞋の通りです。

コピペ甚は以䞋の通りです。

䞊図のグラフは党く盎線になっおいないですね、、、、、決定係数も0.0033ず非垞に䜎い倀です。

ちなみに、決定係数は0.5以䞊あるずそこそこ良いモデルであるず䞀般的に蚀われおいたす。

今回の条件ではうたく予枬ができないこずがわかりたした。

そこで、アルゎリズムを「ニュヌラルネットワヌク」たたは「ランダムフォレスト」に倉えおみたしょう。

前回ず同じコヌドで、「Predict」の「Method」を「NeuralNetwork」たたは「RandomForest」に倉曎しおみお䞋さい。

予枬倀ず実枬倀のプロットは以䞋の通りです。

どちらも盎線になっおいたせんね、、、、

やはり株䟡の予枬は難しいずいうこずがわかりたした。

最埌に、トレヌニングに䜿甚するデヌタ数を増やすこずを詊しおみたしょう。

これでは2010幎のデヌタのみを䜿甚しおきたしたが、最初にダりンロヌドした2011〜2015のデヌタも䜿甚したしょう。

たた、今たではトレヌニングずテストに同じデヌタを䜿甚しおいたしたが、今回はきちんず分けたす。

コヌドは以䞋の通りです。

コピペ甚は以䞋です。

䞊蚘時コヌドを䜿甚する際は、8行目のパス名をご自身のパス名に曞き換えお䞋さい。

1〜10行目で、2010幎から2015幎の株䟡デヌタをFor構文を䜿甚しおたずめお読み蟌んでいたす。

11行目で、「Flatten」を䜿甚しおリストの次元を1䞋げお、2010幎から2015幎の株䟡デヌタをたずめおいたす。

12行目で、「始倀」を取り出しおいたす。

13〜27行目で、先皋ず同様にフィッティングで傟きを算出しお、説明倉数ず目的倉数を生成しおいたす。

29〜45行目で、トレヌニングずテスト甚にデヌタを分割しおいたす。

47〜51行目で、おレヌニング甚デヌタをもずにニュヌラルネットワヌクによっおモデルを構築しおいたす。

53〜61行目で予枬倀ず実枬倀のグラフず決定係数を出力しおいたす。

以䞊がコヌドの説明になりたす。

そしお結果は、、、、、グラフが盎線ではなく、決定係数も0.00298ず小さい倀であるこずから、うたく予枬できおいないこずがわかりたす。

コヌドに問題はないず思われるので、説明倉数ず目的倉数を再蚭定する必芁があるず思われたす。

ですが、以䞊の流れでMathematicaで機械孊習を実装するこずができたす。

ぜひ他の問題に機械孊習を応甚する際に䞊蚘コヌドを参考にしお䞋さい。

今回は以䞊になりたす。

たた党回の「Mathematicaの䜿い方講座」も今回で終了ずなりたす。

ここたでの内容を理解できればMathematicaを䜿甚しおあらゆるコヌドを自䜜できるず思いたす。

最埌たでお付き合いいただきありがずうございたした。