見出し画像

非エンジニアが機械学習を活用したWebサービスをリリースするまでの記録

どうもはじめまして、非エンジニアのしょうと申します。
この度、機械学習を活用したWebサービス「AI株価予測サービス」をリリースしました。

非エンジニアで完全独学でも機械学習を活用したWebサービスをリリースできるんだよ。
ってことを、
これからプログラミングを始めたい方・機械学習を学びたい方・Webサービスを作ってみたい方々の参考になればいいなと思い、このnoteを書きます。

ちなみに私は病院で勤務している医療従事者です。以下のように言っていただけてめちゃくちゃ嬉しかった

最初にAI株価予測サービスの構想からデプロイまでについてざっくりお話し、その後にどのように勉強してきたかをお話ししたいと思います。

プログラミングを学んでみたいと思っている方々の参考になれば幸いです。
もし何か聞いてみたいことがありましたら、X(旧Twitter)のDMやコメントをしてもらえれば、お答えしていきたいと思います。

そして!少しでも本noteにポジティブな印象を抱いていただけましたら、SNSで広めてもらえると嬉しいです!

※本記事内で紹介している書籍についてはAmazonアソシエイトリンクになっています。

Webサービス開発の背景

もともと何かしらのwebサービスを開発したいと思っていたのと、機械学習の勉強をするなら株価予測がいいなと思っていました。

さらに、今後新NISAが始まりますが、NISAや投資信託などに興味を持っている人は多いだろうけど、個別株に対しての興味も持ってもらいたい。もう少し株取引のハードルを下げたいっていう思いがありました。

なぜなら、今の20代30代は将来のために、投資やら副業ならをやらなければ生活水準が厳しくなっていくと予想出来るので、こういったサービスを活用して投資に対するハードルを下げたいなと思いました。

AI株価予測サービスの構想

AI株価予測サービスの構想は多分3日くらいです。
なんで構想がこんなに短いかというと、もともと機械学習をやるなら株価の予測をしよう、とかなり前から考えていたからです。

ですが、ここで一番悩んだのは、どういった手法の機械学習を実装していくか?という部分でした。

完全独学非エンジニアマンの私では、あまり難易度の高すぎる機械学習手法は無理。

そこで選択したのが、gradient boosting(勾配ブースティング)という手法です。

勾配ブースティングとは、簡単にいうと、あまり性能の良くない学習器を一つずつ順番に学習していき、前回の学習器が誤って分類したデータを優先的に正確に分類できるように重みづけをしていく手法です。

Pythonでは勾配ブースティングを簡単に実装でき、かつ精度の高い予測を行うことができるため、選択をしました。

勾配ブースティングの実装

非常に簡単な勾配ブースティングのサンプルコードを提示します。

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score

# データセットの生成
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)

# データセットを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 勾配ブースティングモデルの設定と訓練
gb_clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=42)
gb_clf.fit(X_train, y_train)

# テストデータでの予測と精度の評価
y_pred = gb_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print(accuracy)

webデザインを考える

僕は美的センス皆無なので、ChatGPTに丸投げしました。
以下が実際にChatGPTに命じたプロンプトです。

あなたはプロのwebデザイナーです。
現在、機械学習を用いて株価を予測するwebサービスを開発しています。シックでモダンないい感じのオシャレなデザインを考えてHTMLとCSSを表示してください。出来ればBootstrap使ってください。
お願いします。

これで表示されたものを基に、自分好みにアレンジをしていきました。

HTMLとCSSの知識が元々少しだけあったっていうのも大きいですが、割とスムーズにデザインは完成したかなと思います。

HTMLとCSSについては、こちらの書籍で勉強をして、医療系事務所のHP作成を行わせていただいたことがある程度の知識です。

こちらの書籍、発売されたのが2019年とちょっと古いですが、今でもAmazonのベストセラー1位になっているので、HTMLとCSSを学ぶなら、こちらだけで十分だと思います。

フレームワークの選択

