即可以看做回归算法,也可以看做分类算法。一般当做分类算法来用,解决二分类问题,如果要解决多分类问题,需要自己改进。
看下逻辑回归的问题点,对于逻辑回归来说,解决二分类问题。我们需要加入一个sigmoid函数求出我们的概率P,然后将结果分类为1和0两类
对于我们的逻辑回归来说,我们也采用梯度下降法的进行模型的构建。所以我们还是需要对我们的损失函数J进行求导操作
下面附上推导公式,具体的推导公式我进行了手写,实在敲不出来了
对推导过程没什么兴趣的话,直接看我们图的第二张纸方框中的结果,逻辑回归推导到最后,和我们线性模型的损失函数求导值基本一样。r然后我们将我们的y'使用sigmoid函数去替代,得出最后的我们的dJ 函数为
接下去的代码我就不贴了,和线性代数的代码基本一样,只要将我们的def J 和def dJ 修改下就好了,具体的梯度下降法的函数是不用动的,通过梯度下降法求出我们的theta值即可。所以对我们的fit操作,是和线性回归的代码是一样的,对于我们的predict操作。我们只需要带入sigmoid函数求出具体的P,通过P去判断y属于1还是0中的哪一类即可
我们的决策边界就是 我们的分割面
模型的正则化我们在损失函数J前面引入一个超参数C,后面正常加上L1或者L2范式
我们看看在scikit-learn中的代码使用
图中使我们没有采用多项式的方式,得出的决策边界,显然是欠拟合的。我们加入多项式
由上图我们可以看到,逻辑回归解决多分类的问题,
第一种思路就是提取出其中的一个分类,将另外所有的类别归为另一个类,这样我们采用逻辑回归得出每个类别的概率,然后将新样本进行多次分类。最后新样本在哪个模型得分最高,我们就将新样本分类到哪个类别里面去
第二种思路就是我们将所有类别,分别取出其中两个类别作比较,也就是一共要做C(n,2) 次类别的比较=n*(n-1) / 2
然后每个类别分别得出不同的类别的概率,将新样本在每个类别中做分类,最后得出新样本在这么多次比较中,得到的分类类别最多次的类别作为最后分类结果
所以OVO方式的效率是要比ovr要低的
在sklearn中默认采用的multi-class=‘ovr’方式,如果我们需要采用ovo的方式,我们需要改成OVO的方式,我们需要这样修改multi-class的值为ovo,另外,我们还需要修改solver="newton-cg",具体的solve值取多少,可以自行查阅文档
log_reg = LogisticRegression(multi_class="multinomial", solver="newton-cg")