之前,我们分别使用线性模型以及二次模型对数据进行拟合,发现模型复杂度越高,越能贴合数据,预测精度越高。因此,我们是否可以认为只要算力条件充足,我们就可以尽可能地使用高复杂度模型进行函数的拟合?这就是本文讨论的主题:使用更复杂的模型会出现的问题以及解决方式。本文将分别使用线性模型、二次模型、五次模型以及七次模型分别进行房价数据的拟合,观察训练集和测试集的分布,以得到模型复杂度与模型性能的关系。https://www.iyakj.com/h-nd-15.html

  为了使现象更加明显,我们这次仅取少量的数据进行实验:10个数据组成的训练集和5个数据组成的测试集。关于这么做的原因,我们将在下一篇文章中进行解释。数据导入部分代码:

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)
# 取前15个数据进行实验,并划分数据集,10个训练数据和5个测试数据
trainSet=datas[0:10,:]
testSet=datas[10:15,:]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()x=trainX_min_max
y=trainY_min_maxlr=0.1# 学习率
iter=500 # 训练次数
cost=0
# 开始训练
for i in range(1,iter+1):predict=a*x+b # 使用线性函数进行预测# 计算损失函数J=np.mean((predict-y)*(predict-y))cost=np.append(cost,J)# 计算损失函数的梯度值J_grad_a=np.mean((predict-y)*x)J_grad_b=np.mean(predict-y)# 进行参数迭代a=a-lr*J_grad_ab=b-lr*J_grad_b# 打印参数的值if i % 100 == 0:print("iter=%d," % i)print("cost=%.3f" % J)print("a=%.3f," % a)print("b=%.3f," % b)print("\n")plt.plot(cost)

训练结果如下:最终训练集的误差为0.019 损失函数曲线:表明算法已经收敛 将结果可视化:使用训练好的模型进行测试:

# 进行预测
x=testX_min_max
y=testY_min_max
result=a*x+b
# 计算预测误差
err=np.mean((result-y)*(result-y))
# 打印误差
print('err=%.3f' % err)
# 绘制拟合结果
plt.scatter(x,y)
plt.scatter(testX_min_max,result)

测试结果如下:误差为0.028

二、使用二次模型进行预测

import random
# 初始化回归相关参数值
a=random.random()# 随机初始化一个值
b=random.random()
c=random.random()x=trainX_min_max
y=trainY_min_maxlr=0.1# 学习率
iter=500 # 训练次数
cost=0
# 开始训练
for i in range(1,iter+1):predict=a*x*x+b*x+c # 使用二次函数进行预测# 计算损失函数J=np.mean((predict-y)*(predict-y))cost=np.append(cost,J)# 计算损失函数的梯度值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_ab=b-lr*J_grad_bc=c-lr*J_grad_c# 打印参数的值if i % 100 == 0:print("iter=%d," % i)print("cost=%.3f" % J)print("a=%.3f," % a)print("b=%.3f," % b)print("c=%.3f," % c)print("\n")plt.plot(cost)

训练结果如下:可以看出,算法成功收敛,并且误差为0.016,效果优于线性模型,下面将模型运用到测试集上:

# 进行预测
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(testX_min_max,result)

结果如下:测试集正确率为0.019,优于线性模型,符合我们之前的结论:模型越复杂,效果越好

三、使用五次方模型进行预测

训练部分代码:

import random
# 初始化回归相关参数值
a=random.random()# 随机初始化一个值
b=random.random()
c=random.random()
d=random.random()
e=random.random()
f=random.random()x=trainX_min_max
y=trainY_min_maxlr=0.1# 学习率
iter=500 # 训练次数
cost=0
# 开始训练
for i in range(1,iter+1):predict=a*np.power(x,5)+b*np.power(x,4)+c*np.power(x,3)+d*np.power(x,2)+e*x+f # 使用五次函数预测# 计算损失函数J=np.mean((predict-y)*(predict-y))cost=np.append(cost,J)# 计算损失函数的梯度值J_grad_a=np.mean((predict-y)*np.power(x,5))J_grad_b=np.mean((predict-y)*np.power(x,4))J_grad_c=np.mean((predict-y)*np.power(x,3))J_grad_d=np.mean((predict-y)*np.power(x,2))J_grad_e=np.mean((predict-y)*x)J_grad_f=np.mean(predict-y)# 进行参数迭代a=a-lr*J_grad_ab=b-lr*J_grad_bc=c-lr*J_grad_cd=d-lr*J_grad_de=e-lr*J_grad_ef=f-lr*J_grad_f# 打印参数的值if i % 100 == 0:print("iter=%d," % i)print("cost=%.3f" % J)print("a=%.3f," % a)print("b=%.3f," % b)print("c=%.3f," % c)print("d=%.3f," % d)print("e=%.3f," % e)print("f=%.3f," % f)print("\n")plt.plot(cost)

