zl程序教程

您现在的位置是:首页 >  其它

当前栏目

sklearn中LogisticRegression与线性可分支持向量机(LinearSVC)

支持 线性 向量 sklearn
2023-09-14 09:06:10 时间

LogisticRegression类的各项参数的含义

class sklearn.linear_model.LogisticRegression(penalty='l2', 
          dual=False, tol=0.0001, C=1.0, fit_intercept=True, 
          intercept_scaling=1, class_weight=None, 
          random_state=None, solver='liblinear', max_iter=100, 
          multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)

penalty='l2' : 字符串‘l1’或‘l2’,默认‘l2’。​

  • 用来指定惩罚的基准(正则化参数)。只有‘l2’支持‘newton-cg’、‘sag’和‘lbfgs’这三种算法。​
  • 如果选择‘l2’,solver参数可以选择‘liblinear’、‘newton-cg’、‘sag’和‘lbfgs’这四种算法;如果选择‘l1’的话就只能用‘liblinear’算法。​

dual=False : 对偶或者原始方法。Dual只适用于正则化相为l2的‘liblinear’的情况,通常样本数大于特征数的情况下,默认为False。

C=1.0 : C为正则化系数λ的倒数,必须为正数,默认为1。和SVM中的C一样,值越小,代表正则化越强。​

fit_intercept=True : 是否存在截距,默认存在。​

intercept_scaling=1 : 仅在正则化项为‘liblinear’,且fit_intercept设置为True时有用。​

solver='liblinear' : solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择。

  • a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。​
  • b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。​
  • c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。​
  • d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。​

从上面的描述可以看出,newton-cg、lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear通吃L1正则化和L2正则化。

同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化,所以当你有大量的样本,又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量,要么回到L2正则化。

但是liblinear也有自己的弱点!我们知道,逻辑回归有二元逻辑回归和多元逻辑回归。对于多元逻辑回归常见的有one-vs-rest(OvR)和many-vs-many(MvM)两种。而MvM一般比OvR分类相对准确一些。而liblinear只支持OvR,不支持MvM,这样如果我们需要相对精确的多元逻辑回归时,就不能选择liblinear了。也意味着如果我们需要相对精确的多元逻辑回归不能使用L1正则化了。

正则化算法适用场景
L1liblinearliblinear适用于小数据集;如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化;如果模型的特征非常多,希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
L2liblinearlibniear只支持多元逻辑回归的OvR,不支持MvM,但MVM相对精确。
L2lbfgs/newton-cg/sag较大数据集,支持one-vs-rest(OvR)和many-vs-many(MvM)两种多元逻辑回归。
L2sag如果样本量非常大,比如大于10万,sag是第一选择;但不能用于L1正则化。

multi_class='ovr' : 分类方式。

  • ​ovr即one-vs-rest(OvR),multinomial是many-vs-many(MvM)。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。​
  • ovr不论是几元回归,都当成二元回归来处理。mvm从从多个类中每次选两个类进行二元回归。如果总共有T类,需要T(T-1)/2次分类。​
  • OvR相对简单,但分类效果相对略差(大多数样本分布情况)。而MvM分类相对精确,但是分类速度没有OvR快。​
  • OvR相对简单,但分类效果相对略差(大多数样本分布情况)。而MvM分类相对精确,但是分类速度没有OvR快。​

class_weight=None : 类型权重参数。用于标示分类模型中各种类型的权重。默认不输入,即所有的分类的权重一样。​

  • 选择‘balanced’自动根据y值计算类型权重。​
  • 自己设置权重,格式:{class_label: weight}。例如0,1分类的er'yuan二元模型,设置class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。​

random_state=None : 随机数种子,默认为无。仅在正则化优化算法为sag,liblinear时有用。​

max_iter=100 : 算法收敛的最大迭代次数。​

tol=0.0001 : 迭代终止判据的误差范围。​

verbose=0 : 日志冗长度int:冗长度;0:不输出训练过程;1:偶尔输出; >1:对每个子模型都输出​

warm_start=False : 是否热启动,如果是,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。布尔型,默认False。

n_jobs=1 : 并行数,int:个数;-1:跟CPU核数一致;1:默认值。

​LogisticRegression类的常用方法​

fit(X, y, sample_weight=None)

  • 拟合模型,用来训练LR分类器,其中X是训练样本,y是对应的标记向量
  • 返回对象,self。

