今回は、Pythonを使ってゼロから線形回帰を実装する方法を学びます。
線形回帰は予測分析の基本であり、最もよく使われるタイプです。
別の変数の値に基づいて、ある変数の値を予測するために使用されます。
予測したい変数を従属変数と呼びます。
我々が従属変数の値を予測するために使用している変数は、独立変数と呼ばれます。
1 つの従属変数と 1 つの独立変数による回帰式の最も単純な形式。
y = m Ⓐ x + b
ここで
- y = 従属値の推定値。
- b = 定数またはバイアス。
- m = 回帰係数または傾き。
- x = 独立変数の値。
この記事もチェック:PythonのNumpyを使って相関回帰分析を実装する方法
ゼロから始める線形回帰
今回は、Numpyだけを使ってゼロからLinear Regressionを実装します。
この記事もチェック:PythonとNumpy,Pandasを使って単純な線形回帰モデルを作る方法
1. 損失関数の理解
損失関数には様々なものがあるが、ここでは平均二乗誤差関数を損失関数として使用します。
#Import required modules import numpy as np
#Defining the class class LinearRegression:
def __init__( self , x , y):
self .data = x
self .label = y
self .m = 0
self .b = 0
self .n = len (x)
def fit( self , epochs , lr):
#Implementing Gradient Descent
for i in range (epochs):
y_pred = self .m * self .data + self .b
#Calculating derivatives w.r.t Parameters
D_m = ( - 2 / self .n) * sum ( self .data * ( self .label - y_pred))
D_b = ( - 1 / self .n) * sum ( self .label - y_pred)
#Updating Parameters
self .m = self .m - lr * D_m
self .c = self .b - lr * D_c
def predict( self , inp):
y_pred = self .m * inp + self .b
return y_pred
|
平均二乗誤差関数とは、その名の通り、真の値と予測値の差の二乗和の平均を表す関数です。
yの予測値は勾配と定数に依存するので、損失関数を最小化する勾配と定数の値を見つけること、言い換えれば、yの予測値と真の値の差を最小化することが目標になります。
2. 最適化アルゴリズム
最適化アルゴリズムは、損失関数を最小化する最適なパラメータセットを学習データセットから見つけるために使用されます。
そのようなアルゴリズムの一つがGradient Descentです。
勾配降下法は、機械学習で使用される最適化アルゴリズムの中で、圧倒的に人気があります。
勾配降下法では、パラメータに対する損失関数の勾配を繰り返し計算し、ローカルミニマムに到達するまでパラメータを更新し続けます。
3. 勾配降下を実装するための手順
勾配降下アルゴリズムの舞台裏を理解しましょう。
Step-1 パラメータの初期化
ここで、パラメータの値を初期化する必要があります。
ここでは、「slope = 0」と「constant = 0」のままにしておきます。
また、損失関数の最小値に向かって移動する際の各反復のステップサイズを決定するための学習率も必要です。
ステップ-2 パラメータに対する偏微分を計算します。
ここで、損失関数をパラメータに対して偏微分します。
#importing matplotlib for plotting import matplotlib.pyplot as plt
#Loding the data df = pd.read_csv( 'data_LinearRegression.csv' )
#Preparing the data x = np.array(df.iloc[:, 0 ])
y = np.array(df.iloc[:, 1 ])
#Creating the class object regressor = LinearRegression(x,y)
#Training the model with .fit method regressor.fit( 1000 , 0.0001 ) # epochs-1000 , learning_rate - 0.0001
#Prediciting the values y_pred = regressor.predict(x)
#Plotting the results plt.figure(figsize = ( 10 , 6 ))
plt.scatter(x,y , color = 'green' )
plt.plot(x , y_pred , color = 'k' , lw = 3 )
plt.xlabel( 'x' , size = 20 )
plt.ylabel( 'y' , size = 20 )
plt.show() |
ステップ-3 パラメータの更新
以下の式を用いて、パラメータの値を更新します。
更新されたパラメータの値は、各ステップで損失関数を最小化し、真の値と予測値の差を小さくする値となる。
このプロセスを繰り返し、ローカル・ミニマムのポイントに到達させる。
4. Pythonでゼロから線形回帰を実装する
勾配降下法を用いて線形回帰を実装する方法について理解できたので、Pythonでコーディングしてみましょう。
クラス LinearRegression
を定義し、2つのメソッド .fit( )
と .predict( )
を定義します。
学習データを入力とする LinearRegression
クラスのインスタンスを生成し、バイアスと定数を 0 で初期化します。
このクラスの .fit( )
メソッドは勾配降下を実装しており、各反復でパラメータに関する関数の偏導関数を計算し、学習率と勾配値を用いてパラメータを更新します。
.predict( )メソッドでは、パラメータの最適値を用いて関数
y = m * x + b` を単純に評価し、言い換えれば、このメソッドはベストフィットの線を推定します。
4. 線形回帰モデルのテスト
さて、クラスを作成したので、データでテストしてみましょう。
トレーニング用とテスト用のデータセットの分け方についてはこちらをご覧ください。
このチュートリアルで使用したデータセットやその他のリソースは、こちらで確認できます。
問題なく動作しています。
まとめ
この記事は、Numpyだけを使用してゼロからLinear Regressionモデルを作る方法についてでした。
このチュートリアルのゴールは、Linear Regressionが実際にどのようなもので、どのように動作するのかをより深く理解してもらうことでした。
それでは、また次回お会いしましょう。
それではまた。