Python 线性回归损失递增

Python 线性回归损失递增,python,machine-learning,regression,linear-regression,Python,Machine Learning,Regression,Linear Regression,我从头开始写了一个线性回归,但是损失在增加。我的数据是休斯顿住房数据集的面积和价格(作为标签)。我尝试了多种学习速率(从10到0.0000000000),但它仍然不起作用。每过一个历元,我的拟合线/函数都会离数据点越来越远。我想这些函数肯定有问题,但我不知道是什么。 以下是损失的一个例子: loss: 0.5977188541860982 loss: 0.6003449724263221 loss: 0.6029841845821928 loss: 0.6056365560589673 loss

我从头开始写了一个线性回归,但是损失在增加。我的数据是休斯顿住房数据集的面积和价格(作为标签)。我尝试了多种学习速率(从10到0.0000000000),但它仍然不起作用。每过一个历元,我的拟合线/函数都会离数据点越来越远。我想这些函数肯定有问题,但我不知道是什么。 以下是损失的一个例子:

loss: 0.5977188541860982
loss: 0.6003449724263221
loss: 0.6029841845821928
loss: 0.6056365560589673
loss: 0.6083021525886172
loss: 0.6109810402314608
loss: 0.6136732853778034
loss: 0.6163789547495854
loss: 0.6190981154020385
loss: 0.6218308347253524
loss: 0.6245771804463445
下面是代码:

from preprocessing import load_csv
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt

# mean squared error
def MSE(y_prediction, y_true, deriv=(False, 1)):
    if deriv[0]:
        # deriv[1] is the  derivitive of the fit_function
        return 2 * np.mean(np.subtract(y_true, y_prediction) * deriv[1])
    return np.mean(np.square(np.subtract(y_true, y_prediction)))

# linear function
def fit_function(theta_0, theta_1, x):
    return theta_0 + (theta_1 * x)

# train model
def train(dataset, epochs=10, lr=0.01):
    # loadinh and normalizing the data
    x = (v := np.array(dataset["GrLivArea"].tolist()[:100])) / max(v)
    y = (l := np.array(dataset["SalePrice"].tolist()[:100])) / max(l)

    # y-intercept
    theta_0 = random.uniform(min(y), max(y))
    # slope
    theta_1 = random.uniform(-1, 1)

    for epoch in range(epochs):

        predictions = fit_function(theta_0, theta_1, x)
        loss = MSE(predictions, y)

        delta_theta_0 = MSE(predictions, y, deriv=(True, 1))
        delta_theta_1 = MSE(predictions, y, deriv=(True, x))

        theta_0 -= lr * delta_theta_0
        theta_1 -= lr * delta_theta_1

        print("\nloss:", loss)


    plt.style.use("ggplot")
    plt.scatter(x, y)
    x, predictions = map(list, zip(*sorted(zip(x, predictions))))
    plt.plot(x, predictions, "b--")

    plt.show()


train(load_csv("dataset/houston_housing/single_variable_dataset/train.csv"), epochs=500, lr=0.001)

这是500年后的情节。


谢谢你的帮助:)

这是一篇很老的帖子,但我想我还是会给出答案的

您翻转了MSE导数上的符号:

def MSE(y_prediction, y_true, deriv=(False, 1)):
    if deriv[0]:
        return 2 * np.mean(np.subtract(y_prediction, y_true) * deriv[1])
    return np.mean(np.square(np.subtract(y_true, y_prediction)))
偏导数w.r.t.参数为:


为了简洁起见:

def MSE(y_prediction, y_true, deriv=None):
    if deriv is not None:
        return 2 * np.mean((y_prediction - y_true)*deriv)
    return np.mean((y_prediction - y_true)**2)
它允许您在不传入带有标志的元组的情况下获取导数:

delta_theta_0 = MSE(predictions, y, deriv=1)
delta_theta_1 = MSE(predictions, y, deriv=x)

下面是一个使用
LSTAT
(人口的较低地位)和
MEDV
(1000美元自有住房的中值)作为目标的示例,最后两个数据特征分别作为输入和目标

使用
epochs=10000
lr=0.001
进行培训:


这是一篇很老的帖子,但我想我还是会给出答案的

您翻转了MSE导数上的符号:

def MSE(y_prediction, y_true, deriv=(False, 1)):
    if deriv[0]:
        return 2 * np.mean(np.subtract(y_prediction, y_true) * deriv[1])
    return np.mean(np.square(np.subtract(y_true, y_prediction)))
偏导数w.r.t.参数为:


为了简洁起见:

def MSE(y_prediction, y_true, deriv=None):
    if deriv is not None:
        return 2 * np.mean((y_prediction - y_true)*deriv)
    return np.mean((y_prediction - y_true)**2)
它允许您在不传入带有标志的元组的情况下获取导数:

delta_theta_0 = MSE(predictions, y, deriv=1)
delta_theta_1 = MSE(predictions, y, deriv=x)

下面是一个使用
LSTAT
(人口的较低地位)和
MEDV
(1000美元自有住房的中值)作为目标的示例,最后两个数据特征分别作为输入和目标

使用
epochs=10000
lr=0.001
进行培训:

嘿,谢谢你的回答:)我当时解决这个问题的方法是保持它
y_true-y_pred
然后乘以负链规则因子y,谢谢你的回答:)我当时解决这个问题的方法是保持它
y_true-y_pred
然后乘以负链规则因子