有一些标准方法可以预测比例,例如逻辑回归(没有阈值处理)和β回归。已经有人讨论过这个问题:
http://scikit-learn-general.narkive.com/lLVQGzyl/beta-regression
我无法确定sklearn
框架内是否存在解决方法。
答案 0 :(得分:5)
存在一种解决方法,但<{1}}框架中
。如果你有一个比例目标变量(值范围0-1),你会在scikit-learn中遇到两个基本困难:
有多种方法可以用数学方法制定逻辑回归。其中之一是generalized linear model,它基本上将逻辑回归定义为对数转换概率的正态线性回归。通常,这种方法需要复杂的数学优化,因为概率是未知的,需要与回归系数一起估算。
但是,在您的情况下,概率是已知的。这意味着您只需使用sklearn
转换它们即可。现在它们涵盖了y = log(p / (1 - p))
到-oo
的整个范围,可以作为LinearRegression模型[*]的目标变量。当然,然后需要再次转换模型输出以产生概率oo
。
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]]
)也可以很好地处理概率,但是如果你想使用它们,那么有更多专门的库而不是sklearn。[*]你实际上可以插入任何 linear回归模型,它可以使该方法更强大,但它不再完全等同于逻辑回归。