【机器学习】梯度下降预测波士顿房价

news/2024/10/23 9:33:00/

文章目录

  • 前言
  • 一、数据集介绍
  • 二、预测房价代码
    • 1.引入库
    • 2.数据
    • 3.梯度下降
  • 总结


前言

梯度下降算法学习。

一、数据集介绍

波士顿房价数据集:波士顿房价数据集,用于线性回归预测

二、预测房价代码

1.引入库

from sklearn.linear_model import LinearRegression as LR
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston as boston 
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
import numpy as np
from sklearn.metrics import mean_squared_error

2.数据

def preprocess():# get the dataset of bostonX = boston().datay = boston().targetname_data = boston().feature_names# draw the figure of relationship between feature and priceplt.figure(figsize=(20,20))for i in range(len(X[0])):plt.subplot(5, 3, i + 1)plt.scatter(X[:, i], y, s=20)plt.title(name_data[i])plt.show()# 删除相关性较低的特征# X = np.delete(X, [0, 1, 3, 4, 6, 7, 8, 9, 11], axis=1)# normalizationfor i in range(len(X[0])):X[:, i] = (X[:, i] - X[:, i].min()) / (X[:, i].max() - X[:, i].min())# split into test and trainXtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3, random_state=10)return Xtrain, Xtest, Ytrain, Ytest, X
def lr(Xtrain, Xtest, Ytrain, Ytest, if_figure):# use LinearRegressionreg = LR().fit(Xtrain, Ytrain)y_pred = reg.predict(Xtest)loss = mean_squared_error(Ytest, y_pred)print("*************LR*****************")print("w\t= {}".format(reg.coef_))print("b\t= {:.4f}".format(reg.intercept_))# draw the figure of predict resultsif if_figure:plt.figure(figsize = (14,6),dpi = 80)plt.plot(range(len(Ytest)), Ytest, c="blue", label="real")plt.plot(range(len(y_pred)), y_pred, c="red", linestyle=':', label="predict")plt.title("predict results from row LR")plt.legend()plt.show()return loss

3.梯度下降

def gradDescnet(Xtrain, Xtest, Ytrain, Ytest, X, if_figure, rate):# 梯度下降def grad(y, yp, X):grad_w = (y - yp) * (-X)grad_b = (y - yp) * (-1)return [grad_w, grad_b]# 设置训练参数epoch_train = 100learning_rate = ratew = np.random.normal(0.0, 1.0, (1, len(X[0])))b = 0.0   loss_train = []loss_test = []for epoch in range(epoch_train + 1):loss1 = 0for i in range(len(Xtrain)):yp = w.dot(Xtrain[i]) + b# 计算损失err = Ytrain[i] - yploss1 += err ** 2# 迭代更新 w 和 bgw = grad(Ytrain[i], yp, Xtrain[i])[0]gb = grad(Ytrain[i], yp, Xtrain[i])[1]w = w - learning_rate * gwb = b - learning_rate * gb# 记录损失loss_train.append(loss1 / len(Xtrain))loss11 = 0for i in range(len(Xtest)):yp2 = w.dot(Xtest[i]) + berr2 = Ytest[i] - yp2loss11 += err2 ** 2# 记录损失loss_test.append(loss11 / len(Xtest))# shuffle the dataXtrain, Ytrain = shuffle(Xtrain, Ytrain)# draw the figure of lossif if_figure:plt.figure()plt.title("figure of loss")plt.plot(range(len(loss_train)), loss_train, c="blue", linestyle=":", label="train")plt.plot(range(len(loss_test)), loss_test, c="red", label="test")plt.legend()plt.show()# draw figure of predict resultsif if_figure:Predict_value = []for i in range(len(Xtest)):Predict_value.append(w.dot(Xtest[i]) + b)plt.figure()plt.title("predict results from gradScent")plt.plot(range(len(Xtest)), Ytest, c="blue", label="real")plt.plot(range(len(Xtest)), Predict_value, c="red", linestyle=':', label="predict")plt.legend()plt.show()return loss_test[-1], w, b
def test():if_figure = TrueXtrain, Xtest, Ytrain, Ytest, X = preprocess()loss_lr = lr(Xtrain, Xtest, Ytrain, Ytest, if_figure)loss_gd, w, b = gradDescnet(Xtrain, Xtest, Ytrain, Ytest, X, if_figure, 0.01)print("*************GD*****************")      print("w\t: {}".format(w))print("b\t: {}".format(b))print("************loss****************")print("lr\t: %.4f" % loss_lr)print("gd\t: %.4f" % loss_gd)
def searchRate():if_figure = FalseXtrain, Xtest, Ytrain, Ytest, X = preprocess()loss_grad = []w_grad = []b_grad = []rates = list(np.arange(0.001, 0.05, 0.001))epoch = 1for rate in rates:loss, w, b = gradDescnet(Xtrain, Xtest, Ytrain, Ytest, X, if_figure, rate)loss_grad.append(loss[0])w_grad.append(w)b_grad.append(b)print("epoch %d: %.4f" % (epoch, loss_grad[-1]))epoch += 1plt.figure()plt.plot(rates, loss_grad)plt.title("loss under different rate")plt.show()loss_grad_min = min(loss_grad)position = loss_grad.index(loss_grad_min)w = w_grad[position]b = b_grad[position]rate = rates[position]loss_lr = lr(Xtrain, Xtest, Ytrain, Ytest, if_figure)print("*************GD*****************")print("w\t: {}".format(w))print("b\t: {}".format(b))print("rate: %.3f" % rate)print("************loss****************")print("lr\t: %.4f" % loss_lr)print("gd\t: %.4f" % loss_grad_min)

