前回のブログで、TensorFlowで機械学習による分類の手法を紹介しました。今回は、scikit-learnで未来を予測する回帰のアルゴリズムを紹介したいと思います。
(scikit-learnでも分類のアルゴリズムを使うことができます。)
回帰のサンプルコードの概要
連続した過去3日間の天気をもとに、明日の天気を予想するサンプルコードです。 晴れ⇒1,曇り⇒2、雨⇒3と数字に置き換えて考えます。また、100日間、 晴れ⇒曇り⇒雨⇒晴れ⇒曇り⇒雨...という天気を繰り返していることにします。
※完全にscikit-learnの使い方を紹介するためだけのサンプルになります。
① エクセルに1,2,3,1,2,3...と書かれたデータを用意します。 ② 50日分のデータを使い、学習します。 ③ この学習済みモデルに、適当な連続した3日間の天気のデータを与えて 明日の天気を予想します。明日が晴れか、そうでないか(曇りor雨)を予想します。
それでは、Windowsにscikit-learnをインストールして、実際に動かしてみます。今回もRaspberry PiではなくWindowsです。
Windowsにscikit-learnで使用するモジュールのインストール
pythonのインストール
下記のサイトからpythonのインストーラをダウンロードしてインストールを行います。
pythonバージョン:3.8.0
Windows用インストーラ:Windows x86-64 executable installer
インストールウィザードの一番初めの画面で"Add Python to environment variables" にチェックを入れてインストールしてください。pythonの環境変数が設定されます。
また、pythonインストール後、pipのバージョンを最新版に更新しておきます。
> python -m pip install --upgrade pip
scikit_learn、pandasのインストール
下記コマンドでインストールを行います。
> pip install scikit_learn > pip install pandas
上記コマンドで、numpy等のモジュールも同時にインストールされます。
天気予報データをエクセルで作成
セルA1に"weather"と記載し、A2~A100まで1,2,3,1,2,3...と繰り返し記載したcsvファイルを作成し、今回作成するpythonコードと同フォルダに保存します。csvのファイル名はtest.csvとします。
(上記でも書きましたが、晴れ⇒1,曇り⇒2、雨⇒3を意味しています。)
scikit-learnのサンプルコードの説明
# モジュールのインポート、変数宣言 from sklearn import tree, svm import numpy as np import pandas as pd train_X = [] train_y = [] train_Z = []
scikit-learn, numpy, pandasモジュールをインポートします。使用する変数を宣言しておきます。
# csvデータの読み込み df = pd.read_csv("test.csv", header=0) df.columns=["weather"]
pandasモジュールを使用して、test.csvファイルのデータを読み込みます。
# 学習用データの作成 for i in np.arange(0, 50): s = i + 3 three_days_weather_data = df["weather"][i:s] nextday_weather_data = df["weather"][s:s+1].values if nextday_weather_data == 1: train_y.append(1) else: train_y.append(0) train_X.append(three_days_weather_data.values)
three_days_weather_dataは連続した3日間の天気のデータです。nextday_weather_dataはその次の日の天気のデータです。今回、連続した3日間の天気のデータをもとに、次の日が晴れか晴れ以外かを予測しますので、
・訓練用データ:train_X ⇒ 連続した3日間の天気のデータ
・正解値データ:train_y = 次の日の天気(晴れ⇒1、晴れ以外⇒0)
を代入します。
# 決定木モデルで学習を実行
clf = tree.DecisionTreeClassifier()
clf.fit(train_X, train_y)
scikit-learnで用意されているモジュールをそのまま使用するだけです。clfを生成し、clf.fitメゾットに先ほど作成した学習データを引数として与えます。
# 学習済みモデルにテストデータを入れてテスト forecast = df["weather"][51:54] # 51:54 ⇒ 52:55 や 53:56に変えると予測結果が変わる train_Z.append(forecast.values) result = clf.predict(train_Z) print(result)
csvファイルの適当な3日間のデータを学習済みモデル(clf.predictメゾット)に与えます。その翌日の天気が晴れなのかそうでないか推測してくれます。1であれば晴れ、0であれば晴れ以外の天気ということになります。
今回はscikit-learnの使い方を紹介するために、全く面白くない規則正しいデータを使用しました。訓練データや予測するデータを工夫すれば面白いものができそうです。たとえば、前3か月の株や為替データを訓練データとして、次の日株が為替が上がっているか、下がっているかを予測する等できそうですね。あくまで例です、実際の投資に使う際は自己責任でお願いします。
全コードを記載しておきます。
# モジュールのインポート、変数宣言 from sklearn import tree, svm import numpy as np import pandas as pd train_X = [] train_y = [] train_Z = [] #csvデータの読み込み df = pd.read_csv("test.csv", header=0) df.columns=["weather"] #学習用データの作成 for i in np.arange(0, 50): s = i + 3 three_days_weather_data = df["weather"][i:s] nextday_weather_data = df["weather"][s:s+1].values if nextday_weather_data == 1: train_y.append(1) else: train_y.append(0) train_X.append(three_days_weather_data.values) # 決定木モデルで学習を実行 clf = tree.DecisionTreeClassifier() clf.fit(train_X, train_y) # 学習済みモデルにテストデータを入れてテスト forecast = df["weather"][51:54] train_Z.append(forecast.values) result = clf.predict(train_Z) print(result)