机器学习实践之scikit-learn:逻辑斯蒂回归(Logistic regression)

logistic 回归,虽然名字里有 “回归” 二字,但实际上是解决分类问题的一类线性模型。在某些文献中,logistic 回归又被称作 logit 回归,maximum-entropy classification(MaxEnt,最大熵分类),或 log-linear classifier(对数线性分类器)。在这个模型中,用logistic function对单次试验(single trial)的可能结果的概率进行建模。

scikit-learn 的逻辑斯蒂回归实现包含在 LogisticRegression. 可用于拟合二分类(binary), 一对多分类(One-vs- Rest), 及多项式 logistic 回归,并带有可选的 L1 和 L2 正则化。

作为优化问题,带 L2 罚项的二分类 logistic 回归要最小化以下代价函数(cost function):

\underset{w, c}{min\,} \frac{1}{2}w^T w + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1) .

类似地,带 L1 正则的 logistic 回归解决的是如下优化问题:

\underset{w, c}{min\,} \|w\|_1 + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1) .

在 LogisticRegression 类中实现了这些优化算法: “liblinear”, “newton-cg”, “lbfgs”, “sag” 和 “saga”:

 “liblinear” 使用了坐标下降算法(Coordinate Descent, CD), 并基于 scikit-learn 内附的高性能 C++ 库 LIBLINEAR library 实现.然而liblinear实现的CD算法无法学习真正意义上的多分类模型; 相反,最优化问题分解为“one-vs-rest”(当前类和其他类) ,为每个类训练一个二元分类器,所以在底层使用这种方式的 LogisticRegression 表现的想一个多元分类器. 对使用 L1罚项而言, sklearn.svm.l1_min_c 可以计算 C 的下界,以避免模型为空(即全部特征分量的权重为零)。

“lbfgs”, “sag” 和“newton-cg” 只支持 L2 惩罚项,对某些高维数据收敛更快。这些求解器的参数 `multi_class`设为 “multinomial” 即可训练一个真正的多项式 logistic 回归  [5], 其预测的概率比默认的 “one-vs-rest” 设定更为准确。

“sag” 基于平均随机梯度下降算法 [6]. 在大数据集上的表现更快,大数据集指样本量大且特征数多。

“saga” [7] 是 “sag” 的一类变体,支持非平滑(non-smooth)的 L1 正则选项 penalty=”l1” . 对于稀疏多项式 logistic 回归 ,往往选用该求解器.

一言以蔽之,选用求解器可遵循如下规则:

Case Solver
L1正则 “liblinear” or “saga”
多项式损失(multinomial loss) “lbfgs”, “sag”, “saga” or “newton-cg”
大数据集 (n_samples) “sag” or “saga”

“saga” 一般都是最佳的选择. 但出于一些历史原因默认的是 “liblinear” 。

对于大数据集,还可以用 SGDClassifier ,并使用对数损失(’log’ loss)

示例:

  • L1 Penalty and Sparsity in Logistic Regression
  • Path with L1- Logistic Regression
  • Plot multinomial and One-vs-Rest Logistic Regression
  • Multiclass sparse logisitic regression on newgroups20
  • MNIST classfification using multinomial logistic + L1

与 liblinear 的区别:

当 fit_intercept=False 拟合得到的 coef_ 或者待预测的数据为零时,用 solver=liblinear 的 LogisticRegression 或 LinearSVC 与直接使用外部 liblinear 库预测得分会有差异。这是因为, 对于 decision_function 为零的样本, LogisticRegression 和 LinearSVC 将预测为负类,而 liblinear 预测为正类。 注意,设定了 fit_intercept=False ,又有很多样本使得 decision_function 为零的模型,很可能会欠拟合,其表现往往比较差。建议您设置 fit_intercept=True 并增大 intercept_scaling 。

Note

 

利用稀疏 logistic 回归进行特征选择

带 L1 罚项的 logistic 回归 将得到稀疏模型(sparse model),相当于进行了特征选择(feature selection),详情参见 基于 L1 的特征选取 。

LogisticRegressionCV 对 logistic 回归 的实现内置了交叉验证(cross-validation),可以找出最优的参数 C . “newton-cg”, “sag”, “saga” 和“lbfgs” 在高维数据上更快, 因为采用了热启动(warm-starting). 在多分类设定下, 若multi_class option 设置为 “ovr”(“one-vs-rest”), 会为每类求一个最佳的 C 值;若  multi_classoption设置为 “multinomial”, 会通过交叉熵损失(cross-entropy loss)求出一个最佳 C 值。

参考文献:

[5] Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 4.3.4
[6] Mark Schmidt, Nicolas Le Roux, and Francis Bach: Minimizing Finite Sums with the Stochastic Average Gradient.
[7] Aaron Defazio, Francis Bach, Simon Lacoste-Julien: SAGA: A Fast Incremental Gradient Method With Support for Non-Strongly Convex Composite Objectives.

参考:

scikit-learn 0.19 文档

scikit-learn 0.18 中文文档

Scikit-learn 0.19.x 中文文档

 

你可能感兴趣的:(机器学习)