Увеличение стоимости линейной регрессии - PullRequest
0 голосов
/ 30 августа 2018

В целях обучения я реализовал линейную регрессию в python. Проблема в том, что стоимость увеличивается, а не уменьшается. Для данных я использую набор данных Airfoil Self-Noise. Данные можно найти здесь

Я импортирую данные следующим образом:

import pandas as pd

def features():

    features = pd.read_csv("data/airfoil_self_noise/airfoil_self_noise.dat.txt", sep="\t", header=None)

    X = features.iloc[:, 0:5]
    Y = features.iloc[:, 5]

    return X.values, Y.values.reshape(Y.shape[0], 1)

Мой код для линейной регрессии следующий:

import numpy as np
import random

class linearRegression():

    def __init__(self, learning_rate=0.01, max_iter=20):
        """
        Initialize the hyperparameters of the linear regression.

        :param learning_rate: the learning rate
        :param max_iter: the max numer of iteration to perform
        """

        self.lr = learning_rate
        self.max_iter = max_iter
        self.m = None
        self.weights = None
        self.bias = None

    def fit(self, X, Y):
        """
        Run gradient descent algorithm

        :param X: the inputs
        :param Y: the outputs
        :return:
        """

        self.m = X.shape[0]
        self.weights = np.random.normal(0, 0.1, (X.shape[1], 1))
        self.bias = random.normalvariate(0, 0.1)

        for iter in range(0, self.max_iter):

            A = self.__forward(X)
            dw, db = self.__backward(A, X, Y)

            J = (1/(2 * self.m)) * np.sum(np.power((A - Y), 2))

            print("at iteration %s cost is %s" % (iter, J))

            self.weights = self.weights - self.lr * dw
            self.bias = self.bias - self.lr * db

    def predict(self, X):
        """
        Make prediction on the inputs

        :param X: the inputs
        :return:
        """

        Y_pred = self.__forward(X)

        return Y_pred

    def __forward(self, X):
        """
        Compute the linear function on the inputs

        :param X: the inputs
        :return:
            A: the activation
        """

        A = np.dot(X, self.weights) + self.bias

        return A

    def __backward(self, A, X, Y):
        """

        :param A: the activation
        :param X: the inputs
        :param Y: the outputs
        :return:
            dw: the gradient for the weights
            db: the gradient for the bias
        """

        dw = (1 / self.m) * np.dot(X.T, (A - Y))
        db = (1 / self.m) * np.sum(A - Y)

        return dw, db

Затем я создаю экземпляр класса linearRegression следующим образом:

X, Y = features()
model = linearRegression()
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=42)
model.fit(X_train, y_train)

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

Ответы [ 3 ]

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

Ваша скорость обучения очень слишком высокая. Когда я запускаю ваш код без изменений, за исключением скорости обучения 1e-7 вместо 0,01, я получаю надежно снижающиеся затраты.

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

Как правило, скорость обучения слишком высока, когда стоимость увеличивается.

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

Обычно, если вы выбрали большую скорость обучения, у вас может быть похожая проблема. Я пытался проверить ваш код, и мои наблюдения:

  • Ваша функция стоимости J, кажется, в порядке.
  • но в своей обратной функции вы, кажется, вычитаете свои реальные результаты из ваших догадок Таким образом, вы можете получить отрицательные веса, и, поскольку вы вычитаете умножение вашей скорости обучения и вашей оценки из весов и градиентов, вы в конечном итоге получаете результаты функции повышенной стоимости
...