Skip to main content
 首页 » 编程设计

python之当目标变量是比例时如何使用sklearn

2025年05月04日13findumars

有一些标准的预测比例的方法,例如逻辑回归(没有阈值)和 beta 回归。已经有关于这个的讨论:

http://scikit-learn-general.narkive.com/4dSCktaM/using-logistic-regression-on-a-continuous-target-variable

http://scikit-learn-general.narkive.com/lLVQGzyl/beta-regression

我无法确定 sklearn 框架中是否存在变通方法。

请您参考如下方法:

存在一种变通方法,但本质上不在 sklearn 框架内。

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

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

逻辑回归的数学公式有多种。其中之一是 generalized linear model ,它基本上将逻辑回归定义为对数变换概率的正态线性回归。通常,这种方法需要复杂的数学优化,因为概率是未知的,需要与回归系数一起估计。

但是,在您的情况下,概率是已知的。这意味着您可以使用 y = log(p/(1 - p)) 简单地转换它们。现在它们涵盖了从 -oo 到 oo 的整个范围,并且可以作为 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回归模型,可以使方法更强大,但不再完全等同于逻辑回归。