技术专栏
机器学习(三):使用更复杂的回归模型进行房价预测
在上一篇文章中,我们介绍了如何使用线性回归模型进行房价预测。我们发现虽然结果能够预测数据的走向,但是并不能很好地贴合数据。因此我们将尝试使用更加复杂的模型对数据进行预测,观察预测结果并尝试分析并解决随之而来的诸多问题。
一、使用二次模型进行预测
线性回归模型中,我们用来拟合数据的函数模型为直线函数,格式为y=ax+b,该模型一共有两个参数a,b。二次模型中,拟合的函数模型为y=ax^2+bx+c,一共有三个参数a,b,c。同样,损失函数定义为:
损失函数对三个参数的偏导数为:
具体编程实现如下:
导入数据集并进行处理:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 导入数据
datasFile=pd.read_csv('data/data1810/data.txt',names=['size','price'])
datas=np.array(datasFile)
# 划分数据集
trainSet=datas[0:600,:]
testSet=datas[600:,:]
trainX=trainSet[:,0]
trainY=trainSet[:,1]
testX=testSet[:,0]
testY=testSet[:,1]
# 归一化数据,最大最小值按照训练数据集来取
trainX_min_max=(trainX-np.min(trainX))/(np.max(trainX)-np.min(trainX));
trainY_min_max=(trainY-np.min(trainY))/(np.max(trainY)-np.min(trainY));
testX_min_max=(testX-np.min(testX))/(np.max(testX)-np.min(testX));
testY_min_max=(testY-np.min(testY))/(np.max(testY)-np.min(testY));
使用回归模型进行训练,注意,回归模型为二次模型:
import random
# 初始化回归相关参数值
a=random.random()# 随机初始化一个值
b=random.random()
c=random.random()
x=trainX_min_max
y=trainY_min_max
lr=0.05# 学习率
iter=1000 # 训练次数
# 开始训练
for i in range(iter):
predict=a*x*x+b*x+c # 使用二次函数预测
# 计算损失函数
J=np.mean((predict-y)*(predict-y))
# 计算损失函数的梯度值
J_grad_a=np.mean((predict-y)*x*x)
J_grad_b=np.mean((predict-y)*x)
J_grad_c=np.mean(predict-y)
# 进行参数迭代
a=a-lr*J_grad_a
b=b-lr*J_grad_b
c=c-lr*J_grad_c
# 打印参数的值
print("iter=%d," % i)
print("cost=%.3f" % J)
print("a=%.3f," % a)
print("b=%.3f," % b)
print("c=%.3f," % c)
print("\n")
训练结果如图:
结果可视化:
用训练好的模型进行预测:
# 进行预测
x=testX_min_max
y=testY_min_max
result=a*x*x+b*x+c
# 计算预测误差
err=np.mean((result-y)*(result-y))
# 打印误差
print('err=%.3f' % err)
# 绘制拟合结果
plt.scatter(x,y)
plt.scatter(x,result)
误差为:
结果可视化:
相关完整代码如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# 导入数据
datasFile=pd.read_csv('data/data1810/data.txt',names=['size','price'])
datas=np.array(datasFile)
# 划分数据集
trainSet=datas[0:600,:]
testSet=datas[600:,:]
trainX=trainSet[:,0]
trainY=trainSet[:,1]
testX=testSet[:,0]
testY=testSet[:,1]
# 归一化数据,最大最小值按照训练数据集来取
trainX_min_max=(trainX-np.min(trainX))/(np.max(trainX)-np.min(trainX));
trainY_min_max=(trainY-np.min(trainY))/(np.max(trainY)-np.min(trainY));
testX_min_max=(testX-np.min(testX))/(np.max(testX)-np.min(testX));
testY_min_max=(testY-np.min(testY))/(np.max(testY)-np.min(testY));
import random
# 初始化回归相关参数值
a=random.random()# 随机初始化一个值
b=random.random()
c=random.random()
x=trainX_min_max
y=trainY_min_max
lr=0.05# 学习率
iter=1000 # 训练次数
# 开始训练
for i in range(iter):
predict=a*x*x+b*x+c # 使用二次函数预测
# 计算损失函数
J=np.mean((predict-y)*(predict-y))
# 计算损失函数的梯度值
J_grad_a=np.mean((predict-y)*x*x)
J_grad_b=np.mean((predict-y)*x)
J_grad_c=np.mean(predict-y)
# 进行参数迭代
a=a-lr*J_grad_a
b=b-lr*J_grad_b
c=c-lr*J_grad_c
# 打印参数的值
print("iter=%d," % i)
print("cost=%.3f" % J)
print("a=%.3f," % a)
print("b=%.3f," % b)
print("c=%.3f," % c)
print("\n")
# 结果可视化
plt.scatter(trainX_min_max,trainY_min_max)
plt.scatter(trainX_min_max,predict)
# 进行预测
x=testX_min_max
y=testY_min_max
result=a*x*x+b*x+c
# 计算预测误差
err=np.mean((result-y)*(result-y))
# 打印误差
print('err=%.3f' % err)
# 绘制拟合结果
plt.scatter(x,y)
plt.scatter(x,result)
我们发现,使用二次模型时训练数据的误差没有发生改变,但是测试集的误差有所降低。可见,采用更复杂的模型的确能够更精准地预测数据。
二、总结与展望
根据目前的结果,我们可以得出简单的结论:复杂的模型能够更好地拟合数据,提高预测精度。但是模型越复杂越好吗?更复杂的模型会带来什么问题呢?我们将在之后的文章中进行分析。
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
97
8
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:10789次2021-02-21 21:57:48
-
浏览量:197次2023-08-15 22:50:27
-
浏览量:9391次2021-02-23 16:44:17
-
浏览量:863次2023-03-01 09:36:58
-
浏览量:486次2023-09-04 18:54:46
-
浏览量:1282次2023-01-05 17:44:00
-
浏览量:5590次2021-08-12 14:06:09
-
浏览量:4992次2021-04-21 17:06:33
-
浏览量:5627次2021-02-20 17:09:58
-
浏览量:5542次2021-02-28 15:11:37
-
浏览量:1012次2023-03-02 13:55:57
-
浏览量:962次2023-01-12 17:08:25
-
浏览量:9711次2021-04-20 15:42:26
-
浏览量:5026次2021-07-12 11:02:32
-
2023-01-13 11:35:13
-
浏览量:895次2023-09-04 16:04:31
-
浏览量:5797次2021-04-14 16:24:29
-
浏览量:5586次2021-04-20 15:43:03
-
浏览量:5034次2021-07-26 11:25:51
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
技术凯
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注