临汾网站开发,小说系统 wordpress,开发一套系统需要多少钱,济南mip网站建设公司前情提要#xff1a;通俗地说逻辑回归【Logistic regression】算法#xff08;一#xff09; 逻辑回归模型原理介绍上一篇主要介绍了逻辑回归中#xff0c;相对理论化的知识#xff0c;这次主要是对上篇做一点点补充#xff0c;以及介绍sklearn 逻辑回归模型的参数#…前情提要通俗地说逻辑回归【Logistic regression】算法一 逻辑回归模型原理介绍上一篇主要介绍了逻辑回归中相对理论化的知识这次主要是对上篇做一点点补充以及介绍sklearn 逻辑回归模型的参数以及具体的实战代码。1.逻辑回归的二分类和多分类上次介绍的逻辑回归的内容基本都是基于二分类的。那么有没有办法让逻辑回归实现多分类呢那肯定是有的还不止一种。实际上二元逻辑回归的模型和损失函数很容易推广到多元逻辑回归。比如总是认为某种类型为正值其余为0值。举个例子要分类为ABC三类那么就可以把A当作正向数据B和C当作负向数据来处理这样就可以用二分类的方法解决多分类的问题这种方法就是最常用的one-vs-rest简称OvR。而且这种方法也可以方便得推广到其他二分类模型中当然其他算法可能有更好的多分类办法。另一种多元逻辑回归的方法是Many-vs-Many(MvM)它会选择一部分类别的样本和另一部分类别的样本来做逻辑回归二分类。听起来很不可思议但其实确实是能办到的。比如数据有ABC三个分类。我们将AB作为正向数据C作为负向数据训练出一个分模型。再将AC作为正向数据B作为负向数据训练出一个分类模型。最后BC作为正向数据C作为负向数据训练出一个模型。通过这三个模型就能实现多分类当然这里只是举个例子实际使用中有其他更好的MVM方法。限于篇幅这里不展开了。MVM中最常用的是One-Vs-OneOvO。OvO是MvM的特例。即每次选择两类样本来做二元逻辑回归。对比下两种多分类方法通常情况下Ovr比较简单速度也比较快但模型精度上没MvM那么高。MvM则正好相反精度高但速度上比不过Ovr。2.逻辑回归的正则化所谓正则化其目的是为了减弱逻辑回归模型的精度难道模型的准确度不是越高越好嘛看看下面这张图就明白了左边那个图就是过拟合的情况过拟合其实就是模型的精度太过高了它能非常好得匹配训练集的数据但一旦有新的数据就会表现得很差。而我们要的非过拟合的模型是精度可以差一些但泛化性能也就是对新的数据的识别能力要比较好。正则化就是减弱模型精度提高泛化效果的这个东西。3.sklearn各个参数def LogisticRegression(penaltyl2, dualFalse, tol1e-4, C1.0,fit_interceptTrue, intercept_scaling1, class_weightNone,random_stateNone, solverwarn, max_iter100,multi_classwarn, verbose0, warm_startFalse, n_jobsNone,l1_ratioNone)
跟线性回归一比逻辑回归的参数那还真是多啊不过我们一个一个来看看参数都是什么意思吧。 - dual对偶或者原始方法布尔类型默认为False。Dual只适用于正则化相为l2的‘liblinear’的情况通常样本数大于特征数的情况下默认为False。- tol停止迭代求解的阈值单精度类型默认为1e-4。- C正则化系数的倒数必须为正的浮点数默认为 1.0这个值越小说明正则化效果越强。换句话说这个值越小越训练的模型更泛化但也更容易欠拟合。- fit_intercept是否要使用截距在决策函数中使用截距布尔类型默认为True。- intercept_scaling官方解释比较模糊我说下个人理解。浮点型默认值是1.0。这个参数仅在“solver”参数下面介绍为“liblinear”“fit_intercept ”参数为True的时候生效。作用是给特征向量添加一个常量这个常量就是intercept_scaling。比如原本的向量是[x]那么添加后就变成[x,intercept_scaling]。- class_weight分类权重可以是一个dict字典类型也可以是一个字符串balanced字符串。默认是None也就是不做任何处理而balanced则会去自动计算权重分类越多的类权重越低反之权重越高。也可以自己输出一个字典比如一个 0/1 的二元分类可以传入{0:0.1,1:0.9}这样 0 这个分类的权重是0.11这个分类的权重是0.9。这样的目的是因为有些分类问题样本极端不平衡比如网络攻击大部分正常流量小部分攻击流量但攻击流量非常重要需要有效识别这时候就可以设置权重这个参数。- random_state设置随机数种子可以是int类型和None默认是None。当solver参数为sag和liblinear的时候生效。- verbose输出详细过程int类型默认为0不输出。当大于等于1时输出训练的详细过程。仅当solvers参数设置为liblinear和lbfgs时有效。- warm_start设置热启动布尔类型默认为False。若设置为True则以上一次fit的结果作为此次的初始化如果solver参数为liblinear时无效。- max_iter最大迭代次数int类型默认-1即无限制。注意前面也有一个tol迭代限制但这个max_iter的优先级是比它高的也就如果限制了这个参数那是不会去管tol这个参数的。OK上述就是对一些比较简略的参数的说明但是还有几个重要的参数没讲到这是因为这几个参数我觉得需要单独拎出来讲一讲。sklearn逻辑回归参数 --penalty正则化类型选择字符串类型可选l1l2elasticnet和None默认是l2通常情况下也是选择l2。这个参数的选择是会影响到参数solver的选择的下面会介绍。其中l1和l2。分别对应L1的正则化和L2的正则化elasticnet则是弹性网络这玩意我也不大懂默认是L2的正则化。在调参时如果主要的目的只是为了解决过拟合一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合即预测效果差的时候就可以考虑L1正则化。另外如果模型的特征非常多我们希望一些不重要的特征系数归零从而让模型系数稀疏化的话也可以使用L1正则化。penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择如果是L2正则化那么4种可选的算法{‘newton-cg’,‘lbfgs’,‘liblinear’,‘sag’}都可以选择。但是如果penalty是L1正则化的话就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的而{‘newton-cg’,‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。最后还有一个elasticnet这个只有solver参数为saga才能选。sklearn逻辑回归参数 --solver优化算法参数字符串类型一个有五种可选分别是newton-cg,lbfgs,liblinear,sag,saga。默认是liblinear。分别介绍下各个优化算法a) liblinear使用了开源的liblinear库实现内部使用了坐标轴下降法来迭代优化损失函数。b) lbfgs拟牛顿法的一种利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。c) newton-cg也是牛顿法家族的一种利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。d) sag即随机平均梯度下降是梯度下降法的变种和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度适合于样本数据多的时候。在优化参数的选择上官方是这样建议的esaga优化的无偏估计的sag方法。‘sag’ uses a Stochastic Average Gradient descent, and ‘saga’ uses its improved, unbiased version named SAGA.对小的数据集可以选择liblinear如果是大的数据集比如说大于10W的数据那么选择sag和saga会让训练速度更快。对于多分类问题只有newton-cg,sag,saga和lbfgs能够处理多项损失也就是MvM的情况还记得上面说到的多分类嘛而liblinear仅处理(OvR)的情况。啥意思就是用liblinear的时候如果是多分类问题得先把一种类别作为一个类别剩余的所有类别作为另外一个类别。一次类推遍历所有类别进行分类。这个的选择和正则化的参数也有关系前面说到penalty参数可以选择l1l2和None。这里liblinear是可以选择l1正则和l2正则但不能选择Nonenewton-cg,lbfgs,sag和saga这几种能选择l2或no penalty而saga则能选怎elasticnet正则。好吧这部分还是挺绕的。归纳一下吧二分类情况下数据量小一般默认的liblinear的行数据量大则使用sag。多分类的情况下在数据量小的情况下追求高精度可以用newton-cg或lbfgs以MvM的方式求解。数据量一大还是使用sag。当然实际情况下还是要调参多次才能确定参数这里也只能给些模糊的建议。sklearn逻辑回归参数 --multi_classmulti_class参数决定了我们分类方式的选择有 ovr和multinomial两个值可以选择默认是 ovr。ovr即前面提到的one-vs-rest(OvR)而multinomial即前面提到的many-vs-many(MvM)。如果是二元逻辑回归ovr和multinomial并没有任何区别区别主要在多元逻辑回归上。4.sklearn实例实例这部分就直接引用sklearn官网的使用逻辑回归对不同种类的鸢尾花进行分类的例子吧。import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model, datasets# 加载鸢尾花数据
iris datasets.load_iris()
# 只采用样本数据的前两个feature生成X和Y
X iris.data[:, :2]
Y iris.targeth .02 # 网格中的步长# 新建模型设置C参数为1e5并进行训练
logreg linear_model.LogisticRegression(C1e5)
logreg.fit(X, Y)# 绘制决策边界。为此我们将为网格 [x_min, x_max]x[y_min, y_max] 中的每个点分配一个颜色。
x_min, x_max X[:, 0].min() - .5, X[:, 0].max() .5
y_min, y_max X[:, 1].min() - .5, X[:, 1].max() .5
xx, yy np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z logreg.predict(np.c_[xx.ravel(), yy.ravel()])# 将结果放入彩色图中
Z Z.reshape(xx.shape)
plt.figure(1, figsize(4, 3))
plt.pcolormesh(xx, yy, Z, cmapplt.cm.Paired)# 将训练点也同样放入彩色图中
plt.scatter(X[:, 0], X[:, 1], cY, edgecolorsk, cmapplt.cm.Paired)
plt.xlabel(Sepal length)
plt.ylabel(Sepal width)plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())plt.show()运行上面那段代码会有如下的结果可以看到已将三种类型的鸢尾花都分类出来了。小结逻辑回归算是比较简单的一种分类算法而由于简单所以也比较适合初学者初步接触机器学习算法。学习了之后对后面一些更复杂的机器学习算法诸如Svm或更高级的神经网络也能有一个稍微感性的认知。而实际上Svm可以看作是逻辑回归的更高级的演化。而从神经网络的角度逻辑回归甚至可以看作一个最初级最浅层的神经网络。逻辑回归就像是金庸小说里面独孤九剑的第一式最为简单却又是其他威力极大的招式的基础其他的招式都又第一式演化而出。夯实基础才能砥砺前行。以上~参考文章scikit-learn 逻辑回归类库使用小结LogisticRegression - 参数说明