繁体   English   中英

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

[英]How to do regression as opposed to classification using logistic regression and scikit learn

我需要预测的目标变量是probabilities (与标签相反)。 我的训练数据中的相应列也采用这种形式。 我不想通过对目标设定阈值来创建信息分类问题而丢失信息。

如果我使用二进制标签训练logistic regression classifier ,则sk-learn logistic回归API允许在预测时获得概率。 但是,我需要用概率来训练它。 是否可以通过scikits-learn或适合的Python包将其缩放到1K维的100K数据点,来实现此目的。

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

如果您坚持使用真正的逻辑回归,可以使用三种基本方法,另外两种方法也可以提供相似的结果。 它们都假设您的目标输出在0到1之间。大多数时候,除非您有幸使用支持自定义内核和X-S的SGD-R平台,否则您将不得不“手动”生成训练/测试集。开箱即用的验证支持。

请注意,鉴于您的特定用例,可能需要“不是很正确的逻辑回归”选项。 这些方法的缺点是,如果要通过删除弱功能来减少特征空间,则需要花更多的精力来查看每个特征的权重/重要性。

使用优化的直接方法

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

  1. 创建以下类型的函数:y_o =反逻辑(a_0 + a_1x_1 + a_2x_2 + ...)

其中反逻辑(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,...)作为参数的函数,然后创建该函数,然后计算损耗。

具有自定义损失的随机梯度下降

如果您碰巧正在使用具有自定义损失的SGD回归的平台,则可以使用它,指定损失y_t * log(y_o)+(1-y_t)* log(1-y_o)

一种方法是仅进行sci-kit学习并将对数损失添加到回归SGD求解器中。

转换为分类问题

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

转换为SVM

(编辑:我进行了一些测试,发现我的测试集上的S形内核表现不佳。我认为它们需要进行一些特殊的预处理才能如预期的那样工作。具有S形内核的SVM等效于2层tanh神经网络,该网络应适合于以训练数据输出为概率的结构进行的回归任务。我可能会在进一步审查后再讨论。)

使用带有Sigmoid内核的SVM,应该获得与逻辑回归相似的结果。 您可以使用sci-kit Learn的SVR功能并将内核指定为Sigmoid。 您可能会在1000个功能中拥有100,000个数据点,从而遇到性能问题。...这导致了我的最终建议:

使用近似内核转换为SVM

这种方法将使结果离真正的逻辑回归还差一点,但它的性能非常好。 该过程如下:

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

  2. 通过该内核处理数据,然后使用带有铰链损耗的sci-kit-learn的SGDRegressor在转换后的数据上实现高性能SVM。

上面的代码在这里布置

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

scikit-learn ,您不能与非指标概率产生交叉熵损失; API中未实现此功能,不支持此功能。 这是scikit-learn的限制。

通常,根据scikit-learn的文档,损失函数的形式为Loss(prediction, target) ,其中预测是模型的输出,而target是真实值。

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


对于逻辑回归,您可以根据实例的标签概率对实例进行过度采样,从而将概率近似为目标。 例如,如果对于给定的样本, 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_probascikit-learnLogistic Regression classifier一起使用。


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


在编译此解决方案时,我使用了scikit-learn-多项式逻辑回归的答案, 并以概率作为目标变量,在软标签上进行了scikit-learn分类 我建议那些人以获得更多见解。

而不是在scikit学习库中使用predict ,而是使用predict_proba函数

请参考此处: http : //scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression.predict_proba

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM