在为我的ML作业(job)实现SGD算法时,我有一个意外的输出.

This is part of my training data which normally has 320 rows: enter image description here

我的数据集: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]

我用不同的学习速率运行它,我也try 了收敛阈值,但仍然得到了相同的结果.我找不到为什么我的代码给了我NAN..

有人能看出来这个问题吗?

推荐答案

你的代码中出现了数字溢出.梯度基本上得到太大与您的设置.考虑采取更多的时期和更低的学习率(又名."step-size")来使算法收敛.我能够以0.000001的学习率得到结果,但你必须看到你的训练集的"正确"数字是多少,还要监控收敛性(取决于epoch的数量).你也可以考虑一个自适应学习率计划.

另外,我不能完全肯定你的方程式是正确的.由于您使用的是(y_i - y_estimated),而不是反之亦然,因此您可能需要更新您的权重,并使用+(如果您愿意,可以使用"双减号")进行截取.也许你可以再查一遍.(仅供比较:herehere)

PS:你的算法还不是"随机的".D;

Python相关问答推荐

决策树分类器的基础sklearn熵和log_loss标准是否有差异?

如何从同一类的多个元素中抓取数据?

如何在Pandas 中存储二进制数?

Pandas数据帧处理Pandas表中Json内的嵌套列表以获取后续Numpy数组

基本链合同的地址是如何计算的?

在Python中为变量的缺失值创建虚拟值

如何使用矩阵在sklearn中同时对每个列执行matthews_corrcoef?

如何根据条件在多指标框架上进行groupby

剧作家Python没有得到回应

分组数据并删除重复数据

即使在可见的情况下也不相互作用

acme错误-Veritas错误:模块收件箱没有属性linear_util'

将jit与numpy linSpace函数一起使用时出错

运行总计基于多列pandas的分组和总和

从dict的列中分钟

两个pandas的平均值按元素的结果串接元素.为什么?

在含噪声的3D点网格中识别4连通点模式

如何启动下载并在不击中磁盘的情况下呈现响应?

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

如何创建引用列表并分配值的Systemrame列