вывод становится одинаковым для каждого класса для логистической регрессии в наборе данных вин из scikit-learn - PullRequest
0 голосов
/ 12 сентября 2018

Код Python:

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

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)

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

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

Я использовал логистическую регрессию с 1 скрытым слоем.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...