转载自 追梦程序员 公众号

前面介绍了机器学习中最简单的线性回归模型,机器学习第一篇——线性模型。今天,我们就来看看传说中的逻辑回归(logistic regression)。

大家首先想一想,如果我们想要用已求得的线性模型来完成对样本的二分类,一个最简单的做法如下。

这样虽然可以完成对数据样本的分类,但这样的分类有许多的弊端:

1.没有体现输出值越大的样本属于正样本的可能性越大;

2.分类函数其实是单位阶跃函数,不具有连续、可导的性质。

为了解决以上两点的弊端,我们试图找到一个分类函数,希望它在作用上和单位阶跃函数类似,但具有连续、可导的性质。这样就引出了对数几率函数(logistic function)。

它的函数图像如下。

它在x>0时输出大于0.5,我们可以设为正样本,并且x越大,输出越接近1,则认为样本属于正样本的概率越大。在x<0的情况类似。我们利用这个函数进行分类的原理如下。

那么问题就来了,假设我们有一批已知分类的数据样本,我们通过什么办法求出W和b呢。我们可以利用极大似然的思想,就是让每个数据样本属于其真实分类的概率越大越好。具体做法如下。

我们的目标就是max lnL(w,b)。具体的解法如下。

好了,到此为止,逻辑回归的原理就讲清楚了。下面我们来看看如何使用scikit-learn上的LogisticRegression。一个简单的例子如下。

from sklearn.linear_model import LogisticRegression

XTrain = [[0,0],[1,1]]

YTrain = [0,1]

reg = LogisticRegression()

reg.fit(XTrain, YTrain)

print(reg.score(XTrain,YTrain))

下面对LogisticRegression中的参数进行说明:

Parameters:

penalty : str, ‘l1’ or ‘l2’, default: ‘l2’

选择以哪种方式进行正则化,有 ‘l1’ 和 ‘l2’两种选择,分别对应L1和L2的正则化,默认 ‘l2’。正则化的主要作用是缓解模型过拟合问题。

    tol : float, default: 1e-4
         算法停止的容忍标准,当相邻的两个迭代差小于该值是,算法停止运行。

     C : float, default: 1.0
         正则化系数λ的倒数,C越小,正则化力度越大。

     fit_intercept : bool, default: True
         和线性回归一样,是否使用独立变量b。

     class_weight : dict or ‘balanced’, default: None
        class_weight参数用于标示分类模型中各种类别的权重,可以不输入,即不考虑权重,或者说所有类别的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重,比如对于0,1的二元分类模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类别0的权重为90%,而类别1的权重为10%。
       如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。

         该参数的主要作用:
        第一种是误分类的代价很高。比如对癌症患者和非癌症患者进行分类,将癌症患者分类为非癌症患者的代价很高,因为这样的错分

可以会使一个患者没有得到及时的治疗。但将非癌症患者分类为癌症患者则没有那么严重,这样再进行检查就能知道错分了。此时,我们可以适当提高癌症患者的权重。

第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高