文章目录
- 前言
- 本次主要是简单的对比了一下线性回归和二次回归的拟合效果对比,查看两种回归之间的差异。
- 一、引入我们所需要的库
- 二、创建训练数据集和测试数据集,并绘制训练集的散点图
- 三.绘制线性回归作用后的线型图
- 四.绘制二次回归作用后的线型图
- 五.完整代码和最终显示
- 六.性能对比
- 总结
前言
本次主要是简单的对比了一下线性回归和二次回归的拟合效果对比,查看两种回归之间的差异。
一、引入我们所需要的库
如果还有没添加的库,使用(pip install 库名)添加:
# 用于创建向量
import numpy as np
# 用于作图
import matplotlib.pyplot as plt
# 使用线性回归模型
from sklearn.linear_model import LinearRegression
# 生成多项式和交互特征
from sklearn.preprocessing import PolynomialFeatures
二、创建训练数据集和测试数据集,并绘制训练集的散点图
# 允许显示中文(主要是解决用matplotlib绘图时,常出现不显中文或乱码)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 创建训练集数据
X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
# 创建测试集数据
X_test = [[7], [9], [11], [15]]
y_test = [[8], [12], [15], [18]]
# 创建画布
plt.figure(figsize=(10, 8), dpi=80)
# 设置标题
plt.title(u'披萨的价格和直径')
# 设置x轴标签
plt.xlabel(u'直径(inch)')
# 设置y轴标签
plt.ylabel(u'价格(美元)')
# 设置x y轴的刻度范围 设置x轴的范围为[0, 25] y轴的范围为[0, 25]
plt.axis([0, 25, 0, 25])
# 显示网格线
plt.grid(True)
# 在画布上显示散点图(x:训练数据,y:训练标签,s:散点的面积)
plt.scatter(X_train, y_train, s=40)
因为只是简单的对比,也就没有使用很多的数据集,结果:
三.绘制线性回归作用后的线型图
# 在0到26之间生成一条统一的序列,总共为5个元素
xx = np.linspace(0, 26, 5)
# 定义一个线性回归对象
regressor = LinearRegression()
# 训练模型
regressor.fit(X_train, y_train)
# 返回预测标签
yy = regressor.predict(xx.reshape(xx.shape[0], 1))
# 画出线性回归的曲线
plt.plot(xx, yy, label="linear equation")
四.绘制二次回归作用后的线型图
# 创建多项式特征回归对象【使用degree=2的二次多项式则为(1,a, a^2, ab, b ,b^2)】
pf = PolynomialFeatures(degree=2)
# 首先生成多项式特征
X_pf = pf.fit_transform(X_train)
# 生成密集点 在0到26之间生成一条统一的序列,总共为5个元素
xx = np.linspace(0, 26, 5)
# 转换格式
xx_quadratic = pf.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-', label="quadratic equation")
五.完整代码和最终显示
# 用于创建向量
import numpy as np
# 用于作图
import matplotlib.pyplot as plt
# 使用线性回归模型
from sklearn.linear_model import LinearRegression
# 生成多项式和交互特征
from sklearn.preprocessing import PolynomialFeatures
# 允许显示中文(主要是解决用matplotlib绘图时,常出现不显中文或乱码)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 创建训练集数据
X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
# 创建测试集数据
X_test = [[7], [9], [11], [15]]
y_test = [[8], [12], [15], [18]]
# 创建画布
plt.figure(figsize=(10, 8), dpi=80)
# 在画布上显示散点图(x:训练数据,y:训练标签,s:散点的面积)
plt.scatter(X_train, y_train, s=40)
# 在0到26之间生成一条统一的序列,总共为5个元素
x_ = np.linspace(0, 26, 5)
# 定义一个线性回归对象
regressor = LinearRegression()
# 训练模型
regressor.fit(X_train, y_train)
# 返回预测标签
yy = regressor.predict(x_.reshape(x_.shape[0], 1))
# 画出线性回归的曲线
plt.plot(x_, yy, label="linear equation")
# 创建多项式特征回归对象【使用degree=2的二次多项式则为(1,a, a^2, ab, b ,b^2)】
pf = PolynomialFeatures(degree=2)
# 首先生成多项式特征
X_pf = pf.fit_transform(X_train)
# 创建线性回归对象
regressor_quadratic = LinearRegression()
# 训练模型(以多项特征处理后的数据做模型)
regressor_quadratic.fit(X_pf, y_train)
# print("系数W:", regressor_quadratic.coef_)
# print("截距B:", regressor_quadratic.intercept_)
# 生成密集点 在0到26之间生成一条统一的序列,总共为5个元素
xx = np.linspace(0, 26, 5)
# 转换格式
xx_quadratic = pf.transform(xx.reshape(xx.shape[0], 1))
# 绘制二次回归线
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-', label="quadratic equation")
# 设置标题
plt.title(u'披萨的价格和直径')
# 设置x轴标签
plt.xlabel(u'直径(inch)')
# 设置y轴标签
plt.ylabel(u'价格(美元)')
# 设置x y轴的刻度范围 设置x轴的范围为[0, 25] y轴的范围为[0, 25]
plt.axis([0, 25, 0, 25])
# 显示网格线
plt.grid(True)
# 显示图列
plt.legend()
# 显示
plt.show()
在这里由于我们的二次回归线的取点比较少,只有5个点,绘制出来的图形不是特别的圆滑,我们可以把特征点多取点 xx = np.linspace(0, 26, 100) ,再看一下效果:
六.性能对比
# 使用测试数据集
X_test_quadratic = pf.transform(X_test)
# 进行性能评估
print('linear equation r-squared', regressor.score(X_test, y_test))
print('quadratic equation r-squared', regressor_quadratic.score(X_test_quadratic, y_test))
能明显的看到,进行了二次回归的模型性能远超过了线性回归模型。需要注意的是,不是回归次数越多越好,关于这一方面下次在学习:
总结
由于也是刚开始学习深度学习推荐系统,对于很多的知识也不是特别的了解,如果本篇文章有哪里写的不对,还望大家多多指点。这里的代码主要还是学习和借鉴了中国大学MOOC深度学习基础的课程。