Fork me on GitHub

机器学习第二篇——逻辑回归

转载自 追梦程序员 公众号

前面介绍了机器学习中最简单的线性回归模型,机器学习第一篇——线性模型。今天,我们就来看看传说中的逻辑回归(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,让类库自动提高非法用户样本的权重。

     solver : {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}
          选择求解优化问题的方法。默认‘liblinear’。  
          liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
          lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
          newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
          sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。

     max_iter : int, default: 100
           算法执行的最大迭代次数。只适用于solver 取值为 newton-cg, sag and lbfgs。

    multi_class : str, {‘ovr’, ‘multinomial’}, default: ‘ovr’
           多分类问题的解决方法。ovr对应one-vs-rest方法,multinomial对应MvM方法。

Attributes:
coef_ : array, shape (1, n_features) or (n_classes, n_features)
模型的参数,即W向量。

     intercept_ : array, shape (1,) or (n_classes,)
           模型的截距,即独立变量b。

Methods:
fit(X, y[, sample_weight])
利用数据样本X,y拟合模型,求出模型的W和b。

     predict(X)
            对数据样本X进行预测,返回对应的分类。

     predict_proba(X)
            对数据样本X进行预测,返回样本属于每一个分类的概率。

    score(X, y[, sample_weight])
            计算模型在数据样本X,y上的得分。

以上就是本次的全部内容。


本文地址:https://www.6aiq.com/article/1534591763237
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出