Scikit-learn 逻辑回归库简单总结与实践

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_40449129/article/details/102610513

        节对逻辑回归的原理及推导过程进行了总结,本节我们对Scikit-learn库中逻辑回归进行参数经验总结,并在鸢尾花数据上,利用Scikit-learn中逻辑回归库进行分类。

1)概述
        在sklearn.linear_model下有两个类,LogisticRegression, LogisticRegressionCV。两者的主要的区别在于,LogisticRegressionCV使用了交叉验证的方式来选择正则化参数C,而LogisticRegression需要指定一个正则化参数,其他参数基本相同。下面以LogisticRegression API为例,总结一些在实际工作中需要调整的一些参数。
        LogisticRegression 官方API,
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=’warn’, max_iter=100, multi_class=’warn’, verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)source

2)scikit-learn v0.21.3中的LogisticRegression 参数介绍
        ● pernalty,正则化选择参数,默认为l2

        penalty参数对应上节第8小节正则惩罚项知识,可选择的值为‘l1’, ‘l2’, ‘elasticnet’ or ‘none’,。分别对应L1的正则化,L2的正则化,L1+L2正则化,不加任何正则。该参数的目的是为了解决模型过拟合,正常默认l2就可以降低模型复杂度。但如果l2正则还是过拟合,可以考虑该为l1正则。另外,如果模型特征非常多,我们需要进行模型特征选择时可以使用l1正则(L1正则可以让模型稀疏化);如果模型特征存在很强的相关性时,可以考虑使用elasticnet。
        pernalty参数的选择会影响损失函数优化算法的选择(solver,5种优化算法 {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’})。l1正则,solver可以用liblinear和saga(l1正则的损失函数,在0处不可导,其他三种优化方式需要损失函数连续可导);L2正则或者solver取none时,solver可以选择newton-cg, sag , lbfgs,saga;penalty=elasticnet时,solver只支持saga 。

        ● C,正则化系数选择参数,默认为1
        C为正则化系数λ的倒数,C值越小正则效果越强,超参数C值通常通过交叉验证进行选择。

        ● class_weight,类别权重选择参数,默认为空
        当样本出现不平衡时,可以通过class_weight参数调整样本之间的权重。class_weight参数为空时,表示不考虑权重,即所有的类别权重一样。在样本不平衡时,可以选择"balanced"自动平衡或者根据样本所占比例进行手动指定。比如class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。

        ● solver,优化算法选择参数,默认为lbfgs
        solver参数决定逻辑回归损失函数的优化方法,有5中算法可以选择: {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}。
        newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
        lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
        liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
        sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
        saga:快速梯度下降算法,SAG算法的一个加速版本。
        对于小型数据集,“ liblinear”是一个不错的选择,而对于大型数据集,“ sag”和“ saga”则更快。
        在多元逻辑回归中,“liblinear”只支持OvR, ‘newton-cg’, ‘sag’, ‘saga’ and ‘lbfgs’ 支持MvM。而MvM一般比OvR分类相对准确一些。

        ● multi_class,分类方式选择参数默认为ovr
        multi_class参数决定我们分类方式的选择,有‘ovr’, ‘multinomial’, ‘auto’三个值可以选择,默认为’ovr’。
        ovr即为one-vs-rest(OvR),multinomial即为many-vs-many(MvM),对于二元逻辑回归,ovr和multinomial没有任何区别。
        在多元回归中,OvR的思想很简单,无论你是多少元逻辑回归,都可以看做二元逻辑回归。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类以此类推。
        而MvM比较复杂,简单的讲是,每次将若干个类作为正类,若干个其他类作为反类。MvM的正、反类构造必须有特殊的设计,不能随意选取。MvM的一个特例是OvO。OvO将N个类别两两配对,从而产生N(N-1)/2个二分类任务。在测试阶段,新样本将同时提交给所有分类器,得到N(N-1)/2个分类结果,最终结果可由投票产生。
        一般情况下,OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。
        solver用liblinear,multi_class只能取OvR。

3)案例
        下面调用LogisticRegression包,对鸢尾花教学数据进行分类,大家可以尝试更改上面说的一些参数,比较下分类效果的变化。


import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
import  matplotlib as mpl

# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2]  # we only take the first two features.
Y = iris.target

logreg = LogisticRegression(C=1e5, solver='lbfgs', multi_class='multinomial')

# Create an instance of Logistic Regression Classifier and fit the data.
logreg.fit(X, Y)

y_hat = logreg.predict(X)
y_hat_prob = logreg.predict_proba(X)

print('y_hat = \n', y_hat)
print('y_hat_prob = \n', y_hat_prob)
print('准确度:%.2f%%' % (100*np.mean(y_hat == Y.ravel())))

# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [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
h = .02  # step size in the mesh
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()])

cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure(facecolor='w')
plt.pcolormesh(xx, yy, Z, cmap=cm_light)

# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=cm_dark)
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()

(欢迎转载,转载请注明出处。)

猜你喜欢

转载自blog.csdn.net/weixin_40449129/article/details/102610513