Модель логестической регрессии не учится - PullRequest
0 голосов
/ 06 января 2019

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

class logistic_regression(neural_network):
    def __init__(self,data):

        self.data = data   # to store the the data location in a varable 
        self.data1 = load_data(self.data) # load the data 
        self.weights =  np.random.normal(0,1,self.data1.shape[1] -1)   # use the number of attributes to get the number of weights
        self.bias = np.random.randn(1) #  set the bias to a random number 
        self.x = self.data1.iloc[:,0:9] # split the xs and ys
        self.y = self.data1.iloc[:,9:10]
        self.x = np.array(self.x)
        self.y = np.array(self.y)

        print(self.weights)
        print(np.dot(self.x[0].T,self.weights))
    def load_data(self,file):
        data = pd.read_csv(file)
        return data
    def sigmoid(self,x): # acivation function to limit the value to 0 and 1
        return 1 / (1 + np.exp(-x))
    def sigmoid_prime(self,x):
        return self.sigmoid(x) * (1 - self.sigmoid(x))
    def train(self):
        error = 0 # init the error to zero
        learning_rate = 0.01
        for interation in range(100):
            for i in range(len(self.x)): # loop though all the data
                pred = np.dot(self.x[i].T,self.weights) + self.bias # calculate the output
                pred1 = self.sigmoid(pred)
                error = (pred1 - self.y[i])**2 # check the accuracy of the network

                self.bias -= learning_rate * pred1 - self.y[i] * self.sigmoid_prime(pred1)
                self.weights -= learning_rate * (pred1 - self.y[i]) * self.sigmoid_prime(pred1) *  self.x[i]

            print(str(pred1)+"pred")
            print(str(error) + "error")  # print the result
            print(pred1[0] - self.y[i][0])
    def test(self):

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Сломанные производные

У вас есть ошибка в настройке self.bias, отсутствует скобка вокруг pred1-self.y [i].

Кроме того, вы вычисляете производную от неправильной переменной - кажется, что вместо self.sigmoid_prime (pred1) вам понадобится self.sigmoid_prime (pred).

Тест на игрушечном примере

Для любого такого кода я бы предложил сначала проверить его на очень простой функции, в которой тривиально распечатать все промежуточные значения и проверить их на бумаге. Например, логические функции И и ИЛИ. Это покажет вам, правильно ли вы получили формулы обновления, изолируя код обучения от особенностей вашей реальной учебной задачи.

0 голосов
/ 06 января 2019

Вы не можете обучить любую модель машинного обучения, используя только одну метку. Полученная модель будет иметь только один ответ, независимо от того, какие данные теста используются - метка, указанная во время обучения.

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