Pythonにはwebサービスを開発するためのフレームワークがいくつか用意されています。

  • Flask

  • Django

  • Bottleなどなど

今回はFlaskを選択しました。もともとLINEbotを作成するのにFlaskを使っていたのと、そこまで複雑なサービスを開発するつもりはなかったので、Flaskを選択しています。

Djangoでもよかったのですが、Djangoは難しすぎるので、リリースまでに時間がかかるだろうな、ということで今回は見送り、Bottleは使ったことがなかったので、選択肢からは除外されています。

株価取得方法

学習モデルを作成する際・予測を行う際に、株価情報が必要です。
株価情報を取得するためには、スクレイピングが証券サイトが用意しているAPIを使うかのどちらかの選択肢しか、僕にはありませんでした。

ただ、証券サイトでスクレイピングだと、ログインとかやや煩雑なので、API利用の方針で進め、「Python 株 API」とググりました。

その結果、証券会社が提供しているAPIがあったので、そちらを活用することにしました。

このAPIは株価コードを指定するだけで、過去の株価情報から最新の情報までダウンロードできます。

特徴量の選択

予測する上で重要になるのが、特徴量です。
特徴量というのは、データの各側面を表す変数または属性のことを指します。

また、特徴量は、機械学習モデルが学習や予測を行う際の入力となり、一般に、数値やカテゴリ、テキスト、画像など、さまざまです。

今回の特徴量は以下です。

  • 移動平均

  • 標準偏差

  • モメンタム

  • RSI

ハイパーパラメータのチューニング

ハイパーパラメータは、モデルの訓練方法や性能に大きな影響を与えることがあります。適切なハイパーパラメータを選択することで、モデルの過学習を避けることができたり、訓練速度を向上させることができます。

ハイパーパラメータとして、次のようなものがあります。

  • 学習率: 各ステップでのモデルの更新の大きさを制御します。

  • エポック数: 訓練データを何回繰り返して学習するかの回数。

  • バッチサイズ: 一度に訓練するデータのサンプル数。

  • 正則化パラメータ: モデルの複雑さを制御し、過学習を防ぐためのパラメータ。

ここら辺をいい感じにすることで、モデルの精度を改善させることができます。

大まかな流れとしては、こんな感じになっています。

いざ実装

あとはここまでの流れを実装していくだけですね。
僕はFlaskとして反映?させる前に、ローカル環境で動かすプログラムとして開発をしていました。(あれ?当たり前?)

というのも、いろんなことを同時に進行させてしまうと、どこで問題を生じているのか整理できなくなってしまうからです。

なので、まずは株価を取得して、csvの読み込みを行う段階、csvの読み込みを行った後に学習させる段階、学習させて作ったモデルを使って予測を行う段階、といくつかに分けて実装していきました。

一通り動くようになり、精度も高くなってきた後に、Webサービスとしての実装を開始しました。

ここからようやくFlaskのコードを書く部分に突入です。

ここら辺は前段階で作成したプログラムを呼び出したりするだけなので、そこまで複雑ではないと思いますが、HTMLと組み合わせるのに難渋しました。

ググったり公式ドキュメント見たり、それでもわからなければChatGPTに頼ってりして実装しました。

実装する段階で大切なことは、めんどくさいけど細分化して少しずつ完成させていくことだと思います。

大切なことほどめんどくさい」と、かの偉人は言いました。

なので、めんどくさいと思うことほど丁寧にやりましょう。

どうやってWebサービスリリースまで勉強したのか

非エンジニアの完全独学マンで気になるのは、どうやって勉強したかだと思います。

私としては、まずは開発したいサービスの大枠を理解する必要があると考えています。

今回のWebサービスの場合、上記で説明したものが必要であることをまずは理解しなくてはいけません。

なので、理解するために、一個ずつググっていきます。
ChatGPTでもOKです。

基本的にはこれでOKなんですが、もう少し具体的に。

機械学習の勉強

AI株価予測サービスの最も重要な部分が「機械学習」の部分になります。

