2
0

ニューラルネットワークを用いた、汎用的な数値予測プログラムを作ってみた

Last updated at Posted at 2024-03-18

はじめに

  • 今回は、scikit-learnのMLPClassifierを使って、様々な数値予測に使える雛形的なコードを書いてみました
  • 記事上では、例として株価の予測を行っていますが、データセットと変数を書き変えることで、様々な予測ができる。…はず
  • 説明変数の標準化も実行されるようにしてます

想定読者

  • scikit-learnのMLPClassifierを使った数値予測に興味がある人
  • 「データセットは準備できた。あとは必要最低限のカスタマイズで、予測を実行できるようなコードが転がっていればな~」という人

前提

  • Pythonの動作環境
  • Scikit-learnと、Pandasがインストール済み

学習用データセットの形式

  • ルール
  1. 目的変数と、必要な説明変数のみが記載されたcsvファイルであること
  2. 1行目にカラム名が英語で記載されていること
  3. 全データの数値化や、欠損値・外れ値の処理が実施済みであること

■サンプル
image.png

例では
とある企業の明日の株価(終値)の予測を目的に
目的変数:closing_price_today(当日の終値[円])
説明変数:7days_ago~1day_ago(7~1日前までの終値[円])
のデータセットを1年分用意している

(データの抽出元:https://finance.yahoo.co.jp/quote/2181.T/history)

学習済みモデルに予測させる入力データの形式

  • ルール
  1. 目的変数のカラムが不要なこと以外は、学習用データセットの形式と同様

■サンプル
image.png

コード

  • 上記の学習用データ、入力データが準備できたら、以下のコードをカスタマイズして実行する
  • カスタマイズできる個所は、コメントアウトに【カスタムN】と記載のある5個所
main
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.neural_network import MLPClassifier
from sklearn import metrics 
from sklearn.preprocessing import StandardScaler

# 【カスタム1】学習用データセットのパス
csv_file_path_learning = "./learning_data.csv"
# 【カスタム2】学習済みモデルに予測させる入力データのパス
csv_file_path_actual = "./actual_data.csv"
# 【カスタム3】目的変数のカラム名
mokuteki_label = 'today'
# 【カスタム4】学習用データのうち、テストデータにする割合
ratio_for_test_data = 0.2
# 【カスタム5】隠れ層の数
layer_size=(100,100,100)

# 学習用データを説明・目的変数に分割
csv_data_learning=pd.read_csv(filepath_or_buffer=csv_file_path_learning, encoding="utf-8", sep=",")
setsumei_data = csv_data_learning.drop([mokuteki_label],axis=1)
mokuteki_data = csv_data_learning[mokuteki_label]

# 説明変数の標準化
sc = StandardScaler()
sc.fit(setsumei_data)
scaled_setsumei_data = sc.transform(setsumei_data)

# 学習用データを、トレーニング用とテスト用に分割
setsumei_data_for_training, setsumei_data_for_test, mokuteki_data_for_training, mokuteki_data_for_test = train_test_split(scaled_setsumei_data, mokuteki_data, test_size=ratio_for_test_data, random_state=42)

# ニューラルネットワークの定義
clf = MLPClassifier(
    hidden_layer_sizes=layer_size)

int_mokuteki_data_for_training = mokuteki_data_for_training.astype('int')
int_mokuteki_data_for_test = mokuteki_data_for_test.astype('int')

# モデルの学習、精度の計測
clf.fit(setsumei_data_for_training, int_mokuteki_data_for_training)
predict = clf.predict(setsumei_data_for_test)
score = metrics.r2_score(int_mokuteki_data_for_test, predict)
print("モデルの精度:", score)

# 入力データから予測
data_actual = pd.read_csv(filepath_or_buffer=csv_file_path_actual, encoding="utf-8", sep=",")
setsumei_data_actual = sc.transform(data_actual) 
print("予測結果:", clf.predict(setsumei_data_actual))

サンプルデータの実行結果

モデルの精度: 0.8832801846947363
予測結果: [201]

ちなみに該当日の、実際の株価は 202.8円 でした
まずまずの精度かと思います

最後に

  • 今回、わかりやすさ重視のため、モデルの精度を高めるためのカスタム要素を①テストデータの割合と②隠れ層の数に限定しています
    もっと自由にカスタマイズしたい場合は、ニューラルネットワークの定義箇所で、MLPClassifierの引数に様々なパラメータを設定できますので、試してみてください。
  • 株価の予測というサンプルは、完全な筆者の好みです
    他にも、説明変数の検討やデータ収集がうまくいけば、プロジェクトの工数を予測したりするのも面白そうだなーと思ってます
    まあ、何より大変なのはそのデータ収集と前処理なんですけどね…
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0