ホールドアウト検証を使って最適な近似モデルを選択するこの広告は、90日以上更新していないブログに表示しています。ホールドアウト検証を使って最適な近似モデルを選択するバグでベクトルに同じ値が入ってしまって、そのバグとりにめっちゃ時間がかかっていたのは内緒。「プログラマーじゃない人が始める人工知能」の各記事はこちら。【目次】データを分割するホールドアウト検証する最適な近似モデルを用いて予測するデータを分割する前回の記事で、架空会社のアクセス数はweek3.5以降くらいから急激に伸びていることを知ったオライリー先生と私。直線の近似モデルではweek3.5以降のデータを上手く適合できていないのが見てとれるため、"いつの時点で100,000件を超えるのかを予測する"という目的を達成できそうにない。次数を増やした近似モデルを複数用意する各モデルの精度を比較して最適な近似モデルを選択するという作業を実施していく。最初にweek3.5以前のデータを捨ててしまおう。week3.5以降にサービスが急拡大しているようなので、それ以降の伸びを予測するためには、以前のデータは不要なのだ。y[inflection:]変数inflectionには、3.5週間を時間に直した値を入れる。SciPyの記法"[数値:]"を使って、数値より後の値のみを格納した配列を作成する。ちなみに、"[:数値]"と書けば数値より前の値のみを格納した配列を作成できる。ホールドアウトの準備にとりかかる。手元にあるデータのうち、ある一定の割合をテストデータとし、残りのデータを訓練データとする。訓練データのみを用いてモデルを構築し、モデルで予測したデータをテストデータと比較してモデルの精度を検証する。すれば、手元にあるデータだけを使ってモデルの精度を検証できる。1次関数の近似モデルの他に、2次、3次、10次、100次と次数を増やした近似モデルを追加して、その中から精度高いモデルを検証、選択する。データのうち、30%をテストデータ。残り70%を訓練データとしよう。3割くらいをテストデータにするのが一般的のようだ。sorted(shuffled[split_idx:])split_idxに3.5週以降のデータの値の数に30%を乗算した値をいれる。ちなみに、データの全数は735、3.5週以降の数は147、そのうち30%は44.1だ。int()で整数に直すと44。shuffledには3.5週以降のデータをSciPyのランダム関数でシャッフルした配列を入れる。シャッフルした配列から44個の値をtestに、残りをtrainに入れる。ホールドアウト検証するデータの準備が整ったので、各次数の近似モデルを構築しよう。polyfitにはtrainの配列のみをわたす。sp.poly1d(sp.polyfit(xa[train],ya[train],100))polyfitでは最後の引数で次数を指定する。1なら1次、10なら10次。関数ごとpoly1dの引数にわたしてあげると、近似モデルの式をさっくり作ってくれる。これらの近似モデルにアクセス件数を予測させ、実際のアクセス件数と比較することで、モデルの精度を検証したい。近似モデルの予測値と実際の値の誤差を定義しよう。sp.sum((f(a)-b)**2)f(a)がモデルが予測した値、bが実際の値だ。その差を計算して、二乗すれば、絶対値を求められる。さあ、これで準備万端。各予測モデルのアクセス件数と実際のアクセス件数を出力しよう。xa[test],ya[test])))モデル毎にprintしていけば初学者にもわかりやすいのだが、短く美しいコードを目指すオライリー先生がループ文を使いたいそうなので、その意向に従う。[fbt1...]と変数の分だけループしなさいよと宣言。"Error..."文に続けて、fbt1~100の変数をerrorに渡して計算された値を表示する。13058974.793724当該データの量では100次の近似モデルが構築できず、次数が53になっているが、まあ、これはスルーしよう。conditioned"なる警告が出ているが、これも、まあ、スルーしよう。(※原因はイマイチ分からず。直し方をご存じの方がいらっしゃればコメントください)近似モデルを用いて計算した値と実際の値の差が小さければ小さいほど、精度が高いといえる。結果を見ると、次数2のモデルの誤差が一番小さい。乱数が使われているので、実行の度に値が変化するが、大抵の場合、次数2が優秀だ。最適な近似モデルを用いて予測するというわけで、次数2の近似モデルが一番良さそうなことが分かった。次数2の近似モデルを使用して、"いつの時点で100,000件を超えるのかを予測"しよう。100,000という値を代入して方程式を解けばよいのだが、Pythonではfsolveという関数を使う。reached_max[0])プログラムを実行すると、大体、week9.8くらいというメッセージを得られる。結論を得た!架空会社はおよそweek9.8くらいの時点で100,000件のアクセスに到達する。架空会社の情報システム部は胸をなでおろし、"week9.8まで"を目標にインフラの増強計画を進めていけばよい。今がweek4が終わったところだから、時間はあと1か月ちょっとしかないんだけど、たぶん何とかなるよね。今回書いたコードは以下の通り。Matplotlibを使って描画するところは除外。ScipyとMatplotlibを使ってデータの近似モデル...エクセルでええやんっていうツッコミは禁止。NetEaseに対する訴状内容まとめ2010年代の海外ドラマ革命と、映画、ゲーム。ついてid:ktadakiこのブログについてはてなブログをはじめよう!ktadakiさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。