二十四 机器学习之逻辑回归5.

261 阅读4分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一 R vs Python,统计学vs机器学习

  • 有许多学过R,或者和python一起学习R的小伙伴,曾向我问起各种各样的统计学问题,因为R中有各种各样的统计功能,而python的统计学功能并不是那么全面。我也曾经被小伙伴们发给我的"R风格python代码"弄得晕头转向,也许R的代码希望看起来高大上,但python之美就是简单明了(P.S.Python开发者十分有情怀,在jupyter中输入import this 可以查看python中隐含的彩蛋,python制作者所写的诗歌"python之禅",通篇赞美了python代码的简单,明快,容易阅读之美,大家感兴趣的可以百度搜一搜看看翻译)。
  • 回归正题,为什么python和R在统计学的功能上差异如此之大呢?也许大家听说过,R是学统计学的人开发的,因此整个思路都是统计学的思路,而python是学计算机的人开发的,因此整个思路都是计算机的思路,也无怪R在处理统计问题上比python强很多了,这两种学科不同的思路强烈反应在统计学和机器学习的各种建模流程当中。
  • 统计学的思路是一种"先验"的思路,不管做什么都要先"检验",先"满足条件",事后也要各种"检验",以确保各种数学假设被满足,不然的话,理论上就无法得出好结果。而机器学习是一种"后验”的思路,不管三七二十一,我先让模型跑一跑,效果不好我再想办法,如果模型效果好,我完全不在意什么共线性,残差不满足正态分布,没有哑变量之类的细节,模型效果好大过天!
  • 作为一个非数学,非统计出身,从金融半路出家来敲python代码的人,我完全欣赏机器学习的这种"后验"思路:我们追求结果,不要过于在意那些需要满足的先决条件。对我而言,统计学是机器学习穷尽所有手段都无法解决问题后的"救星",如果机器学习不能解决问题,我会向统计学寻求帮助,但我绝不会一开始就想着要去满足各种统计要求。当然啦,如果大家是学统计学出身,写R出身,大家也可以把机器学习当成是统计学手段用尽后的"救星"。统计学和机器学习是相辅相成的,大家要了解两种思路的不同,以便在进入死胡同的时候,可以从另一个学科的思路中找到出路。只要能够解决问题的,都是好思路!

二 高效的嵌入法embedded

但是更有效的方法,毫无疑问会是我们的embedded嵌入法。我们已经说明了,由于L1正则化会使得部分特征对应的参数为0,因此L1正则化可以用来做特征选择,结合嵌入法的模块SelectFromModel,我们可以很容易就筛选出让模型十分高效的特征。注意,此时我们的目的是,尽量保留原数据上的信息,让模型在降维后的数据上的拟合效果保持优秀,因此我们不考虑训练集测试集的问题,把所有的数据都放入模型进行降维。

from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectFromModel
 
data = load_breast_cancer()
data.data.shape
 
LR_ = LR(solver="liblinear",C=0.9,random_state=420)
cross_val_score(LR_,data.data,data.target,cv=10).mean()
 
X_embedded = SelectFromModel(LR_,norm_order=1).fit_transform(data.data,data.target)
 
X_embedded.shape#(569, 9)

cross_val_score(LR_,X_embedded,data.target,cv=10).mean()#0.9368323826808401

看看结果,特征数量被减小到个位数,并且模型的效果却没有下降太多,如果我们要求不高,在这里其实就可以停下了。但是,能否让模型的拟合效果更好呢?在这里,我们有两种调整方式: 1)调节SelectFromModel这个类中的参数threshold,这是嵌入法的阈值,表示删除所有参数的绝对值低于这个简值的特征。现在threshold默认为None,所以SelectFromModel只根据L1正则化的结果来选择了特征,即选择了月有L1正则化后参数不为O的特征。我们此时,只要调整threshold的值(画出threshold的学习曲线),就可以观察不同的threshold 下模型的效果如何变化。一旦调整threshold,就不是在使用L1正则化选择特征,而是使用模型的属性.coef_中生成的各个特征的系数来选择。coef_虽然返回的是特征的系数,但是系数的大小和决策树中的feature_ importances_以及降维算法中的可解释性方差explained_vairance_概念相似,其实都是衡量特征的重要程度和贡献度的,因此SelectFromModel中的参数threshold可以设置为coef_的阈值,即可以剔除系数小于 threshold中输入的数字的所有特征。