有预测比例的标准方法,如逻辑回归(无阈值)和贝塔回归。目前已经讨论一下:当目标变量是一个比例时如何使用sklearn
http://scikit-learn-general.narkive.com/lLVQGzyl/beta-regression
如果sklearn
框架内,存在一个变通我不能告诉。
有预测比例的标准方法,如逻辑回归(无阈值)和贝塔回归。目前已经讨论一下:当目标变量是一个比例时如何使用sklearn
http://scikit-learn-general.narkive.com/lLVQGzyl/beta-regression
如果sklearn
框架内,存在一个变通我不能告诉。
存在解决方法,但它不是本质上内sklearn
框架。
如果你有一个比例目标变量(取值范围0-1)你遇到两个基本困难scikit学习:
有不同的方法来数学表达逻辑回归。其中之一是generalized linear model,它基本上将logistic回归定义为logit转换概率的正态线性回归。通常,这种方法需要复杂的数学优化,因为概率是未知的,需要与回归系数一起进行估计。
然而就你而言,概率是已知的。这意味着您可以简单地将它们转换为y = 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]]
tanh
)也可以很好地处理概率,但是如果你想使用这些网络,那么存在比sklearn更专业的库。[*]你可以在事实上塞任何linear回归模型,可以使该方法更强大,但随后不再是完全等同于逻辑回归。
能否请您解释一下应该对其中包含的0或1的概率训练/测试数据做什么?在这些情况下,y是-inf和div。 –
@JakeDrew最简单的解决方案是将* 0 *替换为* e *和* 1 *替换为* 1-e *,其中* e *是一个非常小的数字。 (你也可以用'p = p * e + 0.5 * e'来清理概率)。我猜'e = 1e-16'会运作良好。 – kazemakase
感谢您的快速响应!我正在尝试完全按照您之前的建议。我发现对于范围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。也许我对我自己的数据集过度合适? –