如何进行回归而不是使用逻辑回归和scikit学习进行分类

时间:2017-12-05 22:17:40

标签: python scikit-learn logistic-regression

我需要预测的目标变量是probabilities(与标签相对)。我的训练数据中的相应列也是这种形式。我不希望通过对目标进行阈值处理来丢失信息,以便从中创建分类问题。

如果我使用二进制标签训练logistic regression classifier,则sk-learn逻辑回归API允许在预测时获得概率。但是,我需要用概率训练它。有没有办法在scikits-learn中做到这一点,或者一个合适的Python包可以扩展到1K维的100K数据点。

3 个答案:

答案 0 :(得分:1)

这是一个很好的问题,因为(与人们可能认为的相反),逻辑回归有许多合法用途......回归!

如果您坚持进行真正的逻辑回归,可以使用三种基本方法,另外两种方法可以提供类似的结果。他们都假设您的目标输出介于0和1之间。大多数情况下,您必须手动生成训练/测试集""除非你很幸运能够使用支持SGD-R的平台,其中包含定制内核和开箱即用的X验证支持。

请注意,根据您的特定用例,"不完全正确的逻辑回归"选项可能是必要的。这些方法的缺点是,如果您希望通过删除弱功能来减少功能空间,则需要花费更多的工作来查看每个功能的重量/重要性。

使用优化的直接方法

如果你不介意做一些编码,你可以使用scipy优化功能。这很简单:

  1. 创建以下类型的函数: y_o = inverse-logit(a_0 + a_1x_1 + a_2x_2 + ...)
  2. 其中inverse-logit(z)= exp ^(z)/(1 + exp ^ z)

    1. 使用scipy最小化来最小化-1 * [y_t * log(y_o)+(1-y_t)* log(1 - y_o)]的总和,在所有数据点上求和。为此,您必须设置一个以(a_0,a_1,...)为参数并创建函数然后计算损失的函数。
    2. 具有自定义损失的随机梯度下降

      如果您正在使用具有自定义损失的SGD回归的平台,那么您可以使用它,指定丢失y_t * log(y_o)+(1-y_t)* log(1 - y_o)< / p>

      这样做的一种方法就是将sci-kit学习并将日志丢失添加到回归SGD求解器中。

      转换为分类问题

      您可以通过过采样将问题转换为分类问题,如@ jo9k所述。但请注意,即使在这种情况下,您也不应使用标准X验证,因为数据不再独立。您需要手动将数据分解为训练/测试集,并且只有在将它们分开后才能进行过采样。

      转换为SVM

      (编辑:我做了一些测试,发现在我的测试集上,sigmoid内核表现不佳。我认为它们需要一些特殊的预处理才能按预期工作。带有sigmoid内核的SVM相当于2- layer tanh神经网络,应该适用于训练数据输出是概率的回归任务。我可能会在进一步审查后再回过头来看。)

      使用带有sigmoid内核的SVM,您应该得到类似的逻辑回归结果。您可以使用sci-kit learn的SVR函数并将内核指定为sigmoid。您可能会遇到1000个功能中的100,000个数据点的性能问题....这引出了我的最终建议:

      使用近似内核

      转换为SVM

      这种方法会使结果远离真正的逻辑回归,但它的性能非常高。该过程如下:

      1. 使用sci-kit-learn的RBFsampler为您的数据集显式构建一个近似的rbf内核。

      2. 通过该内核处理您的数据,然后使用带有铰链丢失的sci-kit-learn的SGDRegressor,在转换后的数据上实现超级高效的SVM。

      3. 以上内容使用代码here

答案 1 :(得分:0)

  

我希望回归者使用问题的结构。一个这样的   结构是目标是概率

scikit-learn中,您不能使用非指标概率进行交叉熵损失;这没有实现,也不支持API。这是scikit-learn的限制。

一般来说,根据scikit-learn的文档,损失函数的格式为Loss(prediction, target),其中预测是模型的输出,目标是地面实况值。

在逻辑回归的情况下,预测是(0,1)上的值(即“软标签”),而目标是01(即“硬”标签“)。

对于逻辑回归,您可以根据标签的概率对实例进行过采样来将概率近似为目标。例如如果给定样本class_1有概率0.2class_2 has probability 0.8 , then generate 10 training instances (copied sample): 8 with class_2 as "ground truth target label" and 2 with class_1`。

显然它是变通方法并且效率不高,但它应该可以正常工作。

如果您对上采样方法没有问题,可以pip install eli5使用eli5.lime.utils.fit_probaLogistic Regression classifier scikit-learn。{/ p>

替代解决方案是在Tensorflow中实现(或查找实现?)LogisticRegression,您可以根据需要定义损失函数。

在编译此解决方案时,我使用scikit-learn - multinomial logistic regression with probabilities as a target variablescikit-learn classification on soft labels的答案。我建议那些人提供更多见解。

答案 2 :(得分:-1)