本讲是关于多项式回归,多项式回归作为线性回归的一个重要组成部分,有着简单快捷,可解释性强的优点,但同样也存在需要先验知识,也就是需要设置变量的指数,也存在过拟合的问题。
需要注意的是,虽然多项式回归是线性回归,但它拟合的数据是非线性的。
我们这次就使用多项式回归去拟合一些非线性的数据。
$\begin{equation} Y=\beta _{0}+\beta _{1}X +\beta_{2}X^{2}+\ldots+\beta_{h}X^{h} \end{equation}$
上面就是多项式回归的形式,我们需要人为决定h是多少,也就是说最高次项是多少
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
对于多项式回归,我们使用的是sklearn.preprocessing工具包中的PolynomialFeatures函数与sklearn.linear_model工具包下的LinearRegression函数。
就像我上面说的,虽然多项式回归可以拟合非线性的数据,但它本质上是特殊的线性回归,所以使用的是LinearRegression。
GDP=[1008782.5,983751.2,915243.5,830945.7,742694.1,685571.2,644380.2,588141.2,537329,483392.8,410354.1,347934.9,321229.5,270704,219028.5,185998.9,161415.4,136576.3,120480.4,109276.2]
x_year=np.linspace(2021,2001,20)
x_df=pd.DataFrame(x_year)
x=x_df.values
在线性回归中,我们线性拟合了GDP,但我们知道,GDP不可能是线性的,因为GDP不可能无限制增加,所以我们使用非线性去拟合。
我们需要决定最高次项,决定这个参数只能靠我们原先的知识,比如说在经济学中,GDP符合什么形式的函数。
在这边我简单选了3次项作为最高次项,形式就是:
$\begin{equation} Y=\beta _{0}+\beta _{1}X +\beta_{2}X^{2}+\beta_{3}X^{3} \end{equation}$
而我们代码的工作就是去决定$\beta_0$, $\beta_1$, $\beta_2$与$\beta_3$
Poly_regressor = PolynomialFeatures(degree=3)
Poly_X = Poly_regressor.fit_transform(x)
注意,上面第一行代码中的degree就是我们的最高次项,使用PolynomialFeatures函数,输入就是最高次项的值,输出函数的形式,赋值给Poly_regressor这个变量。
第二行代码的意思就是使用Poly_regresso这个变量下的fit_transform,输入x,也就是我们的x轴。
regressor = LinearRegression()
regressor.fit(Poly_X,GDP)
上面代码第一行是初始化模型,我们去学习数据,然后拟合数据时,都需要初始化
第二行就是拟合多项式了,使用的就是regressor下的fit函数,第一个输入就是多项式的形式,第二个输入就是GDP,也就是y值。你会发现第二行好像没有输出,但其实有输出,它是将拟合到的参数返回了regressor这个元变量
plt.scatter(x,GDP)
plt.plot(x,regressor.predict(Poly_X),color='red')
plt.xlabel('Year')
plt.ylabel('GDP of China')
plt.title('GDP')
plt.show()
然后我们画图,这部分代码我们需要注意的是第二行,我们画拟合线时x都知道,但regressor.predict(Poly_X)的意思就是拿我们已经学习好,得到参数的regressor去predict(预测)Poly_X,也就是我们的预测的GDP值
你可以去改变degree去改变拟合的函数形式,注意,如果degree是1的话就是我们的线性回归,你可以去改变GDP与对应的x去用多项式回归你想要的数据