我需要预测的目标变量是probabilities
(与标签相对)。我的训练数据中的相应列也是这种形式。我不希望通过对目标进行阈值处理来丢失信息,以便从中创建分类问题。
如果我使用二进制标签训练logistic regression classifier
,则sk-learn逻辑回归API允许在预测时获得概率。但是,我需要用概率训练它。有没有办法在scikits-learn中做到这一点,或者一个合适的Python包可以扩展到1K维的100K数据点。
答案 0 :(得分:1)
这是一个很好的问题,因为(与人们可能认为的相反),逻辑回归有许多合法用途......回归!
如果您坚持进行真正的逻辑回归,可以使用三种基本方法,另外两种方法可以提供类似的结果。他们都假设您的目标输出介于0和1之间。大多数情况下,您必须手动生成训练/测试集""除非你很幸运能够使用支持SGD-R的平台,其中包含定制内核和开箱即用的X验证支持。
请注意,根据您的特定用例,"不完全正确的逻辑回归"选项可能是必要的。这些方法的缺点是,如果您希望通过删除弱功能来减少功能空间,则需要花费更多的工作来查看每个功能的重量/重要性。
如果你不介意做一些编码,你可以使用scipy优化功能。这很简单:
其中inverse-logit(z)= exp ^(z)/(1 + exp ^ z)
如果您正在使用具有自定义损失的SGD回归的平台,那么您可以使用它,指定丢失y_t * log(y_o)+(1-y_t)* log(1 - y_o)< / p>
这样做的一种方法就是将sci-kit学习并将日志丢失添加到回归SGD求解器中。
您可以通过过采样将问题转换为分类问题,如@ jo9k所述。但请注意,即使在这种情况下,您也不应使用标准X验证,因为数据不再独立。您需要手动将数据分解为训练/测试集,并且只有在将它们分开后才能进行过采样。
(编辑:我做了一些测试,发现在我的测试集上,sigmoid内核表现不佳。我认为它们需要一些特殊的预处理才能按预期工作。带有sigmoid内核的SVM相当于2- layer tanh神经网络,应该适用于训练数据输出是概率的回归任务。我可能会在进一步审查后再回过头来看。)
使用带有sigmoid内核的SVM,您应该得到类似的逻辑回归结果。您可以使用sci-kit learn的SVR函数并将内核指定为sigmoid。您可能会遇到1000个功能中的100,000个数据点的性能问题....这引出了我的最终建议:
这种方法会使结果远离真正的逻辑回归,但它的性能非常高。该过程如下:
使用sci-kit-learn的RBFsampler为您的数据集显式构建一个近似的rbf内核。
通过该内核处理您的数据,然后使用带有铰链丢失的sci-kit-learn的SGDRegressor,在转换后的数据上实现超级高效的SVM。
以上内容使用代码here
答案 1 :(得分:0)
我希望回归者使用问题的结构。一个这样的 结构是目标是概率。
在scikit-learn
中,您不能使用非指标概率进行交叉熵损失;这没有实现,也不支持API。这是scikit-learn
的限制。
一般来说,根据scikit-learn
的文档,损失函数的格式为Loss(prediction, target)
,其中预测是模型的输出,目标是地面实况值。
在逻辑回归的情况下,预测是(0,1)
上的值(即“软标签”),而目标是0
或1
(即“硬”标签“)。
对于逻辑回归,您可以根据标签的概率对实例进行过采样来将概率近似为目标。例如如果给定样本class_1
有概率0.2
,class_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_proba
与Logistic Regression classifier
scikit-learn
。{/ p>
替代解决方案是在Tensorflow中实现(或查找实现?)LogisticRegression
,您可以根据需要定义损失函数。
在编译此解决方案时,我使用scikit-learn - multinomial logistic regression with probabilities as a target variable和scikit-learn classification on soft labels的答案。我建议那些人提供更多见解。
答案 2 :(得分:-1)
使用predict
函数
predict_proba