Python & Raspberry Pi 開発ブログ ☆彡

PythonとRaspberry Piの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

Python scikit-learnの使い方

前回のブログで、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のインストーラをダウンロードしてインストールを行います。

www.python.org

pythonバージョン:3.8.0
Windows用インストーラ:Windows x86-64 executable installer

インストールウィザードの一番初めの画面で"Add Python to environment variables" にチェックを入れてインストールしてください。pythonの環境変数が設定されます。

check add path when python install

また、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を意味しています。)

f:id:raspberrypi:20170426193747j:plain

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)

ラズパイ ソフトウェアに戻る
トップページに戻る