Веса не обновляются при обучении логистической регрессии с использованием набора данных iris - PullRequest
0 голосов
/ 10 сентября 2018

Код Python:

Я использовал Python code, как показано ниже. Здесь машина обучается с использованием Logistic Regression algorithm и wine dataset. Здесь проблема в том, что веса не обновляются. Я не понимаю, где проблема.

from sklearn import datasets
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

dataset = datasets.load_wine()
x = dataset.data
y = dataset.target
y = y.reshape(178,1)

x_train,x_test,y_train,y_test =   train_test_split(x,y,test_size=0.15,shuffle=True)
print(x_train.shape)
class log_reg():
    def __init__(self):
        pass
    def sigmoid(self,x):
        return 1 / (1 + np.exp(-x))
    def train(self,x,y,w1,w2,alpha,iterations):
        cost_history = [0] * iterations
        Y_train = np.zeros([y.shape[0],3])
        for i in range(Y_train.shape[0]):
            for j in range(Y_train.shape[1]):
                if(y[i] == j):
                    Y_train[i,j] = 1
        for iteration in range(iterations):
            z1 = x.dot(w1)
            a1 = self.sigmoid(z1)
            z2 = a1.dot(w2)
            a2 = self.sigmoid(z2)
            sig_sum = np.sum(np.exp(a2),axis=1)
            sig_sum = sig_sum.reshape(a2.shape[0],1)
            op = np.exp(a2) / sig_sum
            loss = (Y_train * np.log(op))
            dl =  (op-Y_train)
            dz1 = ((dl*(self.sigmoid(z2))*(1-self.sigmoid(z2))).dot(w2.T))*(self.sigmoid(z1))*(1-self.sigmoid(z1))
            dz2 = (dl * (self.sigmoid(z2))*(1-self.sigmoid(z2)))
            dw1 = x.T.dot(dz1)
            dw2 = a1.T.dot(dz2)
            w1 += alpha * dw1 
            w2 += alpha * dw2 
            cost_history[iteration] = (np.sum(loss)/len(loss))
        return w1,w2,cost_history
    def predict(self,x,y,w1,w2):
        z1 = x.dot(w1)
        a1 = self.sigmoid(z1)
        z2 = a1.dot(w2)
        a2 = self.sigmoid(z2)
        sig_sum = np.sum(np.exp(a2),axis=1)
        sig_sum = sig_sum.reshape(a2.shape[0],1)
        op = np.exp(a2) / sig_sum
        y_preds = np.argmax(op,axis=1)
        acc = self.accuracy(y_preds,y)
        return y_preds,acc
    def accuracy(self,y_preds,y):
        y_preds = y_preds.reshape(len(y_preds),1)
        correct = (y_preds == y)
        accuracy = (np.sum(correct) / len(y)) * 100
        return (accuracy)

if __name__ == "__main__":
    network = log_reg()
    w1 = np.random.randn(14,4) * 0.01
    w2 = np.random.randn(4,3) * 0.01
    X_train = np.ones([x_train.shape[0],x_train.shape[1]+1])
    X_train[:,:-1] = x_train
    X_test = np.ones([x_test.shape[0],x_test.shape[1]+1])
    X_test[:,:-1] = x_test
    new_w1,new_w2,cost = network.train(X_train,y_train,w1,w2,0.0045,10000)
    y_preds,accuracy = network.predict(X_test,y_test,new_w1,new_w2)
    print(y_preds,accuracy)

В приведенном выше коде parameters упоминается как ниже

x--training set,
y--target(output),
w1--weights for first layer,
w2--weights for second layer,

Я использовал logistic regression with 2 hidden layers.

Я пытаюсь обучить вино набора данных из sklearn. Я не знаю, где проблема, но вес не обновляется. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 10 сентября 2018

Ваш вес обновляется, но я думаю, вы не можете видеть, как они меняются, потому что вы печатаете их после выполнения. В Python есть метод ссылки на объект для массивов numpy, поэтому когда вы передаете w1, его значения тоже меняются, поэтому new_w1 и w1 становятся одинаковыми. Возьмите этот пример

import numpy as np
x=np.array([1,2,3,4])
def change(x):
    x+=3
    return x
print(x)
change(x)
print(x)

если вы видите вывод, он выглядит как

[1 2 3 4]
[4 5 6 7]

Я рекомендую вам добавить смещение и исправить функцию точности, поскольку я получаю свою точность как 1000.

Мое исполнение, когда я запускаю код enter image description here

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

if __name__ == "__main__":
    network = log_reg()
    w1 = np.random.randn(13,4) * 0.01
    w2 = np.random.randn(4,3) * 0.01
    print(w1)
    print(" ")
    print(w2)
    print(" ")
    new_w1,new_w2,cost = network.train(x_train,y_train,w1,w2,0.0045,10000)
    print(w1)
    print(" ")
    print(w2)
    print(" ")
    y_preds,accuracy = network.predict(x_test,y_test,new_w1,new_w2)
    print(y_preds,accuracy)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...