【问题标题】:Does sklearn LogisticRegressionCV use all data for final modelsklearn LogisticRegressionCV 是否将所有数据用于最终模型
【发布时间】:2019-01-20 16:04:14
【问题描述】:

我想知道如何计算 sklearn 中 LogisticRegressionCV 的最终模型(即决策边界)。所以说我有一些 Xdata 和 ylabels 这样的

Xdata # shape of this is (n_samples,n_features)
ylabels # shape of this is (n_samples,), and it is binary

现在我跑了

from sklearn.linear_model import LogisticRegressionCV
clf = LogisticRegressionCV(Cs=[1.0],cv=5)
clf.fit(Xdata,ylabels)

这只是查看 CV 中的一个正则化参数和 5 个折叠。所以clf.scores_ 将是一个字典,其中一个键的值是一个形状为 (n_folds,1) 的数组。通过这五个折叠,您可以更好地了解模型的性能。

但是,我对您从 clf.coef_ 获得的信息感到困惑(我假设 clf.coef_ 中的参数是 clf.predict 中使用的参数)。我有几个选择,我认为可能是:

  1. clf.coef_ 中的参数来自在所有数据上训练模型
  2. clf.coef_ 中的参数来自最佳得分折叠
  3. clf.coef_ 中的参数以某种方式跨折叠进行平均。

我想这是一个重复的问题,但在我的一生中,我无法在网上、sklearn 文档或 LogisticRegressionCV 的源代码中找到一个直接的答案。我发现的一些相关帖子是:

  1. GridSearchCV final model
  2. scikit-learn LogisticRegressionCV: best coefficients
  3. Using cross validation and AUC-ROC for a logistic regression model in sklearn
  4. Evaluating Logistic regression with cross validation

【问题讨论】:

    标签: python machine-learning scikit-learn cross-validation


    【解决方案1】:

    默认情况下您有参数refit=True。在docs 你可以阅读:

    如果设置为 True,则对所有折叠的分数进行平均,并且 coefs 和对应于最佳分数的 C 被取,并且 最终改装是使用这些参数完成的。否则, 对应于折叠的最佳分数的截距和 C 是 平均。

    因此,如果 refit=True 使用所有数据重新训练 CV 模型。 当它说使用这些参数完成最终改装时,它是在谈论 C 正则化参数。所以它使用了最好的 C K 折的平均分。

    refit=False 时,它会为您检索交叉验证中的最佳模型。 因此,如果您训练 5 折,您将得到模型(系数 + C + 截距),在 4 折数据上进行训练,这在其折测试集上给出了最好的分数。 我同意这里的文档不是很清楚,但是平均 C 值和系数并没有多大意义

    【讨论】:

    • 感谢您的快速回复,很抱歉我忽略了这个论点。但是,我仍然看不到它在哪里说它使用了所有数据。当它说“使用这些参数完成最终改装”时,它是否只是使用折叠中得分最高的参数作为起始参数,然后在此改装期间再次更新它们?另外,我仍然对改装为假时会发生什么感到困惑。在我的例子中说有一个 C 和 5 个折叠。它只是平均所有5折的coef吗?如果有多个 C,它会先选择最好的 C,然后再选择折叠的平均系数吗?
    • 感谢您更新您的回复,这很有意义!
    【解决方案2】:

    你在超参数和参数之间搞错了。所有最终具有 CV 的 scikit-learn 估计器,如 LogisticRegressionCVGridSearchCVRandomizedSearchCV 调整超参数。

    超参数不是从数据训练中学习到的。它们是在学习之前设置的,假设它们将有助于最佳学习。更多信息是present here

    超参数是不直接在内部学习的参数 估计者。在 scikit-learn 中,它们作为参数传递给 估计器类的构造函数。典型的例子包括 C、 支持向量分类器的 kernel 和 gamma,Lasso 的 alpha 等。

    在 LogisticRegression 的情况下,C 是一个描述正则化强度倒数的超参数。 C 越高,在训练中应用的正则化就越少。并不是说C 会在训练期间更改。会修复的。

    现在来到coef_coef_ 包含在训练期间学习(和更新)的特征的系数(也称为权重)。现在,根据 C 的值(以及构造函数中存在的其他超参数),这些值可能会在训练期间发生变化。

    现在还有一个话题,如何得到coef_的最优初始值,让训练更快更好。那就是优化。有些以 0-1 之间的随机权重开头,有些以 0 开头,等等。但是对于您的问题范围,这无关紧要。 LogisticRegressionCV 不用于此。

    这就是 LogisticRegressionCV 的作用:

    1. 从构造函数中获取不同 C 的值(在您的示例中,您传递了 1.0)。
    2. 对于C 的每个值,对提供的数据进行交叉验证,其中LogisticRegression 将在当前折叠的训练数据上为fit(),并在测试数据上评分。所有折叠的测试数据的分数被平均,成为当前C的分数。对您提供的所有 C 值执行此操作,并且将选择平均得分最高的 C
    3. 现在选择的C 被设置为最终的C,并再次对整个数据(Xdata,ylabels 此处)训练 LogisticRegression(通过调用fit())。

    这就是所有超参数调谐器所做的事情,无论是 GridSearchCV、LogisticRegressionCV 还是 LassoCV 等。

    coef_ 特征权重的初始化和更新在算法的fit() 函数内完成,超出了超参数调整的范围。该优化部分取决于流程的内部优化算法。例如 solver 参数在 LogisticRegression 的情况下。

    希望这能让事情变得清晰。如果仍有疑问,请随时询问。

    【讨论】:

    • 作为您回答的后续行动,我认为在 LosgisticRegression 末尾有简历让我感到困惑。你是绝对正确的,这是为超参数调整而设计的,我只是关心使用这个 CV 来验证模型。最后,我认为here(cross_validate 函数)中的函数是我需要的,因为无论如何我只使用了一个 C。再次感谢您的超级有用的评论!
    猜你喜欢
    • 2019-11-17
    • 2017-06-28
    • 1970-01-01
    • 2019-09-02
    • 2020-05-31
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多