そのため、Webサービスをリリースする以前から、機械学習の勉強を進めていました。

というよりも、機械学習を用いたアプリorサービス開発をしようと思っていたので、それに向けて機械学習の勉強を行っていた、という感じです。

勉強したことをブログにまとめつつ、コードの実装も色々やってました

ブログの中でも書いていますが、機械学習を行うためには、次のステップがあります。

  • データの準備

  • データの前処理

  • モデルの選択

  • モデルの学習

  • モデルの評価・改善

このステップを踏まえ、より精度の高い予測モデルを作っていきます。

予測モデルを作るためには、ハイパーパラメータの調整が必要になりますが、ここら辺はChatGPTに頑張ってもらいました。

ChatGPTに実装したコードを丸投げして、次のプロンプトを入力。

提示したコードは株価を予測するためのモデルを作成するものです。最も予測精度が高くなるようにパラーメータの調整を行ってください。 

あとは機械学習に関する書籍を色々斜め読みして、機械学習の知識をインプットしていました。

機械学習を学ぶ前から統計学にずっと触れていたので、統計学に触れていたことのある方なら、結構とっつきやすいかもです。

学習の幅を広げる

個人的なこと(個人でnote書いてるから当たり前)なんですが、僕は学習の幅を広げるためには、めちゃくちゃシンプルなものでもいいから、とにかく色々開発するべきだと考えています。

これは、選択肢の幅を広げることができるためです。

学習の幅と選択肢の幅、似たような言葉ですが、私の中では明確に異なっています。

学習の幅というのは、例えばPythonであれば、機械学習を行なってみたり、統計処理を行ってみたり、はたまたスクレイピングで遊んでみたり、ということです。

選択肢の幅というのは、例えば選択肢の幅が狭い場合には、何かを開発しようと考えた時に、一つのことしか学んでいなければ、それを使ってでしか開発することができません。

一方、選択肢の幅が広ければ、アレとコレを組み合わせて、〇〇を開発していこう。みたいな発想ができると思うんですよ。

本職エンジニアの方からしたら、もしかしたら当たり前なのかもしれません。

しかし、私は「非エンジニアの完全独学マン」です。

「非エンジニアの完全独学マン」がアプリなりWebサービスなりを開発するためには、まずは浅く広く学び、特定のサービスなどを開発しようと思った時に、学習を深めつつ、開発をするのがいいと思っています。

なので、非エンジニアの完全独学マンは学習の幅を広げるために、非常にシンプルなものでもいいので、色々実装してみるのがいいと思います。

プログラミング学習を助けてくれたかけがえのない仲間たち

さて、あまり大したことは書けていないかもしれませんが、プログラミング学習を助けてくれたかけがえのない仲間たちを紹介してお仕舞いにしたいと思います。

まずはChatGPTくん。

こいつにはマジでお世話になっています。課金した方がいいです。
何もいうことはありません。

次にDeepLくん。
これはアプリとしてもありますが、Chromeの拡張機能として使いましょう。
英語の部分を編みかけしてボタンクリックするだけで翻訳してくれます。

公式ドキュメントの多くは英語なので、こいつがいないと読めません。
マジで重宝するので、入れてない人は早く入れて。

あとはVSCodeのいろんな拡張機能とかですが、そこら辺は個々人で色々使っているでしょう。

こんな感じで、非エンジニアの完全独学マンのWebサービス開発は進んでいきました。多分、構想を始めてから2週間くらいですかね。

あとはサーバー関係ですが、これはもうひとまずRender使っておきましょう。
VPSやらAWSとかありますが、マジで謎いので、Renderでサクッとリリースしちゃいましょ。

独自ドメインとって、Renderの最安プラン契約してでOK。
ドメイン料はまちまちですが、Renderは月7ドルです。

おしまいです。今後ともAI株価予測サービスをよろしくお願いします!

少しでも本noteにポジティブな印象を抱いていただけましたら、いいねを押してからSNSで広めてもらえると嬉しいです!

この記事が気に入ったらサポートをしてみませんか?