训练结果:算法收敛,最终误差为0.015,优于二次模型,且预测更能贴合真实数据,下面来看测试集的效果:

# 进行预测
x=testX_min_max
y=testY_min_max
result=a*np.power(x,5)+b*np.power(x,4)+c*np.power(x,3)+d*np.power(x,2)+e*x+f
# 计算预测误差
err=np.mean((result-y)*(result-y))
# 打印误差
print('err=%.3f' % err)
# 绘制拟合结果
plt.scatter(x,y)
plt.scatter(testX_min_max,result)

结果如图:误差为0.023,测试集效果不如线性模型和二次模型。

四、七次模型进行预测

训练部分: 代码:

import random
# 初始化回归相关参数值
a=random.random()# 随机初始化一个值
b=random.random()
c=random.random()
d=random.random()
e=random.random()
f=random.random()
g=random.random()
h=random.random()x=trainX_min_max
y=trainY_min_maxlr=0.1# 学习率
iter=2000 # 训练次数
cost=0
# 开始训练
for i in range(1,iter+1):predict=a*np.power(x,7)+b*np.power(x,6)+c*np.power(x,5)+d*np.power(x,4)+e*np.power(x,3)+f*np.power(x,2)+g*x+h # 使用七次函数预测# 计算损失函数J=np.mean((predict-y)*(predict-y))cost=np.append(cost,J)# 计算损失函数的梯度值J_grad_a=np.mean((predict-y)*np.power(x,7))J_grad_b=np.mean((predict-y)*np.power(x,6))J_grad_c=np.mean((predict-y)*np.power(x,5))J_grad_d=np.mean((predict-y)*np.power(x,4))J_grad_e=np.mean((predict-y)*np.power(x,3))J_grad_f=np.mean((predict-y)*np.power(x,2))J_grad_g=np.mean((predict-y)*x)J_grad_h=np.mean(predict-y)# 进行参数迭代a=a-lr*J_grad_ab=b-lr*J_grad_bc=c-lr*J_grad_cd=d-lr*J_grad_de=e-lr*J_grad_ef=f-lr*J_grad_fg=g-lr*J_grad_gh=h-lr*J_grad_h# 打印参数的值if i % 1000 == 0:print("iter=%d," % i)print("cost=%.3f" % J)print("a=%.3f," % a)print("b=%.3f," % b)print("c=%.3f," % c)print("d=%.3f," % d)print("e=%.3f," % e)print("f=%.3f," % f)print("g=%.3f," % g)print("h=%.3f," % h)print("\n")plt.plot(cost)

训练结果如下:算法收敛并且误差为0.012,优于上述所有模型。下面来看测试部分的结果: 代码:

# 进行预测
x=testX_min_max
y=testY_min_max
result=predict=a*np.power(x,7)+b*np.power(x,6)+c*np.power(x,5)+d*np.power(x,4)+e*np.power(x,3)+f*np.power(x,2)+g*x+h
# 计算预测误差
err=np.mean((result-y)*(result-y))
# 打印误差
print('err=%.3f' % err)
# 绘制拟合结果
plt.scatter(x,y)
plt.scatter(testX_min_max,result)

结果如下:误差竟然高达0.027,效果与线性模型接近

五、总结与分析

  经过上述实验,我们发现,模型越复杂,训练集的误差越低,说明拟合结果确实越来越贴合训练数据,这是合乎情理的。但是我们同时发现,模型越复杂,测试集的误差不一定越低,甚至有可能变大。因此,模型复杂度越高,模型的性能不一定越好。那么我们有没有办法克服这个现象呢?下一篇文章,我们将介绍上述现象产生的原因以及解决方法。

