01定义
一元线性回归模型是一种根据自变量X和因变量Y的相关关系,建立X与Y的线性回归方程并进行预测的模型。
该模型是拟合出来一条线,来使得预测值和实际值尽可能的接近,如果大部分的实际值落在该线上,或者很接近这条线,则该模型的拟合的较好。
一元线性回归的预测模型为:
Y = aX+b
其中,X代表自变量,Y代表因变量,a为回归系数,b为截距。
02模型实现
Python有一个第三方库—Scikit-Learn库,它可以轻松的搭建一元线性回归模型。
因为第三方库,所以我们要进行手动安装,命令如下:
pip install Scikit-Learn
我们现在来读取数据,代码如下:
import pandas as pd df = pd.read_excel('金融行业收入表.xlsx') df.head(10)
查看一下获取的数据:
此时,我们可以先进行散点图的绘制了,代码如下:
from matplotlib import pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文乱码问题 plt.rcParams['axes.unicode_minus'] = False# 解决“-”显示为方块的问题 plt.scatter(X,Y) plt.xlabel('工龄') plt.ylabel('薪水') plt.title('金融行业') plt.show()
我们来看一下绘制出来的散点图:
我们对绘制好后的散点图进行查看,并没有什么可以直观看到的数据。接下来我们开始使用Scikit-Learn库搭建模型了,代码如下:
from sklearn.linear_model import LinearRegression linear = LinearRegression() linear.fit(X,Y) y = linear.predict(X) plt.scatter(X,Y) plt.plot(X,y,color='yellow') plt.xlabel('工龄/年') plt.ylabel('薪水/元') plt.title('金融行业') plt.show()
我们看一下绘制出来的模型图:
我们来计算一下该模型的一元线性回归方程,代码如下:
a = linear.coef_[0] b = linear.intercept_ f'回归模型方程为:y={int(a)}x+{int(b)}'
计算出回归模型方程为:y=4792x+6269
当模型搭建好后,我们还需要对模型进行评估,看其线性拟合程度是否较高,特征变量与,目标变量是否具有相关性,代码如下:
import statsmodels.api as sm result = sm.OLS(Y,sm.add_constant(X)).fit().summary()
我们查看一下该模型的数据信息:
这个数据展示里面,只需要记住用红色框框起来的即可。
它们代表的含义是,R-squared和Adj.R-squared的值代表的是方程拟合程度,它们的取值是0-1,越靠近1,则拟合程度越高,从图中我们可以看到,它们两个的值分别是0.905和0.904,说明拟合程度非常高了。
P的取值范围也是0-1,不过它是越靠近0,则特征变量的显著性越高,从上图我们看到,两个特征变量的P值均为0,所以这两个变量都和目标变量具有相关性,不是偶然因素导致的。
03模型优化
通过对上面模型的观察,我们发现一元一次方程可能并不是它最佳模型,它的最佳模型更像是一条曲线,所以我们现在尝试一下用一元二次线性回归方程来对其进行绘制,看看是否契合,绘制代码如下:
from sklearn.preprocessing import PolynomialFeatures linear = PolynomialFeatures(degree=2) # 改变degree的值可以改变方程次数 x = linear.fit_transform(X) linear = LinearRegression() linear.fit(x,Y) y = linear.predict(x) plt.scatter(X,Y) plt.plot(X,y,color='yellow') plt.xlabel('工龄/年') plt.ylabel('薪水/元') plt.title('金融行业') plt.show()
一元二次回归模型图:
我们来计算一下该模型的一元二次线性回归方程,代码如下:
a = linear.coef_[2] b = linear.coef_[1] c = linear.intercept_ f'一元二次线性回归方程为:y={a}x*x+{b}x+{c}'
计算出一元二次线性回归方程为:
y=611.8072409537128x*x-154.72510423942225x+12138.94866245218
同理,当模型搭建好后,我们还需要对模型进行评估,看其线性拟合程度是否较高,特征变量与,目标变量是否具有相关性,代码如下:
from sklearn.preprocessing import PolynomialFeatures import statsmodels.api as sm linear = PolynomialFeatures(degree=2) # 改变degree的值可以改变方程次数 x = linear.fit_transform(X) result = sm.OLS(Y,sm.add_constant(X)).fit().summary()
我们查看一下该模型的数据信息:
从上图我们发现,一元二次线性回归方程的R-squared和Adj.R-squared值和一元线性回归方程的值相同,看来该模型变成二次后,并未优化。
04拓展
用同样的方法,我们也可以搭建出汽车、餐饮和IT行业的回归模型,这里只展示模型图,有兴趣的读者可以自行动手进行复现。
代码如下:
# 金融行业 df = pd.read_excel('金融行业收入表.xlsx') X_financial = df[['工龄']] Y_financial = df['薪水'] x_financial = linear_.fit_transform(X_financial) linear = LinearRegression() linear.fit(x_financial,Y_financial ) y = linear.predict(x_financial) ax1.scatter(X_financial,Y_financial ) ax1.plot(X_financial,y,color='yellow') ax1.set_title('金融行业') # 餐饮行业 df = pd.read_excel('餐饮行业收入表.xlsx') X_food = df[['工龄']] Y_food = df['薪水'] x_food = linear_.fit_transform(X_food) linear = LinearRegression() linear.fit(x_food,Y_food) y = linear.predict(x_food) ax2.scatter(X_food,Y_food) ax2.plot(X_food,y,color='red') ax2.set_title('餐饮行业') # 汽车行业 df = pd.read_excel('汽车行业收入表.xlsx') X_car = df[['工龄']] Y_car = df['薪水'] x_car = linear_.fit_transform(X_car) linear = LinearRegression() linear.fit(x_car,Y_car) y = linear.predict(x_car) ax3.scatter(X_car,Y_car) ax3.plot(X_car,y,color='purple') ax3.set_title('汽车行业') # IT行业 df = pd.read_excel('IT行业收入表.xlsx') X_it = df[['工龄']] Y_it = df['薪水'] x_it = linear_.fit_transform(X_it) linear = LinearRegression() linear.fit(x_it,Y_it) y = linear.predict(x_it) ax4.scatter(X_it,Y_it) ax4.plot(X_it,y,color='pink') ax4.set_title('IT行业')
05小结
1. 本文通过预测金融行业从业者工资和工龄之间的关系,来学习线性回归方程的搭建方法,有兴趣的小伙伴可以自行尝试复现。
2. 通过搭建线性回归模型,可以进行有效的预测,有兴趣的读者可以分享一些优化方法。
3. 模型搭建好后,还需要对其进行评估和优化,评估参考R-squared、Adj.R-squared和P的值。
4. 本文仅供参考学习,不做它用。
5. 有需要本文数据集和代码的,联系志斌获取~