機械学習でナンバーズ3の当選番号を予想するプログラムを作った

久々に個人開発やってみましたという話です。
週末を使って、ナンバーズ3の次の当選番号を予測する個人開発プロダクトを作ってみました。

どうして作ったか

最近ずっと機械学習を勉強していて、何かその成果を形に残したいなと考えるようになっていました。で、個人開発×機械学習でネタを考えていたら、ナンバーズ3が最初の課題としては最適なんじゃないかと思い、勢いで作ってみました。

なぜナンバーズ3?

実装面で考えると、
  • 平日毎日やっているので、日々当選番号(教師データ)が確実に増えていく
  • 入力が数字3桁と決まっているので実装しやすい
  • 出力も数字3桁を出せばとりあえず要件は満たせるので作りやすい
その他、
  • 当たると嬉しい(懐的な意味でも)
  • ナンバーズはネット購入できるので試すのが簡単
  • 精度が上がってくれば有料公開とかもできそう
というのがあります。

技術的なあれこれ

特別なことはやってなくて、
  • KerasのLSTM
  • バックエンドはTensorflow
  • サーバーはConoHaのVPS
  • Nginx
  • 言語はPython3
  • uwsgi
  • フレームワークはBottle.py
  • バッチ処理で新たな当選番号を自動取得&モデルを再構築
  • 新たな当選番号と予想番号が出たらSlackで通知
本番公開に関しては特に困ることはありませんでした。
ただ、開発環境がVagrantだったのですが、バックエンドにTensorflowを使うと動かないという問題があったので、開発環境だけはバックエンドにTheanoというのを使っています。(違いはよくわからない)
個人開発の言語をPython2からPython3にしたのが一番の変化ですかね。

予想精度

一昨日公開したばかりなので、まだ一回も実績が無いです。(一応予想で出た数字は購入済み)
でも多分精度は低いでしょう。ググったらChainerで同じことしてる人がいて、その人は当てたみたいです。羨ましい。
しばらく様子を見て、パラメータを調整しながら精度向上を図り、それが実現できたら有料公開したいなーとか考えてます。現在はα版で、そのうちβ版を作ろうかな、くらいのスタンスです。

その他

実はナンバーズの予想プログラムって、かなり昔からあるんですよね。私が中学生〜高校生の頃、よくフリーウェア・シェアウェアがCD-ROMに収録されてる雑誌を買ってたんですが、その中にだいたい入ってた気がします。
子供心にすごく興味があって(お小遣い的な意味で)、書いたかったけどシェアウェアを購入できるほどお金は無いし、決済方法も振込とかだったので中学生の身分ではちょっと怖かったし、あとナンバーズも今みたいにネットで買えなかったと思うので敷居が高かったです。
それが今では自分で予想プログラム作って、ネットでナンバーズが実際に買えるようになった。良い時代ですね。
今回の個人開発プロダクトはある意味、「純粋に自分のための個人開発プロダクト」になりました。
ちょっと「子供の頃の夢を叶えた感」があって嬉しいです。

今後の予定

機械学習に関しては他にもいくつか勉強しているので、年内にもう1つくらい作れればなと画策しています。でも帰省の準備とか忘年会とかあるので難しいかな?まぁそしたら来年早々にでもリリースしたいと思います。
作りたいプログラム、現時点であと3つくらいあります。うち2つは教師データを自分でコツコツ作り込んでいく感じになるので、リリースはしばらく先になりそうだけど。

2年ほど個人開発をやってきましたが、その活動の中で痛感したのは、自分はやはり奇抜なアイディアを思いついたり、プロダクトの宣伝をツイッターやブログでしてバズらせるような文章センスもない、平々凡々な人間だなぁということです。かつWebデザインやUI設計も苦手なので、普通のアプリを作っても今ひとつという。。
なので、今までは「いくつか作っていつかどれかが当たれば良い」くらいのスタンスでやってきましたが、今後はもう少し戦略を考えながら個人開発プロダクトを作っていきます。
その答えの一つとして、今回は「別に他の人に使ってもらえなくても、当選番号を予測できたらそのまま自分の利になる」というスタイルにしてみました。
今後もいろいろな個人開発プロダクトを作っていきたいと思っています。

個人開発仲間・機械学習仲間募集中なので、良かったらツイッターでお気軽にお声がけください。