data = boston
Xtrain, Xtest, Ytrain, Ytest, X = preprocess()

在这里插入图片描述

lr(Xtrain, Xtest, Ytrain, Ytest,True)

在这里插入图片描述

test()

在这里插入图片描述在这里插入图片描述

searchRate()

在这里插入图片描述
在这里插入图片描述

总结

通过此次学习,对梯度下降算法有了更深的认识。


http://www.ppmy.cn/news/1204087.html

相关文章

Spring Cloud - 手写 Gateway 源码,实现自定义局部 FilterFactory

目录 一、FilterFactory 分析 1.1、前置知识 1.2、分析源码 1.2.1、整体分析 1.2.2、源码分析 1.3、手写源码 1.3.1、基础框架 1.3.2、实现自定义局部过滤器 1.3.3、加参数的自定义局部过滤器器 一、FilterFactory 分析 1.1、前置知识 前面的学习我们知道&#xff0c…

两数之和(哈希解法)

题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任…

面包屑实现

背景:面包屑根据菜单内容显示不同内容。首页永远存在,后面的活动管理及多级菜单的面包屑展示。 实现原理: 通过this.$route.matched获取所有匹配路由,将处理首页外的其他路由设置到一个数组中,再通过数组循环方式显示…

界面组件Telerik UI for WinForms中文教程 - 如何自定义应用程序文件窗口?

Telerik UI for WinForms包含了一个高度可定制的组件,它取代了.NET中默认的OpenFileDialog。在下一个更新版本中,会发布一个向对话框浏览器提那家自定义位置的请求功能,本文演示了这个和另一个自定义功能,它可以帮助用户在浏览文件…

美容美发行业小程序源码系统+在线预约+会员卡 带完整的搭建教程

大家好啊,今天源码小编又来给大家分享了,今天要分享的是一款美容美发行业小程序源码系统。系统采用的是PHPMySQL组合开发。现如今,美容美发行业的发展迅速,市场竞争也日趋激烈。为了满足市场需求,提高自身竞争力&#…

第八章《搞懂算法:逻辑回归是怎么回事》笔记

8.1 如何理解逻辑回归 逻辑回归根据给定的自变量数据集来估计事件的发生概率,由于结果是一个概率,因此因变量的范围在 0 和 1 之间。 逻辑回归的与线性回归一样,也是以线性函数为基础的;而与线性回归不同的是,逻辑回…

算法训练 第六周

一、用栈实现队列 本题要求我们使用栈这个数据结构来模拟实现队列的各种操作,我们的具体思路是使用两个栈,将一个栈当作输入栈,用于压入 push传入的数据;另一个栈当作输出栈,用于 pop和 peek 操作。每次 pop 或 peek 时…

从TCP到Socket,彻底理解网络编程是怎么回事

进行程序开发的同学,无论Web前端开发、Web后端开发,还是搜索引擎和大数据,几乎所有的开发领域都会涉及到网络编程。比如我们进行Web服务端开发,除了Web协议本身依赖网络外,通常还需要连接数据库,而数据库连…