接之前的线性回归文章,传送门如下。
上面这篇文章是利用方差膨胀因子,去诊断与减轻多重共线性对线性回归的影响。
需要人为介入(根据得到的方差膨胀值去判断),耗费过多的时间。
于是便有了正则化方法的出现,通过收缩方法(正则化方法)进行回归。
正则化方法主要包括岭回归与LASSO回归。
/ 01 / 岭回归
岭回归通过人为加入的惩罚项(约束项),对回归系数进行估计,为有偏估计。
有偏估计,允许估计有不大的偏度,以换取估计的误差显著减小,并在其残差平方和为最小的原则下估计回归系数。
通常岭回归方程中的R²会稍低于线性回归分析,但回归系数的显著性往往明显高于普通线性回归。
这里不对相应的理论知识进行细说,说实话小F也是晕乎乎...
所以选择先调包,看看效果是啥样的。
使用机器学习框架scikit-learn进行岭回归参数的选择(正则化系数)。
数据是书中的数据,已上传网盘,公众号回复「正则化」,即可获取。
scikit-learn当中的模型不会默认对数据标准化,必须手动执行。
标准化后的数据可以消除量纲,让每个变量的系数在一定意义下进行直接比较。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.linear_model import RidgeCV
from sklearn.preprocessing import StandardScaler
# 消除pandas输出省略号情况及换行情况
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
# 读取数据,skipinitialspace:忽略分隔符后的空白
df = pd.read_csv('creditcard_exp.csv', skipinitialspace=True)
# 获取信用卡有支出的行数据
exp = df[df['avg_exp'].notnull()].copy().iloc[:, 2:].drop('age2', axis=1)
# 获取信用卡无支出的行数据,NaN