机器学习精简教程之五——用scikit-learn求解多项式回归问题

Python数值计算(10)——多项式拟合函数fit 常见的插值(拟合)方法有拉格朗日法,Neville迭代法,牛顿差商法等,还有特定场合下的Hermite插值、三次样条插值等,将在后续逐步展开介绍。继续说多项式的数值及拟合,这次主要讨论关于多项式拟合的函数fit。还要指定其域(domain),该值通常应该设定为[-1,1]。和原来的多项式相同。 阅读详情

本文转自:http://www.shareditor.com/blogshow/?blogId=56


多元真实情况未必是线性的,有时需要增加指数项,也就是多项式回归,现实世界的曲线关系都是通过增加多项式实现的,本节介绍用scikit-learn解决多项式回归问题 

住房价格样本

样本 面积(平方米) 价格(万元)

样本面积(平方米) 价格(万元)
150150
2100200
3150250
4200280
5250310
6300330

做图像

import matplotlib.pyplot as plt
import numpy as np

plt.figure()#实例化作图变量
plt.title("Price & Areas")
plt.xlabel('x')
plt.ylabel('y')
plt.axis([30,400,100,400])
plt.grid(True)

xx = [[50],[100],[150],[200],[250],[300]]
yy = [[150],[200],[250],[280],[310],[330]]
plt.plot(xx,yy,'k.')
plt.show()


用线性回归

import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
plt.figure()#实例化作图变量
plt.title("Price & Areas")
plt.xlabel('x')
plt.ylabel('y')
plt.axis([30,400,100,400])
plt.grid(True)

xx = [[50],[100],[150],[200],[250],[300]]
yy = [[150],[200],[250],[280],[310],[330]]

model = LinearRegression()
model.fit(xx,yy)
x2 = [[30],[400]]
y2 = model.predict(x2)
plt.plot(xx,yy,'k.')
plt.plot(x2,y2,'g-')
plt.show()

得到回归图像:

但是实际情况是,如果房屋面积一味的增加,房价并不会线性增长,因此线性关系已经无法描述真实的房价问题

采用多项式回归

首先我们用二次多项式
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

plt.figure() # 实例化作图变量
plt.title('single variable') # 图像标题
plt.xlabel('x') # x轴文本
plt.ylabel('y') # y轴文本
plt.axis([30, 400, 100, 400])
plt.grid(True) # 是否绘制网格线

X = [[50],[100],[150],[200],[250],[300]]
y = [[150],[200],[250],[280],[310],[330]]
X_test = [[250],[300]]#用来做最终效果测试
y_test = [[310],[330]]
plt.plot(X,y,'k.')

model =LinearRegression()
model.fit(X,y)
X2 = [[30],[400]]
y2 = model.predict(X2)
plt.plot(X2,y2,'g-')

xx = np.linspace(30,400,100) #设计x轴一系列点作为画图的x点集
quadratic_featurizer = PolynomialFeatures(degree=2)#实例化一个二次多项式特征实例
X_train_quadratic = quadratic_featurizer.fit_transform(X) #用二次多项式对样本X值做变换
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0],1))#把训练好X值得多项式特征实例应用到一系列点上,形成矩阵
regressor_quadratic = LinearRegression()#创建一个线性回归实例
regressor_quadratic.fit(X_train_quadratic,y)#以多项式变换后的x值为输入,代入线性回归模型做训练
plt.plot(xx,regressor_quadratic.predict(xx_quadratic),'r-') #用训练好的模型作图

print("一元线性回归 r-squared",model.score(X_test,y_test))
X_test_quadratic = quadratic_featurizer.transform(X_test)
print("二次回归  r-squared",regressor_quadratic.score(X_test_quadratic,y_test))

plt.show()


红色为二次多项式回归图像,可以看到比线性模型吻合度高,输出的R方结果为:
一元线性回归 r-squared 0.0755555555556
二次回归  r-squared 0.999336734694
可以看到二次回归效果更好

我们继续尝试一下三次回归
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

plt.figure() # 实例化作图变量
plt.title('single variable') # 图像标题
plt.xlabel('x') # x轴文本
plt.ylabel('y') # y轴文本
plt.axis([30, 400, 100, 400])
plt.grid(True) # 是否绘制网格线

X = [[50],[100],[150],[200],[250],[300]]
y = [[150],[200],[250],[280],[310],[330]]
X_test = [[250],[300]]#用来做最终效果测试
y_test = [[310],[330]]
plt.plot(X,y,'k.')

