有一些标准的预测比例的方法,例如逻辑回归(没有阈值)和 beta 回归。已经有关于这个的讨论:
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回归模型,可以使方法更强大,但不再完全等同于逻辑回归。
