0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Gradient descentで学習した線形回帰アルゴリズムの実装

Last updated at Posted at 2023-07-09

gradient descentを使って学習を行ったモデルを元に、走行距離に応じた自動車の価格を線形回帰で予測するシンプルなプログラムを作成してみたので、記事にしてみました。

Estimate price

推論時は走行距離を受け取り、その走行距離に応じた推定価格を返します。次の式を使用して価格を予測します。

estimatePrice(mileage) = \theta_0 + (\theta_1 \times mileage) \tag{1}

推論コードはこちらです。以下のコマンドで試すことができます。この例では、100000kmの車の価格を推定します。

python estimate_price.py --mileage 100000 --param_yaml param.yaml

Train with a gradient descent algorithm

学習コードはデータセットのファイルを読み込み、データに対して線形回帰を実行します。線形回帰が完了すると、推論コードで使用する変数θ0とθ1が保存されます。学習手順は以下の通りです。

1. Normalize range

データの値をそのまま学習に使うと、うまく収束しませんでした。そこで、データを正規化してから学習に使用しました。正規化にはscaling to a rangeを使用しました。

$$
x=(x\prime - x_{min})/(x_{max}-x_{min}) \tag{2}
$$

scaling to a rangeは、次の両方の条件を満たす場合に良い正規化方法です。

  • 外れ値がほとんどない。データのおおよその上限と下限がわかっている。
  • データがその範囲にほぼ一様に分布している。

2. Calculate gradient

勾配を計算していきます。最小化するコスト関数は以下の通りです。mはデータ数です。

\frac{1}{m}\sum_{i=0}^{m-1}(price[i]-estimatePrice(mileage[i]))^2
\tag{3}

θ0とθ1のそれぞれで微分した式は以下のようになります。

\begin{align*}
D_{\theta_0}&=\frac{\partial (costFunction)}{\partial_{\theta_0}}=\frac{\partial}{\partial_{\theta_0}}\left(\frac{1}{m}\sum_{i=0}^{m-1}(y_i-(\theta_1x_i+\theta_0))^2\right) \\
&=\frac{1}{m}\frac{\partial}{\partial_{\theta_0}}\left(\sum_{i=0}^{m-1}(y_i^2+\theta_1^2x_i^2+\theta^2+2\theta_1x_i\theta_0-2y_i\theta_1x_i-2y_i\theta_0)\right) \\
&=\frac{-2}{m}\sum_{i=0}^{m-1}(price[i]-estimatePrice(mileage[i]))
\end{align*} \tag{4}
\begin{align*}
D_{\theta_1}&=\frac{\partial (costFunction)}{\partial_{\theta_1}}=\frac{\partial}{\partial_{\theta_1}}\left(\frac{1}{m}\sum_{i=0}^{m-1}(y_i-(\theta_1x_i+\theta_0))^2\right) \\
&=\frac{1}{m}\frac{\partial}{\partial_{\theta_1}}\left(\sum_{i=0}^{m-1}(y_i^2+\theta_1^2x_i^2+\theta^2+2\theta_1x_i\theta_0-2y_i\theta_1x_i-2y_i\theta_0)\right) \\
&=\frac{-2}{m}\sum_{i=0}^{m-1}x_i(price[i]-estimatePrice(mileage[i]))
\end{align*} \tag{5}

3. Update parameter with learning rate

θ0とθ1の値は、学習率Lに応じて更新されます。

\theta_0=\theta_0-LD_{\theta_0},
\theta_1=\theta_1-LD_{\theta_1} \tag{6}

4. Calculate cost function

コスト関数の式(3)が非常に小さくなるまで(理想的には0)、このプロセスを繰り返します。

5. Convert normalized value back to original value

得られたθ0とθ1は正規化されたデータの値なので、元のスケールに戻します。

x_{original}=x_{norm}(x_{max}-x_{min})+x_{min} \tag{7}

学習コードはこちらです。実行時のコマンドは以下の通りです。

python train.py --csv_file_path data.csv --output_param_path param.yaml

結果のグラフは以下の通りです。いい感じですね。

result_graph.png

References

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?