Stochasti c Градиент приличный для регрессии L2 - PullRequest
1 голос
/ 09 января 2020

Я пытался закодировать SGD для лог-регрессии L2 в Python. Но моя средняя потеря остается почти одинаковой для каждой эпохи. Может кто-нибудь помочь мне с кодом. Код: Функция для прогнозирования Y

def predict(row, coefficients):
    yhat = coefficients[0]
    for i in range(len(row)-1):
        yhat += coefficients[i + 1] * row[i]
    return 1.0 / (1.0 + exp(-yhat))

Функция для расчета потерь

def loss_func(w,x_i,lam):
    y=x_i['y']
    yhat=predict(x_i[:-1],w)
    loss=(y*np.log(yhat))-((1-y)*np.log(1-yhat))+(lam*np.linalg.norm(w)/2)
    return loss

Функция для обновления весов

def weights(w,x,lrate,n_epoch,lam):
    total_loss_lst=[0,1]
    for epoch in range(n_epoch):
        sum_error=0
        total_loss=0
        for k in range(len(x)):
            x_i=x.iloc[k]
            total_loss+=loss_func(w,x_i,lam)

        each_row=x.iloc[np.random.randint(len(x))]
        y_pred=predict(each_row[:-1],w)
        error=y_pred-each_row['y']
        w[0]=w[0]+(lrate*error)
        for i in range(0,len(each_row)-1):
            #print(each_row[i])
            w[i+1]=w[i+1]-(lrate*error*y_pred*(1-y_pred)*each_row[i])
            #w[i+1]=w[i+1]+(lrate*error*each_row[i])
        total_loss_lst.append(total_loss/len(x))
        print('>epoch=%d, lrate=%.3f, error=%.3f' % (epoch, lrate, total_loss/len(x)))
    return w

Инициирование вектора функции w - это все ноль в первом случае.

weights(w,x,.0001,10,.0001) 

Я получаю вывод ниже.

>epoch=0, lrate=0.000, error=0.274
>epoch=1, lrate=0.000, error=0.274
>epoch=2, lrate=0.000, error=0.274
>epoch=3, lrate=0.000, error=0.274
>epoch=4, lrate=0.000, error=0.274
>epoch=5, lrate=0.000, error=0.275
>epoch=6, lrate=0.000, error=0.275
>epoch=7, lrate=0.000, error=0.275
>epoch=8, lrate=0.000, error=0.275
>epoch=9, lrate=0.000, error=0.275

Веса обновляются, но потери очень похожи. Но выход потерь склеарна варьируется от .45 до .37.

Спасибо

1 Ответ

0 голосов
/ 09 января 2020

Я только кратко рассмотрел ваш код, потому что его трудно расшифровать, но алгоритм может застрять на локальном минимуме. Попробуйте создать экземпляр случайных значений вместо нулевого вектора

...