优化求解器用于 Scikit 学习中的 One vs rest

Optimization solver Used for One vs rest in Sickit learn

我正在尝试使用 Logistic 回归解决多 class class 化问题。我的数据集有 3 个不同的 classes,每个数据点只属于一个 class。这是示例 training_data;

此处第一列是我添加为偏置项的向量。并且目标列已经使用label binarize的概念进行了二值化,如sickit-learn

中所述

然后得到目标如下;

array([[1, 0, 0],
   [1, 0, 0],
   [0, 1, 0],
   [1, 0, 0],
   [1, 0, 0]])

接下来,我将使用一对多休息的概念对其进行训练,即一次训练一个 class 层。示例代码;


for i in range(label_train.shape[1]):
    clf = LogisticRegression(random_state=0,multi_class='ovr', solver='liblinear',fit_intercept=True).\
 fit(train_data_copy, label_train[:,i])
    #print(clf.coef_.shape)

如您所见,我总共训练了 3 个 classifier,每个标签对应一个。我在这里有两个问题;

第一个问题:根据 sickit-learn 文档,

multi_class{‘auto’, ‘ovr’, ‘multinomial’}, default=’auto’ If the option chosen is ‘ovr’, then a binary problem is fit for each label. For ‘multinomial’ the loss minimised is the multinomial loss fit across the entire probability distribution, even when the data is binary. ‘multinomial’ is unavailable when solver=’liblinear’. ‘auto’ selects ‘ovr’ if the data is binary, or if solver=’liblinear’, and otherwise selects ‘multinomial’.

我的问题是因为我选择求解器作为 liblinear(作为 o.v.r 问题),我 select multi_class 作为 auto 还是ovr.

第二个问题是关于截距(或偏置)项的。文档说如果 fit_intercept=True 则将偏差项添加到决策函数中。但我注意到,当我没有将 1 的向量添加到我的数据矩阵时,系数中的参数数量、theta 向量与特征数量相同,尽管 fit_intercept=True。我的问题是,我们是否必须将 1 的向量添加到数据矩阵,以及启用 fit_intercept 以便将偏差项添加到决策函数中。

  1. 没关系;正如您可能看到的 here,无论何时选择 multi_class='auto'multi_class='ovr' 都会在 solver='liblinear'.
  2. 时产生相同的结果
  3. solver='liblinear' 的情况下,使用等于 1 的默认偏差项并通过 intercept_scaling 属性附加到 X(这反过来仅在 fit_intercept=True 时有用),因为您可以参见 here. You'll have the fitted bias (dimension (n_classes,)) returned by intercept_ after fitting (zero-valued if fit_intercept=False). Fitted coefficients are returned by coef_ (dimension (n_classes, n_features) and not (n_classes, n_features + 1) - splitting done here)。

这是一个例子,考虑 Iris 数据集(具有 3 类 和 4 个特征):

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)

clf = LogisticRegression(random_state=0, fit_intercept=True, multi_class='ovr', solver='liblinear')
clf.fit(X, y)
clf.intercept_, clf.coef_
################################
(array([ 0.26421853,  1.09392467, -1.21470917]),
 array([[ 0.41021713,  1.46416217, -2.26003266, -1.02103509],
        [ 0.4275087 , -1.61211605,  0.5758173 , -1.40617325],
        [-1.70751526, -1.53427768,  2.47096755,  2.55537041]]))