はじめに
- 今回は、scikit-learnのMLPClassifierを使って、様々な数値予測に使える雛形的なコードを書いてみました
- 記事上では、例として株価の予測を行っていますが、データセットと変数を書き変えることで、様々な予測ができる。…はず
- 説明変数の標準化も実行されるようにしてます
想定読者
- scikit-learnのMLPClassifierを使った数値予測に興味がある人
- 「データセットは準備できた。あとは必要最低限のカスタマイズで、予測を実行できるようなコードが転がっていればな~」という人
前提
- Pythonの動作環境
- Scikit-learnと、Pandasがインストール済み
学習用データセットの形式
- ルール
- 目的変数と、必要な説明変数のみが記載されたcsvファイルであること
- 1行目にカラム名が英語で記載されていること
- 全データの数値化や、欠損値・外れ値の処理が実施済みであること
例では
とある企業の明日の株価(終値)の予測を目的に
目的変数:closing_price_today(当日の終値[円])
説明変数:7days_ago~1day_ago(7~1日前までの終値[円])
のデータセットを1年分用意している
(データの抽出元:https://finance.yahoo.co.jp/quote/2181.T/history)
学習済みモデルに予測させる入力データの形式
- ルール
- 目的変数のカラムが不要なこと以外は、学習用データセットの形式と同様
コード
- 上記の学習用データ、入力データが準備できたら、以下のコードをカスタマイズして実行する
- カスタマイズできる個所は、コメントアウトに【カスタム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の引数に様々なパラメータを設定できますので、試してみてください。 - 株価の予測というサンプルは、完全な筆者の好みです
他にも、説明変数の検討やデータ収集がうまくいけば、プロジェクトの工数を予測したりするのも面白そうだなーと思ってます
まあ、何より大変なのはそのデータ収集と前処理なんですけどね…