线性回归的随机梯度下降算法的意外输出

问题描述 投票:0回答:1

我在为我的 ML 作业实现 SGD 算法时得到了意外的输出。

这是我的训练数据的一部分,通常有 320 行:

我的数据集:https://github.com/Jangrae/csv/blob/master/carseats.csv

我首先做了一些数据预处理:

import pandas as pd
from sklearn.preprocessing import StandardScaler
import numpy as np

train_data = pd.read_csv('carseats_train.csv')
train_data.replace({'Yes': 1, 'No': 0}, inplace=True)
onehot_tr = pd.get_dummies(train_data['ShelveLoc'], dtype=int, prefix_sep='_', prefix='ShelveLoc')
train_data = train_data.drop('ShelveLoc', axis=1)
train_data = train_data.join(onehot_tr)


train_data_Y = train_data.iloc[:, 0]
train_data_X = train_data.drop('Sales', axis=1)

然后实现这样的算法:

learning_rate = 0.01
epoch_num = 50
initial_w = 0.1
intercept = 0.1
w_matrix = np.ones((12, 1)) * initial_w

for e in range(epoch_num):
    for i in range(len(train_data_X)):

        x_i = train_data_X.iloc[i].to_numpy()
        y_i = train_data_Y.iloc[i]
        
        y_estimated = np.dot(x_i, w_matrix) + intercept
        
        grad_w = x_i.reshape(-1, 1) * (y_i - y_estimated)
    
        grad_intercept = (y_i - y_estimated)
        
       
        w_matrix = w_matrix - 2 * learning_rate * grad_w
        intercept = intercept - 2 * learning_rate * grad_intercept
        
        

print("Final weights:\n", w_matrix)
print("Final intercept:", intercept)

但是输出是

Final weights:
 [[nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]
 [nan]]
Final intercept: [nan]

我用不同的学习率运行它,我也尝试了收敛阈值,但仍然得到相同的结果..我不明白为什么我的代码给了我nans..

有人能看到这个问题吗?

python machine-learning linear-regression gradient-descent stochastic-gradient
1个回答
0
投票

您的代码中出现数字溢出。根据您的设置,渐变基本上会变得太大。考虑采用更多的纪元和更低的学习率(又名“步长”)来使算法收敛。我能够以

0.000001
的学习率获得结果,但是您必须查看训练集的“正确”数字是什么,并监视收敛性(取决于时期数)。您还可以考虑自适应学习率计划。

另一点:我不太确定你的方程是否正确。由于您使用

(y_i - y_estimated)
而不是相反,因此您可能需要更新权重并使用
+
进行拦截(如果您愿意,可以使用“双减”)。也许你可以再检查一下。

PS:你的算法还不是“随机的”。 ;D

© www.soinside.com 2019 - 2024. All rights reserved.