机器学习精简教程之五——用scikit-learn求解多项式回归问题
来源:互联网 发布:程序员和老师结婚 编辑:程序博客网 时间:2024/05/22 02:08
本文转自:http://www.shareditor.com/blogshow/?blogId=56
多元真实情况未必是线性的,有时需要增加指数项,也就是多项式回归,现实世界的曲线关系都是通过增加多项式实现的,本节介绍用scikit-learn解决多项式回归问题
住房价格样本
样本 面积(平方米) 价格(万元)
样本面积(平方米) 价格(万元)15015021002003150250420028052503106300330做图像
import matplotlib.pyplot as pltimport numpy as npplt.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 pltimport numpy as npfrom sklearn.linear_model import LinearRegressionplt.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 pltimport numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.preprocessing import PolynomialFeaturesplt.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
二次回归 r-squared 0.999336734694
可以看到二次回归效果更好
我们继续尝试一下三次回归
import matplotlib.pyplot as pltimport numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.preprocessing import PolynomialFeaturesplt.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
二次回归 r-squared 0.999336734694
三次回归 r-squared 0.99946460066
可以看到三次回归比二次回归效果又好了一些,但是不是很明显。所以二次回归更可能是最适合的回归模型,三次回归可能有过拟合现象
阅读全文
0 0
- 机器学习精简教程之五——用scikit-learn求解多项式回归问题
- 机器学习精简教程之二——用scikit-learn求解一元线性回归问题
- 机器学习精简教程之三——用scikit-learn求解多元线性回归问题
- 机器学习精简教程之七——用scikit-learn做特征提取
- 机器学习精简教程之十——用scikit-learn做聚类分析
- 六、用scikit-learn求解多项式回归问题
- 机器学习精简教程之九——用scikit-learn的网格搜索快速找到最优模型参数
- python机器学习库scikit-learn简明教程之:Lasso回归预测
- 三、用scikit-learn求解一元线性回归问题
- 四、用scikit-learn求解多元线性回归问题
- 【Python】scikit-learn机器学习(一)——一元回归模型
- 机器学习与scikit-learn(一)——回归模型
- 机器学习与scikit-learn(一)——回归模型
- 使用scikit-learn进行机器学习(scikit-learn教程1)
- 机器学习之——多项式回归和正规方程
- 机器学习之——多项式回归和正规方程
- scikit-learn学习之回归分析
- scikit-learn 中文文档-使用 scikit-learn 介绍机器学习-scikit-learn教程|ApacheCN
- LINQ系列:LINQ to SQL Where条件
- javaHL(JNI) Not Available解决办法
- cordova-plugin-app-version插件的使用
- Linux工作站加固的6个方法
- 阿里云CentOS7 Silent Mode安装Oracle11GR2
- 机器学习精简教程之五——用scikit-learn求解多项式回归问题
- 每日MySQL之004:备份与恢复
- java 23种设计模式 深入理解
- Nodejs ssh2 exec执行shell超时终止执行
- Video http dash mp4 box slice
- 6. vue.js-饿了吗全套-项目文件介绍
- spring和mybatis整合
- 深度学习笔记——理论与推导之Structured Learning【Learning with Hidden Information】(九)
- 1099. Build A Binary Search Tree (30)建立二叉搜索树