所以正则化系数只要小于40或50,模型的拟合效果应该都不错。
- 正则化系数越小则模型拟合越好,但过拟合情况也越容易发生。
- 正则化系数越大,则越不容易过拟合,但模型的偏差越大。
RidgeCV通过交叉验证,可以快速返回“最优”的正则化系数。
当这只是基于数值计算的,可能最终结果并不符合业务逻辑。
比如本次模型的变量系数。
- # 输出模型的变量系数
- print(rcv.coef_)
- # 输出结果
- [ 0.03321449 -0.30956185 0.05551208 0.59067449]
发现收入的系数为负值,这肯定是不合理的。
下面通过岭迹图进行进一步分析。
岭迹图是在不同正则化系数下变量系数的轨迹。
- ridge = Ridge()
- coefs = []
- # 不同正则化系数下的变量系数
- for alpha in alphas:
- ridge.set_params(alpha=alpha)
- ridge.fit(X, y)
- coefs.append(ridge.coef_)
-
- # 绘制变量系数随正则化系数变化的轨迹
- ax = plt.gca()
- ax.plot(alphas, coefs)
- ax.set_xscale('log')
- plt.xlabel('alpha')
- plt.ylabel('weights')
- plt.title('Ridge coefficients as a function of the regularization')
- plt.axis('tight')
- plt.show()
输出结果。
- ①有两个变量的系数在不同的正则化系数下都很接近于0,那么可以选择删除。
- ②正则化系数越大,对变量系数的惩罚越大,所有变量的系数都趋近于0。
- ③有一个变量的系数变化非常大(有正有负),说明该系数的方差大,存在共线性的情况。
综合模型均方误差和岭迹图的情况,选取正则化系数为40。
- 如果大于40,则模型均方误差增大,模型拟合效果变差。
- 如果小于40,则变量系数不稳定,共线性没有得到抑制。
那么就来看看,当正则化系数为40时,模型变量系数的情况。
- ridge.set_params(alpha=40)
- ridge.fit(X, y)
- # 输出变量系数
- print(ridge.coef_)
- # 输出模型R²
- print(ridge.score(X, y))
- # 预测数据
- print(np.exp(ridge.predict(X_new)[:5]))
- # 输出结果
- [0.03293109 0.09907747 0.04976305 0.12101456]
- 0.4255673043353688
- [934.79025945 727.11042209 703.88143602 759.04342764 709.54172995]
发现变量系数都为正值,符合业务直觉。
收入和当地人均收入这两个变量可以保留,另外两个删除。
二、LASSO回归
LASSO回归,在令回归系数的绝对值之和小于一个常数的约束条件下,使残差平方和最小化。
从而能够产生某些严格等于0的回归系数,得到解释力较强的模型。
相比岭回归,LASSO回归还可以进行变量筛选。
使用LassoCV交叉验证确定最优的正则化系数。
- # 生成正则化系数
- lasso_alphas = np.logspace(-3, 0, 100, base=10)
- # 使用不同的正则化系数对模型进行交叉验证
- lcv = LassoCV(alphas=lasso_alphas, cv=10)
- # 使用数据集训练(fit)
- lcv.fit(X, y)
- # 输出最优参数,正则化系数及相应模型R²
- print('The best alpha is {}'.format(lcv.alpha_))
- print('The r-square is {}'.format(lcv.score(X, y)))
-
- # 输出结果
- The best alpha is 0.04037017258596556
- The r-square is 0.4426451069862233
发现最优的正则化系数为0.04,模型R²为0.443。
接下来获取不同正则化系数下的变量系数轨迹。
- lasso = Lasso()
- lasso_coefs = []
- # 不同正则化系数下的变量系数
- for alpha in lasso_alphas:
- lasso.set_params(alpha=alpha)
- lasso.fit(X, y)
- lasso_coefs.append(lasso.coef_)
-
- # 绘制变量系数随正则化系数变化的轨迹
- ax = plt.gca()
- ax.plot(lasso_alphas, lasso_coefs)
- ax.set_xscale('log')
- plt.xlabel('alpha')
- plt.ylabel('weights')
- plt.title('Lasso coefficients as a function of the regularization')
- plt.axis('tight')
- plt.show()
(编辑:南京站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|