机器学习(四):关于模型复杂度与模型性能的关系相关推荐

  1. 《机器学习》周志华 第二章——模型评估与选择笔记

    <机器学习>周志华 第二章--模型评估与选择 过拟合和欠拟合 过拟合:对训练数据拟合过当的情况,训练集表现很好,测试集表现差. 欠拟合:模型在训练和预测时都表现不好. 降低过拟合的方法: ...

  2. SuperMap BIM+GIS-Revit模型处理-第三节 Revit模型优化方法及模型缓存策略

    在模型导入SuperMap平台之后,在应用过程中必然会遇到性能问题,随之而来的就是如何优化模型.本文将总结使用经验和理解,从实际出发介绍几种优化方法和缓存策略.以下操作均在SuperMap iDesk ...

  3. python sklearn.neural_network.MLPClassifier() 神经网络改变模型复杂度的四种方法

    MLPClassifier() 改变模型复杂度的四种方法 调整神经网络每一个隐藏层上的节点数 调节神经网络隐藏层的层数 调节activation的方式 通过调整alpha值来改变模型正则化的程度(增大 ...

  4. 【机器学习基础】一文说透正则项与模型复杂度

    上文留下一个问题,正则项到底是如何控制模型复杂度的?权值越小模型复杂度越小?为什么权值越小模型复杂度越小? 1.模型与模型复杂度 在数据挖掘或机器学习领域我们常听到线性回归模型.逻辑回归模型.支持向量 ...

  5. 【机器学习】隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现

    [机器学习]隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现 一.维特比算法 二.python实现 参考资料 隐马尔可夫模型状态序列预测问题是指给定模型 λ=[A,B,∏]\la ...

  6. 对于机器学习中数据拟合度和模型复杂度的一些建议

    Advice for Applying Machine Learning 我这里想做的是,确保大家在设计机器学习系统时,能够明白怎样选择一条最合适.最正确的路径.因此,接下来我们要讨论一些实用的建议和 ...

  7. Python机器学习实战:掌握这四个特征选择方法,提升模型预测性能

    机器学习实战:这里没有艰深晦涩的数学理论,我们将用简单的案例和大量的示例代码,向大家介绍机器学习的核心概念.我们的目标是教会大家用Python构建机器学习模型,解决现实世界的难题. 当数据集包含很多特 ...

  8. 学习机器学习四 回归模型——线性回归、L1正则化(Lasso回归)、L2正则化(ridge回归)

    还记得什么是回归吗?回忆下回归就是连续的输出,分类是离散的. 回归模型一般分为:①线性回归--就是线性方程,类似为一元一次方程(y=wx+b),比如你的年龄: ②逻辑回归(类似为曲线方程) 线性回归 ...

  9. 我的机器学习支线「模型复杂度」

    文章目录 模型复杂度 时间复杂度 FLOPs 1. Convolution 2. Attention 3. Fully connected 空间复杂度 Parameters Data bits 深度学 ...

  10. 机器学习(四):w·x+b模型(1)

    假设输入空间x∈Rnx\in R^n, 对于分类问题,我们使用的假设空间为H={h=sign(wTx+b)|w∈Rn,b∈R}H=\{h=sign(w^Tx+b)| w\in R^n, b\in R\ ...

最新文章

  1. 手把手教你实现PySpark机器学习项目——回归算法
  2. 一起学nRF51xx 9 -  pwm
  3. 问问大家作为大数据总监,刚刚到一家新单位,怎么开展工作比较好?
  4. 在线用户管理--ESFramework 4.0 进阶(05)
  5. SD 模块的几个增强
  6. ppt给图片增加高斯模糊_制作PPT时,图片不清晰你如何处理?
  7. Spring基础知识和配置
  8. 像素游戏制作大师MV新手教程(二):素材的载入
  9. python语言画心_python语言还是java如何用python画爱心
  10. STM32F103:一.(1)MDK的配置
  11. 零基础带你学习MySQL—Select语句以及注意事项(十)
  12. mybatis中prefix,suffix,prefixOverrides,suffixOverrides用法解释
  13. oracle sql列转行_Oracle列转行函数使用
  14. r型聚类分析怎么做_聚类分析原理及R语言实现过程
  15. Redis入门(2):五大数据类型(key,string,list,set,sortset)将其实战,配置文件详解,发布与订阅
  16. Python2.7爬虫——爬取微信公众号文章
  17. 路由器使用Caddy搭建Webdav服务
  18. Sqoop 是什么?Sqoop 有什么特点?
  19. 电脑如何录制 gif 动图?使用 GitCam!
  20. linux bt4 u盘版下载,高手用U盘安装BT4

热门文章

  1. 行列式的组合定义及其应用--反对称阵的Pfaffian
  2. 八国离线谷歌卫星影像地图内网发布
  3. 电商用户行为分析-大数据
  4. Unity - Timeline 之 Trimming clips(裁剪剪辑)
  5. NMS(非极大值抑制)的来龙去脉,简单明了
  6. 游戏策划入门(2)——如何写一份项目建议书?
  7. 第一次用HTML设计表格,以及使用百度脑图的感受
  8. [HDU5956]The Elder
  9. 什么是开源网络情报?有什么特点?
  10. 如何查看一个期刊是sci几区以及影响因子 入藏号 ISSN等信息