我在为我的 ML 作业实现 SGD 算法时得到了意外的输出。
我的数据集: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..
有人能看到这个问题吗?
您的代码中出现数字溢出。根据您的设置,渐变基本上会变得太大。考虑采用更多的纪元和更低的学习率(又名“步长”)来使算法收敛。我能够以
0.000001
的学习率获得结果,但是您必须查看训练集的“正确”数字是什么,并监视收敛性(取决于时期数)。您还可以考虑自适应学习率计划。
另一点:我不太确定你的方程是否正确。由于您使用
(y_i - y_estimated)
而不是相反,因此您可能需要更新权重并使用 +
进行拦截(如果您愿意,可以使用“双减”)。也许你可以再检查一下。
PS:你的算法还不是“随机的”。 ;D