python数据分析——正则化

打印 上一主题 下一主题

主题 492|帖子 492|积分 1476

参考资料:活用pandas库
        正则化旨在解决模型的过拟合问题。
        在实际中,可能存在模型的训练分数很好,而测试分数却很低,这阐明模型出现了过拟合问题。正则化通过对系数和变量施加束缚来解决模型过拟合的问题。这会导致数据的系数变小。
        在LASSO回归的环境下,可以丢弃某些系数;而在岭回归中,系数会趋近于0,但但并不是被丢弃。
  1. # 导入pandas库
  2. import pandas as pd
  3. # 读取数据集
  4. acs=pd.read_csv(r"...\data\acs_ny.csv")
  5. # 展示数据列
  6. print(acs.columns)
  7. # 使用patsy创建设计矩阵
  8. from patsy import dmatrices
  9. response,predictors=dmatrices(
  10. 'FamilyIncome ~ NumBedrooms + NumChildren + NumPeople + '\
  11. 'NumRooms + NumUnits + NumVehicles + NumWorkers + OwnRent + '\
  12. 'YearBuilt + ElectricBill + FoodStamp + HeatingFuel + '\
  13. 'Insurance + Language',
  14. data=acs)
  15. # 使用sklearn 把数据集分为训练集和测试集
  16. from sklearn.model_selection import train_test_split
  17. X_train,X_test,y_train,y_test=train_test_split(predictors,
  18.                                                response,
  19.                                                random_state=0)
  20. from sklearn.linear_model import LinearRegression
  21. lr=LinearRegression().fit(X_train,y_train)
  22. model_coefs=pd.DataFrame(list(zip(predictors.design_info.column_names,
  23.                                 lr.coef_[0])),
  24.                        columns=['variable','coef_lr'])
  25. # 展示拟合系数
  26. print(model_coefs)
  27. # 查看模型得分
  28. print(lr.score(X_train,y_train))
  29. print(lr.score(X_test,y_test))
复制代码
1、LASSO回归
        LASSO(least absolute shrinkage and selection operator),也称L1正则化回归。
  1. # 导入LASSO模块
  2. from sklearn.linear_model import Lasso
  3. lasso=Lasso(random_state=0).fit(X_train,y_train)
  4. coef_lasso=pd.DataFrame(
  5.     list(zip(predictors.design_info.column_names,lasso.coef_)),
  6.     columns=['variable','coef_lasso'])
  7. model_coefs=pd.merge(model_coefs,coef_lasso,on='variable')
  8. print(model_coefs)
  9. print(lasso.score(X_train,y_train))
  10. print(lasso.score(X_test,y_test))
复制代码
        此时有些系数已经变成0。但模型的预测得分并未有显着提拔。
2、岭回归
        岭回归,也称L2正则化回归。
  1. # 导入Ridge模块
  2. from sklearn.linear_model import Ridge
  3. ridge=Ridge(random_state=0).fit(X_train,y_train)
  4. coef_ridge=pd.DataFrame(
  5.     list(zip(predictors.design_info.column_names,ridge.coef_[0])),
  6.     columns=['variable','coef_ridge'])
  7. model_coefs=pd.merge(model_coefs,coef_ridge,on='variable')
  8. print(model_coefs)
复制代码
3、弹性网
        弹性网结合了岭回归和LASSO回归两种方法。
        ElasticNet对象有两个参数——alpha和l1_ratio,可用于控制模型的举动。l1_ratio参数专门控制L2或L1使用的惩罚量。如果l1_ratio=0,则模型为岭回归;如果l1_ratio=1,则模型是LASSO回归。如果l1_ratio的值介于两者时间,则模型就是岭回归和LASSO回归的组合。
  1. from sklearn.linear_model import ElasticNet
  2. en=ElasticNet(random_state=42).fit(X_train,y_train)
  3. coefs_en=pd.DataFrame(
  4.     list(zip(predictors.design_info.column_names,en.coef_)),
  5.     columns=['variable','coef_en'])
  6. model_coefs=pd.merge(model_coefs,coefs_en,on='variable')
  7. print(model_coefs)
复制代码
4、交叉验证
        交叉验证是拟合模型的常用方法。交叉验证照旧选择末了正则化参数的方法。选择模型时,用户必须调解某些参数(也称“超参数”),这时可以使用交叉验证明验超参数的各种组合,以寻找“最佳模型”。ElasticNet对象的ElasticNetCV函数与之雷同,它可以迭代使用各种超参数值来拟合弹性网。
  1. from sklearn.linear_model import ElasticNetCV
  2. en_cv=ElasticNetCV(cv=5,random_state=42).fit(X_train,y_train)
  3. coefs_en_cv=pd.DataFrame(
  4.     list(zip(predictors.design_info.column_names,en_cv.coef_)),
  5.     columns=['variable','coef_en_cv'])
  6. models_coefs=pd.merge(model_coefs,coefs_en_cv,on='variable')
  7. print(model_coefs)
复制代码
        正则化是一种用来防止数据过度拟合的技能,它通过添加到模型中的每个特性施加一些惩罚来实现该目的。最终结果是从模型中删除一些变量,或减少模型的系数。这两种方法都会低落模型对训练数据的拟合准确度,却能大大提拔对未知数据的预测能力。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表