model =LinearRegression()
model.fit(X,y)
X2 = [[30],[400]]
y2 = model.predict(X2)
plt.plot(X2,y2,'g-')

xx = np.linspace(30,400,100) #设计x轴一系列点作为画图的x点集
quadratic_featurizer = PolynomialFeatures(degree=2)#实例化一个二次多项式特征实例
X_train_quadratic = quadratic_featurizer.fit_transform(X) #用二次多项式对样本X值做变换
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0],1))#把训练好X值得多项式特征实例应用到一系列点上,形成矩阵
regressor_quadratic = LinearRegression()#创建一个线性回归实例
regressor_quadratic.fit(X_train_quadratic,y)#以多项式变换后的x值为输入,代入线性回归模型做训练
plt.plot(xx,regressor_quadratic.predict(xx_quadratic),'r-') #用训练好的模型作图

cubic_featurizer = PolynomialFeatures(degree=3)
X_train_cubic = cubic_featurizer.fit_transform(X)
regressor_cubic = LinearRegression()
regressor_cubic.fit(X_train_cubic, y)
xx_cubic = cubic_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_cubic.predict(xx_cubic))

print("一元线性回归 r-squared",model.score(X_test,y_test))
X_test_quadratic = quadratic_featurizer.transform(X_test)
print("二次回归  r-squared",regressor_quadratic.score(X_test_quadratic,y_test))
X_test_cubic = cubic_featurizer.transform(X_test)
print ('三次回归     r-squared', regressor_cubic.score(X_test_cubic, y_test))

plt.show()


R方输出如下:
一元线性回归 r-squared 0.0755555555556
二次回归  r-squared 0.999336734694
三次回归     r-squared 0.99946460066

