热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习的模型泛化

机器学习的模型泛化1、机器学习的模型误差主要含有三个方面的误差:模型偏差、模型方差以及不可避免的误差。2、对于机器学习训练模型的偏差主要因为对于问题本身的假设不对,比如非线性误差假

机器学习的模型泛化

1、机器学习的模型误差主要含有三个方面的误差:模型偏差、模型方差以及不可避免的误差。

机器学习的模型泛化
2、对于机器学习训练模型的偏差主要因为对于问题本身的假设不对,比如非线性误差假设为线性误差进行训练和预测,算法层面上欠拟合是产生较大偏差的主要原因。另外主要来自于特征参量与最终结果的相关性,如果相关性很低或者高度不相关的话也会导致较大的偏差。

机器学习的模型泛化
3、对于机器学习模型的方差主要是来自于数据的扰动以及模型的过于复杂,在算法层面上过拟合是引起模型方差较大的主要原因,因为过拟合会导致整体模型的复杂度太高,从而引起方差很大。

机器学习的模型泛化
4、对于不同的算法其存在误差种类是不同的,有些算法是天生的高方差算法,比如KNN算法,非参数算法一般都是高方差算法,因为它不对问题的前提进行假设。有些算法天生是高偏差的算法,比如线性回归算法,参数学习算法一般都属于高偏差算法因为它对数据具有极强的假设。
5、大多数算法都可以通过调节其中的超参数调整模型的方差和偏差,并且一般情况下模型的方差和偏差是矛盾的,降低偏差,会增大方差,降低方差,也会增大偏差。
6、机器学习的主要挑战主要来自于方差,当然这样的结论主要局限于算法层面,解决机器学习算法模型的方差的主要方式有以下几个方面:
(1)降低模型的复杂度;
(2)减小数据的维度:PCA算法进行降维和降噪;
(3)增加数据的样本数;
(4)评测算法的准确度时需要采用验证集,即使用交叉验证方式;
(5)模型的正则化。
7、模型的正则化主要是指对于复杂的模型的特征参数的系数进行一定的限制,使其不要太大,采取的方式主要是改变损失函数,在损失函数中加入模型的正则化项,从而在使得损失函数最最小时限制相应的参数的大小.

机器学习的模型泛化

机器学习的模型泛化

图 正则函数表达式
8、具体来讲,模型的正则化主要含有两种方式:岭回归Ridge Regression和LASSO Regression,两者的损失函数表达式有所不同,这也造成了两者在超参数a从0增大到正无穷时各项特征系数变化以及拟合模型曲线变化的不同特点。

机器学习的模型泛化

机器学习的模型泛化

机器学习的模型泛化


(1)Ridge模型:因为其损失函数后面添加项的梯度变化的连续性,所以当它的超参数alhpa不断增大时,它的各项特征系数是连续慢慢地趋向于0的;因此它的拟合结果始终是一种光滑的曲线形式。


(2)LASSO模型:因为后面损失函数添加项是一个绝对值函数,因此在梯度下降法求取最小值时,它的导数是一个阶跃函数sign(x),因此,当超参数a不断增大时,其theta各项特征系数中会有一部分趋向于变为0,这也使得LASSO模型可以用来做特征选用。它的拟合结果随着超参数a的增大,会越来越趋近于一条直线,这也说明特征参数的部分系数会变为0.

 

机器学习的模型泛化

 

图注:左边为Ridge岭回归结果,右边为LASSO回归结果

9、弹性网:弹性网是一种复合型的正则化方式,它是在损失函数的基础上既添加了岭回归的L1正则项,又添加了LASSO回归的正则化项L2正则项,包含了岭回归和LASSO回归的综合优点,其具体的数学表达式如下:

机器学习的模型泛化
10、模型正则化的两种算法模型岭回归和LASSO回归正则化的实现代码具体如下:

#(1)使用岭回归的正则化方式减小模型方差,将其封装为一个函数
import numpy as np
import matplotlib.pyplot as plt
x=np.random.uniform(-3,3,size=100)
X=x.reshape(-1,1)
y=0.5*x**2+x+2+np.random.normal(0,1,size=100)
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(X,y,random_state=666)
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
def Ridgeregression(degree,alpha):
return Pipeline([("poly", PolynomialFeatures(degree=degree)),
("std_scaler", StandardScaler()),
("Ridge_reg", Ridge(alpha=alpha))
])
r1=Ridgeregression(20,10000)
r1.fit(x_train,y_train)
y11=r1.predict(x_test)
print(mean_squared_error(y11,y_test))
plt.figure()
plt.scatter(X,y)
x1=np.linspace(-3,3,100).reshape(100,1)
y1=r1.predict(x1)
plt.plot(x1,y1,"r")
#plt.axis([-3,3,-1,10])
plt.show()

#(2)使用LASSO回归的正则化方式减小模型方差,将其封装为一个函数
#采用LASSO回归进行训练和预测
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
def lassoregression(degree,alpha):
return Pipeline([("poly", PolynomialFeatures(degree=degree)),
("std_scaler", StandardScaler()),
("LASSO_reg", Lasso(alpha=alpha))
])
LA1=lassoregression(20,1) #当a的值从0开始增大时,其拟合曲线的模型会越来越平直,慢慢会接近一条直线,区别于岭回归的曲线,这是由LASSO正则化数学式子决定的
LA1.fit(x_train,y_train)
y11=LA1.predict(x_test)
print(mean_squared_error(y11,y_test))
plt.figure()
plt.scatter(X,y)
x1=np.linspace(-3,3,100).reshape(100,1)
y1=LA1.predict(x1)
plt.plot(x1,y1,"r")
#plt.axis([-3,3,-1,10])
plt.show()

#(3)采用普通多项式回归进行预测
import numpy as np
import matplotlib.pyplot as plt
x=np.random.uniform(-3,3,size=100)
X=x.reshape(-1,1)
y=0.5*x**2+x+2+np.random.normal(0,1,size=100)
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(X,y,random_state=666)
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
def polynomialRegression(degree):
return Pipeline([("poly",PolynomialFeatures(degree=degree)),
("std_scaler",StandardScaler()),
( "lin_reg",LinearRegression())
])
poly2_reg=polynomialRegression(20)
poly2_reg.fit(X,y)
y2=poly2_reg.predict(X)
print(mean_squared_error(y,y2))
print(poly2_reg.score(X,y))
plt.figure()
plt.scatter(X,y)
x1=np.linspace(-3,3,100).reshape(100,1)
y11=poly2_reg.predict(x1)
plt.plot(x1,y11,"r")
#plt.axis([-3,3,-1,10])
plt.show()

机器学习的模型泛化

注:左为岭回归方式,右为普通多项式回归方式

机器学习的模型泛化

注:左为普通多项式回归,右为LASSO回归方式






推荐阅读
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
author-avatar
手机用户2702936044
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有