“这是我参与更文挑战的第13天,活动详情查看: 更文挑战”
模型评估主要用到R-squared(即统计学中的R2)、Adj.R-squared(即Adjusted R2)、P值。其中R-squared和Adj.R-squared用来衡量线性拟合的优劣,P值用来衡量特征变量的显著性。
模型评估的编程实现
R-squared和Adj.R-squared的取值范围为0~1,它们的值越接近1,则模型的拟合程度越高;P值在本质上是个概率值,其取值范围也为0~1,P值越接近0,则特征变量的显著性越高,即该特征变量真的和目标变量具有相关性。
在Python中,可以通过如下代码计算这3个参数。
import statsmodels.api as sm
X2 = sm.add_constant(X)
est = sm.OLS(Y,X2).fit()
print(est.summary())
复制代码
第1行代码引入用于评估线性回归模型的statsmodels库并简写为sm。
第2行代码用add_constant()函数给原来的特征变量X添加常数项,并赋给X2,这样才有y=ax+b中的常数项,即截距b,注意Scikit-Learn库不需要这一步。
第3行代码用OLS()和fit()函数对Y和X2进行线性回归方程搭建。
第4行代码打印输出该模型的数据信息,如下图所示。
上图中左下角的coef就是常数项(const)和特征变量(工龄)前的系数,即截距b和斜率系数a,可以看到和之前求得的结果是一致的。
对于模型评估而言,通常需要关心上图中的R-squared、Adj.R-squared和P值信息。这里的R-squared为0.855,Adj.R-squared为0.854,说明模型的线性拟合程度较高;这里的P值有两个,常数项(const)和特征变量(工龄)的P值都约等于0,所以这两个变量都和目标变量(薪水)显著相关,即真的具有相关性,而不是由偶然因素导致的。
获取R-squared值的另一种方法
上面是通过引入statsmodels库来评估线性回归模型的,那么有没有一个更通用的方法来获取R-squared值呢?
用XGBoost和LightGBM模型进行回归分析,所以需要一个更通用的获取R-squared值的方法,代码如下。
from sklearn.metrics import r2_score
r2 = r2_score(Y,regr.predict(X))
复制代码
第2行代码中,Y为实际值,regr.predict(X)为预测值,打印输出r2的结果为0.855,与利用statsmodels库获得的评估结果是一致的。
演示了如何用Python编程计算R-squared值、Adj.R-squared值和P值,后面的文章将从数学原理的角度来讲解这三个概念。