可以看到三次回归比二次回归效果又好了一些,但是不是很明显。所以二次回归更可能是最适合的回归模型,三次回归可能有过拟合现象
Scikit-Learn线性回归(二) bx+c生成一些非线性数据,Scikit-Learn预处理模块中的PolynomialFeatures类提供了这种支持:将训练数据(只有一个特征:x)进行转换,将每个特征的幂次方(此处为平方,即x。上篇中,我们详细介绍了线性回归的概念、原理和推导,以及通过由浅入深的案例,详解了Scikit-Learn线性回归模型的基本使用。多项式回归的基本思想是:以线性回归为基础,拓展数据集特征空间的维度,且被拓展的特征空间维度上的数据是给定数据集相关项的多项式项。线性回归研究的是一个自变量与一个因变量之间的回归问题。 阅读详情

相关推荐

【Scikit-learn学习】第一课:Scikit-learn 简介和安装

欢迎来到 Scikit-learn 的入门课程!在这一课中,我们将介绍 Scikit-learn 的基础知识,包括它的历史、主要功能、以及如何在你的环境中安装它。这将为我们深入探索 Scikit-learn 的强大功能打下坚实的基础。Scikit-learn 是一个开源的 Python 机器学习库,它提供了大量的简单和高效的工具,适用于数据挖掘和数据分析。它建立在 Python 的 NumPy、SciPy 和 Matplotlib 库之上,使其成为科学和工程领域中数据分析和机器学习的首选库之一。

weixin_46453070的博客 3243

二次回归和线性回归的拟合效果的对比

回归问题及正则化 - 二次回归和线性回归的拟合效果的对比

喝醉酒的小白 1万+

Scikit-Learn线性回归(五)

如图所示,图一表示过拟合,可以看到拟合曲线完美的经过了每一个点,模型非常复杂,这种情况下,经验误差极小,但是预测值的方差(误差平方和)会很大。过拟合是指模型在训练集中表现良好,而在测试集中表现很差,即泛化误差大于经验误差,说明拟合过度,模型泛化能力降低,只能够适用于训练集,通用性不强;如上图所示,横坐标表示模型的复杂度,纵坐标表示模型的误差。从图中可得,随着模型复杂度的提升,方差会不断增大,偏差会逐渐减小,而泛化误差会受偏差和方差的影响,我们的目标是找到泛化误差的最小值,这可以通过平衡方差与偏差来实现。

Java/Python大数据随笔 1329

Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同

在Python中,`numpy.polyfit()`函数用于通过最小二乘法拟合一元多项式,而`numpy.polynomial.Polynomial.fit()`方法则用于更灵活地构建并拟合多项式。3. 使用`numpy.polynomial.Polynomial.fit()`方法拟合多项式,其中第一个参数是要拟合的数据点的x值,第二个参数是y值,第三个参数是要拟合的多项式的阶数。Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同。4. 获取拟合的多项式系数。

676

Scikit-Learn线性回归(一)

线性回归(Linear Regression)是很基础的机器学习算法。回归(Regression)是一种应用广泛的预测建模技术,这种技术的核心在于预测的结果是连续型变量回归是监督学习中的一个重要问题,用于预测输入变量(自变量)和输出变量(因变量)之间的关系,特别是当输入变量的值发生变化时,输出变量的值随之发生的变化,回归模型正是表示从输入变量到输出变量之间映射的函数其中,自变量表示主动操作的变量,可以看做因变量的原因。因变量因为自变量的变化而变化,可以看做自变量的结果。

Java/Python大数据随笔 2287

Scikit-Learn回归树

决策树,顾名思义,是一种树形结构。决策树使用层层推理来实现最终的分类。根节点:包含样本的全集内部节点:对应一个特征属性的测试叶节点:对应一种类别(决策的结果)这是一种基于If-Then规则的有监督学习算法,决策树的这些规则通过训练得到,而不是人工制定的决策树的目标是创建一个模型,通过学习从数据特性中推断出的简单决策规则来预测目标变量的值预测时,在树的内部节点处用某一属性值进行判断,根据判断结果决定进入哪个分支节点,直到到达叶节点处,得到分类结果。

Java/Python大数据随笔 1954

python线性拟合numpypolyfit_python numpy polyfit用法及代码示例

最小二乘多项式拟合。拟合多项式p(x) = p[0] * x**deg + ... + p[deg]度deg到点(x,y)。返回系数p的向量,该向量使deg,deg-1……0的阶数的平方误差最小。的Polynomial.fit对于新代码,建议使用class方法,因为它在数值上更稳定。有关更多信息,请参见该方法的文档。参数:x: : array_like, shape (M,)M个采样点中的x-co...

weixin_39927993的博客 3947

Scikit-Learn线性回归(四)

在第一篇文章Scikit-Learn线性回归(一)L∑i1myi−fxi2Li1∑m​yi​−fxi​2回忆一下,损失函数主要用于评估模型拟合的好坏,损失函数衡量了我们构造的模型的预测值与真实值的差异,因此,我们希望我们的预测结果与真实值的差异越小越好。也就是我们希望损失函数取得最小值损失函数取得最小值是我们构建模型的本质要求,求解模型的特征向量ω\omegaω是我们构建模型的核心问题minω∣∣Y−Xω∣∣22mi。

Java/Python大数据随笔 1446

python 多项式拟合

import numpy as np import matplotlib.pyplot as plt #x的个数决定了样本量 x = np.arange(-1,1,0.02) #y为理想函数 y = 2*np.sin(x*2.3)+0.5*x**3 #y1为离散的拟合数据 y1 = y+0.5*(np.random.rand(len(x))-0.5) z1 = np.polyfi...

luoganttcc的博客 4601

scikit-learn中的岭回归实现解析

岭回归(Ridge Regression),又称为L2正则化线性回归,是一种带有正则化项的特殊线性回归,主要用于处理共线性数据分析和提高模型的泛化能力。scikit-learn中的岭回归实现提供了一种有效的线性回归方法,通过引入正则化项来提高模型的泛化能力和解释性。随着对岭回归深入的理解和实践,我们可以在数据分析和机器学习领域中取得更好的成果。scikit-learn是一个流行的Python机器学习库,提供了许多常用的机器学习算法实现,包括岭回归。岭回归的目标函数是最小化一个带有正则化项的损失函数。

2401_85702623的博客 1785

Scikit-Learn逻辑回归(一)

逻辑回归(Logistic Regression)主要解决二分类问题,用来表示某个事件发生的可能性。逻辑回归在机器学习知识结构中的位置如下:逻辑回归的思想最早可以追溯到19世纪,由英国统计学家Francis Galton在研究豌豆遗传问题时首次提出。然而,真正将逻辑回归应用于机器学习的是加拿大统计学家Hugh Everett,他在1970年代提出了广义线性模型(GLM),其中包括逻辑回归逻辑回归这个算法的名称有一定的误导性。虽然它的名称中有“回归”,当它在机器学习中不是回归算法,而是分类算法。

Java/Python大数据随笔 1885

机器学习系列6 使用Scikit-learn构建回归模型:简单线性回归、多项式回归与多元线性回归

在本文中,我们以美国南瓜数据为例,讲解了三种线性回归的原理与使用方法,探寻数据之间的相关性,并构建了6种线性回归模型。将准确率从一开始的0.04提升到0.96.

极限突破者的博客 1万+

Scikit-Learn支持向量机回归

SVR的目标是找到一个函数,使得大部分数据点都落在间隔内,并且使得落在间隔之外的数据点的预测误差最小化,这通常通过优化算法(如梯度下降)来实现。对于这样的问题,解决的方案是将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分,然后再运用SVM求解。如果我们要处理的分类问题更加复杂,甚至不能像上面一样近似线性可分,这种情况下找到的超平面分错的程度太高,是不可接受的。SVM是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,他的学习策略就是间隔最大化。

Java/Python大数据随笔 1504

机器学习库Scikit-learn

本文目录3.1 背景知识3.2 Scikit-learn概述3.3 Scikit-learn主要用法3.3.1 基本建模流程3.3.2 数据预处理3.3.3 监督学习算法3.3.4 无监督学习算法3.3.5 评价指标3.3.6 交叉验证及超参数调优3.4 Scikit-learn总结参考文献Scikit-learn是基于NumPy、SciPy和Matplotlib的开源Python机器学习包,它封...

fengdu78的博客 8631

机器学习经典算法:多项式回归

多项式回归基于线性回归的思想,在模型中引入了自变量的高次幂项,从而使得模型能够拟合非线性关系的数据。

Norah 的技术博客 810

开源机器学习工具scikit-learn入门

开源机器学习工具scikit-learn入门。

xuanyuansen的专栏 6万+

机器学习系列4 使用Python创建Scikit-Learn回归模型

机器学习系列4 使用Python和Scikit-Learn回归模型 在本文中,我们将学习机器学习本地环境的配置过程,利用Scikit-learn库走完机器学习模型的基本流程,最终创建一个线性回归模型。

极限突破者的博客 5399

不写代码,Cursor 10分钟开发1个APP!保姆级教程喂饭来了

做出第一个能运行的app,那种成就感真的很棒。虽然过程可能有点折腾,但只要耐心一点,问题都能解决。记住,遇到问题不要慌,现在有AI帮忙,大部分问题都能快速解决。重要的是迈出第一步,开始动手实践。你的第一个app可能很简单,但这是一个很好的开始。随着经验积累,你能做出的东西会越来越酷。现在就开始行动吧,说不定下个月你就能向朋友炫耀你自己做的app了!

chenhong007的博客 1550

使用Scikit-learn开启机器学习之旅

机器学习是令计算机根据可用数据执行相应策略而无需以明确的编程方式执行策略的一门学科。 在过去几十年间,由于可用数据的数量和质量呈指数级增长,同时高性能的计算设备也得到了快速发展。Scikit-Learn 是机器学习的常用库,它包含很多实用工具和算法用于构建机器学习模型,本文通过实例讲解使用 Scikit-learn 构建机器学习模型,包括常见监督学习和无监督学习算法模型。

盼小辉丶的博客 4697

excel 利用SUBTOTAL函数计算筛选后数列总和、均值、最大、最小值

表里有三个人,咱们需要筛选出三个人,并分别计算他们的总和值。 先看一下数据范围(A1:B27) 通过筛选找张三。 按照上图所示输入函数,选择9,求和。 然后按照函数输入即可。 就能计算出结果。 筛选项选择王五,就会自动计算王五的总和。 筛选到李四就会自动计算李四的总和。 如果把9改成1,就是自动计算筛选出来的均值结果,如下图所示。 如果改成4就是取筛选项的最大值,选择5就是取最小值。 ...

yuanYW7556的博客 3万+

支付宝支付(三):周期扣款实现注意细节

一、周期扣款实现说明 1、官方文档入口:https://opendocs.alipay.com/open/20190319114403226822/intro 2、根据官方文档说明,周期扣款有两种方式:先签约后代扣场景和支付后签约场景 3、周期扣款接入问题文档: a>https://opendocs.alipay.com/support/01rg24 b>https://opensupport.alipay.com/support/knowledge/50249/20160248753

新鲜雾霾的博客 5701
上一篇: 机器学习精简教程之四——用matplotlib绘制精美的图表
下一篇: 机器学习精简教程之六——用随机梯度下降法(SGD)做线性拟合
quliulangle
博客等级 码龄14年 15粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值