PythonのNumpyを使って線形回帰をゼロから実装していく

スポンサーリンク

今回は、Pythonを使ってゼロから線形回帰を実装する方法を学びます。

線形回帰は予測分析の基本であり、最もよく使われるタイプです。

別の変数の値に基づいて、ある変数の値を予測するために使用されます。

予測したい変数を従属変数と呼びます。

我々が従属変数の値を予測するために使用している変数は、独立変数と呼ばれます。

1 つの従属変数と 1 つの独立変数による回帰式の最も単純な形式。

y = m Ⓐ x + b

ここで

  • y = 従属値の推定値。
  • b = 定数またはバイアス。
  • m = 回帰係数または傾き。
  • x = 独立変数の値。
スポンサーリンク

ゼロから始める線形回帰

今回は、Numpyだけを使ってゼロからLinear Regressionを実装します。

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 パラメータの更新

以下の式を用いて、パラメータの値を更新します。

MSE
MSE

更新されたパラメータの値は、各ステップで損失関数を最小化し、真の値と予測値の差を小さくする値となる。

このプロセスを繰り返し、ローカル・ミニマムのポイントに到達させる。

4. Pythonでゼロから線形回帰を実装する

勾配降下法を用いて線形回帰を実装する方法について理解できたので、Pythonでコーディングしてみましょう。

クラス LinearRegression を定義し、2つのメソッド .fit( ).predict( ) を定義します。

Gradient Of Slope And Bias
Gradient Of Slope And Bias

学習データを入力とする LinearRegression クラスのインスタンスを生成し、バイアスと定数を 0 で初期化します。

このクラスの .fit( ) メソッドは勾配降下を実装しており、各反復でパラメータに関する関数の偏導関数を計算し、学習率と勾配値を用いてパラメータを更新します。

.predict( )メソッドでは、パラメータの最適値を用いて関数y = m * x + b` を単純に評価し、言い換えれば、このメソッドはベストフィットの線を推定します。

4. 線形回帰モデルのテスト

さて、クラスを作成したので、データでテストしてみましょう。

トレーニング用とテスト用のデータセットの分け方についてはこちらをご覧ください。

このチュートリアルで使用したデータセットやその他のリソースは、こちらで確認できます。

Updating Parameters
Updating Parameters
Prediction Linear Regression
Prediction Linear Regression

問題なく動作しています。

まとめ

この記事は、Numpyだけを使用してゼロからLinear Regressionモデルを作る方法についてでした。

このチュートリアルのゴールは、Linear Regressionが実際にどのようなもので、どのように動作するのかをより深く理解してもらうことでした。

それでは、また次回お会いしましょう。

それではまた。

タイトルとURLをコピーしました