fit_transform(X, y=None, **fit_params)

  • fit与transform的结合,先fit后transform。返回X_new:numpy矩阵。

predict(X)

  • 用来预测样本,也就是分类,X是测试集。返回array。

predict_proba(X)

  • 输出分类概率。返回每种类别的概率,按照分类类别顺序给出。如果是多分类问题,multi_class="multinomial",则会给出样本对于每种类别的概率。
  • 返回array-like。

score(X, y, sample_weight=None)

  • 返回给定测试集合的平均准确率(mean accuracy),浮点型数值。
  • 对于多个分类返回,则返回每个类别的准确率组成的哈希矩阵。

​因为这里数据量小,结果准确率只有0.7。嘛,只是小小的示范一下怎么使用sklearn的逻辑回归方法。在训练模型之前,可以优化一下模型参数,用GridSearchCV()函数。​

    logistic_regression_path类则比较特殊,它拟合数据后,不能直接来做预测,只能为拟合数据选择合适逻辑回归的系数和正则化系数。主要是用在模型选择的时候。一般情况用不到这个类,所以后面不再讲述logistic_regression_path类。

    此外,scikit-learn里面有个容易让人误解的类RandomizedLogisticRegression,虽然名字里有逻辑回归的词,但是主要是用L1正则化的逻辑回归来做特征选择的,属于维度规约的算法类,不属于我们常说的分类算法的范畴。

    后面的讲解主要围绕LogisticRegression和LogisticRegressionCV中的重要参数的选择来来展开,这些参数的意义在这两个类中都是一样的。

​2、线性可分支持向量机(LinearSVC)​

​LinearSVC 是线性分类支持向量机,不能使用核函数方法处理非线性分类问题。 LinearSVC 算法与 SVC 算法在使用 ‘linear’ 核函数时的结果基本一致,但 LinearSVC 是基于 liblinear 库实现,计算速度更快。 LinearSVC 有多种惩罚参数和损失函数可供选择,可以应用于大样本集(大于10000)训练。​

sklearn.svm.LinearSVC()​

class sklearn.svm.LinearSVC(penalty=‘l2’, loss=‘squared_hinge’, *
                , dual=True, tol=0.0001, C=1.0, multi_class=‘ovr’, 
                fit_intercept=True, intercept_scaling=1, class_weight=None, 
                verbose=0, random_state=None, max_iter=1000)

​LinearSVC() 类的主要参数:​

​C:float, default=1.0  惩罚系数,必须大于0,默认值 1.0。用于设置对错误分类的惩罚强度,对于完全线性可分的硬间隔问题不需要设置。

fit_intercept : boolean, optional (default=True)  是否计算截距,默认为 True。如果数据均值为 0,则可以选择 False 不计算截距。

multi_class : string, ‘ovr’ or ‘crammer_singer’ (default=’ovr’)  多类别分类策略开关。对于多元分类问题,选择 ‘ovr’ 将使用多类别策略(one-vs-rest)直接对多个类别进行分类(默认方法);选择 ‘crammer_singer’ 将逐次进行二值分类。

class_weight:dict or ‘balanced’, default=None  特征变量的加权系数。用于为某个特征变量设权重,默认所有特征变量的权重相同。​

​LinearSVC() 类的主要属性:

coef_:  决策函数的参数估计值,即线性模型参数 w1,w2,… 的估计值。

intercept_:  决策函数中的常数项,即线性模型截距 w0 的估计值。

classes_:  样本数据的分类标签。指分几类,每一类如何表示。

LinearSVC() 类的主要方法:

fit(X, y[, sample_weight])  用样本集的数据(X,y)训练SVM模型。

get_params([deep])  获取模型参数。注意不是指分类模型的系数,而是指 penalty, C, fit_intercept, class_weight 等训练的设置参数。

decision_function(X)  由SVM模型计算 X 的决策函数值,即样本 X 到分离超平面的距离。注意不是分类判别结果。

predict(X)  用训练好的 SVM 模型预测数据集 X 的分类判别结果,如0/1。 score(X,y[,sample_weight])  评价指标,对训练样本集 X 的分类准确度。 LinearSVC 定义训练样本集的输入格式为 (X,y),X 是 n行(样本数)*m列(特征数)的二维数组,y 是样本分类标签。

​​​​