モーター温度の予測

はじめに

pythonによる機械学習の練習として、kaggleにある課題をやってみることにしました。今回用いるデータはkaggleからElectric Motor Temperatureのデータを使用しました。pythonはさわり初めて1年ほど、機械学習は勉強し始めて3か月ほどの初心者のため、間違っていることも多いと思います。その際はご指摘いただけますと幸いです。

環境:
python 3
Windows10
Jupiter notebook

データの中身:

特徴量:

- 'stator_winding' : 熱電対で測定した固定子巻線の温度(℃)
- 'stator_tooth':熱電対で測定したステーターの歯の温度(℃)
- 'pm' :永久磁石の温度(℃)
- 'stator_yoke':熱電対で測定したステーターヨークの温度(℃)
- 'u_q' : dq座標での電圧のq成分(V)
- 'u_d' : dq座標での電圧のd成分(V)
- 'i_d':dq座標での電流dの成分(A)
- 'i_q':dq座標での電流のq成分(A)
- 'coolant' : 冷却水の温度(℃)
- 'motor_speed' : モータの回転速度(rpm)
- 'ambient' : 環境温度(°C)
- 'torque' : モーターのトルク(Nm)  
- 'profile_id' : 測定セッションID

課題では、 'stator_winding' , 'stator_tooth',  'pm',  'stator_yoke'の4つの特徴量を予測することが求められています。ですが、今回は'pm’についてのみを教師あり学習(回帰)で予測します。

1.データの読み込み

必要なライブラリを読み込んで、kaggleからダウンロードしたデータセットを読み込んでいきます。

 #ライブラリのインポート 
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.linear_model import ElasticNet
from sklearn.preprocessing import StandardScaler
 #csvファイルの読み込み 
df = pd.read_csv("./Electric Motor Temperature/measures_v2.csv")
df.info()

データ名.info()を用いると、列名・データ数・欠損値の有無・データのタイプを確認することができます。今回のデータは 'profile_id'以外はすべて連続値のデータでした。

2.説明変数と目的変数に分ける

今回は与えられている変数の一部を使用するため、データフレームの列名を指定して抽出しています。

# X 説明変数
# y 目的変数

X = df.loc[:,['u_q','u_d','i_q','i_d','coolant','motor_speed','torque','ambient']] 
y = df.loc[:, ['pm']] 

3.データを分割する

教師あり学習では、データセットをトレーニングデータとテストデータに分割します。トレーニングデータで予測モデルを作り、テストデータで精度を確認します。モデルの作成の目的は、未知のデータに対して高い精度で予測できるようにすることです。そのため、すべてのデータを予測モデルの作成に使用し、その中のデータで精度を確認してしまうと、既知のデータに対する精度しか確認できず、未知データに対する精度を確認できなくなってしまう為、トレーニングデータとテストデータに分割します。

X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.4, random_state=42)

# test_size: テストデータの割合
# random_stat: 乱数固定のための数値(数値は自然数であれば何でもよい)

test_sizeは元のデータの何割をテストデータにするかの割合です。random_statは乱数固定のための数値です。数値は自然数であれば何でも構いません。乱数を固定することで、データを分割する際の選び方を固定しています。固定しなければ、解析を実行するたびにデータセットが変わる為、結果が変わってしまうことがあります。

4.データの標準化

現状のデータのままだと、変数ごとにデータの幅や桁、単位が異なります。例えば、0.1以下の数値からなる変数と1000以上の変数のデータがどちらも含まれている可能性があります。極端に小さいデータから成る変数や大きいデータから成る変数が含まれていると、それらの変数の影響が大きくなり正確な予測をすることができません。各説明変数の変化量を等価にする為に、データの標準化を行います。標準化によって、各変数は平均=0, 分散(標準偏差)=1のデータセットとなります。

標準化の式:

x(i)std=x(i)−μσ
μ:平均 σ:標準偏差

今回、標準化にはsklearnライブラリの中のStandardScalerを使用します。

scaler=StandardScaler()
X_train=scaler.fit_transform(X_train) #X_trainに合わせたパラメータの取得と標準化の実行 
X_test=scaler.transform(X_test)        #上で作成したパラメータを使って標準化を実行 

5.モデルの作成と精度確認

今回は連続する数値データなので、線型回帰を行います。説明変数が複数ある為、重回帰分析になります。

model =  LinearRegression()    #線形回帰クラスの用意 
model.fit(X_train, y_train)    #X_train , y_trainに合わせたモデルの作成
pred_y = model.predict(X_test)    #作成したモデルでテストデータを予測 
# 決定係数の出力
print(model.score(X_test, y_test))    #決定係数を出力 

今回のモデルでは、決定係数を出力するとおよそ0.6となりました。外れ値や、正則化など今回紹介しなかった処理を行うことで、まだ改善の余地はありそうです。

以上、今回は教師あり学習で回帰分析を行う際の基本的な流れについてまとめました。今後より精度の高い予測ができるよう、データの処理等も学んでいきたいと思います。

参考資料・使用データ

kaggle : Electric Motor Temperature 
 データや他の方の作成したコードも見ることができます。今回は、リンク先のコードを参考にさせていただきました。
scikit-learn:sklearn.preprocessing.StandardScaler
統計WEB:27-4. 決定係数と重相関係数
コード7区機械学習とかpythonとか:sklearn StandardScaler で標準化の効果を確かめる-python