python - 线性回归损失增加
问题描述
我从头开始写了一个线性回归,但损失正在增加。我的数据是休斯顿住房数据集的区域和价格(作为标签)。我尝试了多种学习率(从 10 到 0.00000000001),但仍然无法正常工作。在每个时期,我的拟合线/函数都在远离数据点。我猜的功能一定有问题,但我不知道是什么。这是一个损失的例子:
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)
谢谢你的帮助 :)
解决方案
相当老的帖子,但我想我还是会给出答案。
您翻转了 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)))
你参数的偏导数是:
为了简洁:
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)
下面是一个示例,使用sklearn.datasets.load_boston
(LSTAT
较低的人口地位)和MEDV
(以 1000 美元为单位的自住房屋的中值)作为目标,最后两个数据特征分别作为输入和目标。
epochs=10000
用和训练lr=0.001
:
推荐阅读
- c# - 如何在 LINQ 中使用 SQL 内连接语句作为查询
- python - 安装 Python 模块 Pygame 和 Pygame Zero 时出错
- css - 我如何使用 max()/min() 作为 css-math-functions 而不是 stylus-bulidin-functions
- c - 交叉编译时添加 -O2 选项会导致展开回溯失败
- c# - 从 html c# 在 iTextSharp pdf 中显示中文文本
- google-tag-manager - 使用 Google 跟踪代码管理器捕获 HTTP 请求 URL
- c++ - Makefile 缺少包含路径 虽然路径存在并已定义
- scrapy - Scrapy:蜘蛛关闭前的批处理
- javascript - 如何按集合中的相同键进行分组
- ios - Corner radius not properly fit in dynamic grouped tableView swift