python数据分析——正则化

时间:2024-06-07 18:12:05

参考资料:活用pandas库

        正则化旨在解决模型的过拟合问题。

        在实际中,可能存在模型的训练分数很好,而测试分数却很低,这说明模型出现了过拟合问题。正则化通过对系数和变量施加约束来解决模型过拟合的问题。这会导致数据的系数变小。

        在LASSO回归的情况下,可以丢弃某些系数;而在岭回归中,系数会趋近于0,但但并不是被丢弃。

# 导入pandas库
import pandas as pd
# 读取数据集
acs=pd.read_csv(r"...\data\acs_ny.csv")
# 展示数据列
print(acs.columns)
# 使用patsy创建设计矩阵
from patsy import dmatrices
response,predictors=dmatrices(
'FamilyIncome ~ NumBedrooms + NumChildren + NumPeople + '\
'NumRooms + NumUnits + NumVehicles + NumWorkers + OwnRent + '\
'YearBuilt + ElectricBill + FoodStamp + HeatingFuel + '\
'Insurance + Language',
data=acs)
# 使用sklearn 把数据集分为训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(predictors,
                                               response,
                                               random_state=0)

from sklearn.linear_model import LinearRegression
lr=LinearRegression().fit(X_train,y_train)
model_coefs=pd.DataFrame(list(zip(predictors.design_info.column_names,
                                lr.coef_[0])),
                       columns=['variable','coef_lr'])
# 展示拟合系数
print(model_coefs)
# 查看模型得分
print(lr.score(X_train,y_train))
print(lr.score(X_test,y_test))

1、LASSO回归

        LASSO(least absolute shrinkage and selection operator),也称L1正则化回归。

# 导入LASSO模块
from sklearn.linear_model import Lasso
lasso=Lasso(random_state=0).fit(X_train,y_train)
coef_lasso=pd.DataFrame(
    list(zip(predictors.design_info.column_names,lasso.coef_)),
    columns=['variable','coef_lasso'])
model_coefs=pd.merge(model_coefs,coef_lasso,on='variable')
print(model_coefs)

print(lasso.score(X_train,y_train))
print(lasso.score(X_test,y_test))

        此时有些系数已经变成0。但模型的预测得分并未有明显提升。

2、岭回归

        岭回归,也称L2正则化回归。

# 导入Ridge模块
from sklearn.linear_model import Ridge
ridge=Ridge(random_state=0).fit(X_train,y_train)
coef_ridge=pd.DataFrame(
    list(zip(predictors.design_info.column_names,ridge.coef_[0])),
    columns=['variable','coef_ridge'])
model_coefs=pd.merge(model_coefs,coef_ridge,on='variable')
print(model_coefs)

3、弹性网

        弹性网结合了岭回归和LASSO回归两种方法。

        ElasticNet对象有两个参数——alpha和l1_ratio,可用于控制模型的行为。l1_ratio参数专门控制L2或L1使用的惩罚量。如果l1_ratio=0,则模型为岭回归;如果l1_ratio=1,则模型是LASSO回归。如果l1_ratio的值介于两者时间,则模型就是岭回归和LASSO回归的组合。

from sklearn.linear_model import ElasticNet
en=ElasticNet(random_state=42).fit(X_train,y_train)
coefs_en=pd.DataFrame(
    list(zip(predictors.design_info.column_names,en.coef_)),
    columns=['variable','coef_en'])
model_coefs=pd.merge(model_coefs,coefs_en,on='variable')
print(model_coefs)

4、交叉验证

        交叉验证是拟合模型的常用方法。交叉验证还是选择最后正则化参数的方法。选择模型时,用户必须调整某些参数(也称“超参数”),这时可以使用交叉验证尝试超参数的各种组合,以寻找“最佳模型”。ElasticNet对象的ElasticNetCV函数与之类似,它可以迭代使用各种超参数值来拟合弹性网。

from sklearn.linear_model import ElasticNetCV 
en_cv=ElasticNetCV(cv=5,random_state=42).fit(X_train,y_train)
coefs_en_cv=pd.DataFrame(
    list(zip(predictors.design_info.column_names,en_cv.coef_)),
    columns=['variable','coef_en_cv'])
models_coefs=pd.merge(model_coefs,coefs_en_cv,on='variable')
print(model_coefs)

        正则化是一种用来防止数据过度拟合的技术,它通过添加到模型中的每个特征施加一些惩罚来实现该目标。最终结果是从模型中删除一些变量,或减少模型的系数。这两种方法都会降低模型对训练数据的拟合准确度,却能大大提升对未知数据的预测能力。