2017-05-29 52 views

回答

3

存在解决方法,但它不是本质上sklearn框架。

如果你有一个比例目标变量(取值范围0-1)你遇到两个基本困难scikit学习:

  • 分类器(如逻辑回归)处理类的标签,因为只有目标变量。作为一种解决方法,您可以简单地将您的概率限定为0/1并将它们解释为类标签,但是会丢失大量信息。
  • 回归模型(如线性回归)不会限制目标变量。您可以根据比例数据对它们进行训练,但不能保证未见数据的输出将限制在0/1范围内。但是,在这种情况下,有一个强大的解决方法(见下文)。

有不同的方法来数学表达逻辑回归。其中之一是generalized linear model,它基本上将logistic回归定义为logit转换概率的正态线性回归。通常,这种方法需要复杂的数学优化,因为概率是未知的,需要与回归系数一起进行估计。

然而就你而言,概率是已知的。这意味着您可以简单地将它们转换为y = p/(1 - p)。现在它们覆盖从-oooo的整个范围,并且可以用作LinearRegression模型[*]的目标变量。当然,模型输出需要再次变换以产生概率p = 1/(exp(-y) + 1)

import numpy as np 
from sklearn.linear_model import LinearRegression 


class LogitRegression(LinearRegression): 

    def fit(self, x, p): 
     p = np.asarray(p) 
     y = np.log(p/(1 - p)) 
     return super().fit(x, y) 

    def predict(self, x): 
     y = super().predict(x) 
     return 1/(np.exp(-y) + 1) 


if __name__ == '__main__': 
    # generate example data 
    np.random.seed(42) 
    n = 100 
    x = np.random.randn(n).reshape(-1, 1) 
    noise = 0.1 * np.random.randn(n).reshape(-1, 1) 
    p = np.tanh(x + noise)/2 + 0.5 

    model = LogitRegression() 
    model.fit(x, p) 

    print(model.predict([[-10], [0.0], [1]])) 
    # [[ 2.06115362e-09] 
    # [ 5.00000000e-01] 
    # [ 8.80797078e-01]] 
  • 也有许多其他选择。一些非线性回归模型可以在0-1范围内自然工作。例如Random Forest Regressors将永远不会超过他们接受培训的目标变量的范围。简单地把概率放在里面,你会得到概率。具有适当的输出激活函数的神经网络(我猜想是tanh)也可以很好地处理概率,但是如果你想使用这些网络,那么存在比sklearn更专业的库。

[*]你可以在事实上塞任何linear回归模型,可以使该方法更强大,但随后不再是完全等同于逻辑回归。

+0

能否请您解释一下应该对其中包含的0或1的概率训练/测试数据做什么?在这些情况下,y是-inf和div。 –

+0

@JakeDrew最简单的解决方案是将* 0 *替换为* e *和* 1 *替换为* 1-e *,其中* e *是一个非常小的数字。 (你也可以用'p = p * e + 0.5 * e'来清理概率)。我猜'e = 1e-16'会运作良好。 – kazemakase

+0

感谢您的快速响应!我正在尝试完全按照您之前的建议。我发现对于范围p =(0,1),使用.009和.991表示0和1的值产生10倍cv MAE = 0.059或5.9%。在相同的数据上使用p = 9e-16可将MAE驱动至0.2266或22.6%。 e的精度似乎对平均绝对误差有巨大的影响。当y = np.log(p /(1-p))和p = 0.991时,则y = 6.9。当p = 9e-16时,y = 36.7。也许我对我自己的数据集过度合适? –

相关问题