假设我的输出在间隔上是连续的. 有没有标准的技术来处理这个问题?我是否只使用逻辑函数,与逻辑回归相同,但用于实际回归而不是分类?还有哪些其他选择,标准方法是什么?
输出在特定区间内时的回归
适当的技术取决于您的目标。
如果您正在构建推理模型,则应关注以协变量为条件的目标分布的属性,.
例如,值可以分布为. 在这种情况下,您可以对函数的参数执行最大似然估计和,并为它们找到最佳形式(例如线性或对数线性)。谷歌“beta回归”了解更多细节。
代替,您可以将 GLM 与您想要的任何链接功能配合使用(实际上,logit 链接是常用的)。你也可以映射进入使用您想要的任何功能,并使用无约束回归。然而,如果准确的话,最后一种方法可能会失败s 存在于您的数据中。
另一个技巧是将回归转换为加权分类。从每次训练观察您可以生成两个观察结果和具有相应的权重和,拟合概率分类器(例如逻辑或概率回归),然后转换预测的概率回到.
如果您正在构建预测模型,则可能会忽略概率属性,您只需专注于预测尽可能接近,无论它意味着什么。在这种情况下,您可以适合任何功能, 并在外面截断. 这种方法允许您尝试许多不同的回归算法,而无需过多关注.
此外,一些机器学习模型(例如,决策树及其集合随机森林、k-最近邻或任何其他预测 a 是训练样本加权平均值的方法)在设计上无法预测高于最高训练值,或低于最低。如果您使用它们,您可能永远不会担心.
什么方法是标准的,取决于领域和您的目标。但是将逻辑函数拟合到连续数据似乎没问题:
- 它总是预测
- 它甚至可以精确地工作
- 广义线性形式为您提供推理和特征选择的基础
- 在我看到的大多数情况下,它的预测准确度都不错。
现在是实施的时候了。有一个R
评估这种模型的代码示例。
set.seed(1)
data = data.frame(x=1:100)
data$y = 1 / (1 + exp(5-0.1*(data$x) + rnorm(100)))
model = glm(y~x, family = 'binomial', data=data)
summary(model)
plot(x, y)
lines(x, predict(model, data, type = 'response'))
它输出下表估计系数(接近我使用的“真实”系数)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -4.48814 0.88243 -5.086 3.65e-07 ***
x 0.08713 0.01615 5.394 6.89e-08 ***
以及带有训练数据和拟合函数的图片
不幸的是,Python
'ssklearn
不允许逻辑回归在回归模式下运行,但可以使用statsmodels
- 它有一个Logit
允许连续目标的类。界面和输出与以下内容非常相似R
:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.formula.api as smf
np.random.seed(1)
df = pd.DataFrame({'x': range(100)})
df['y'] = 1 / (1 + np.exp(5-0.1*(df.x) + np.random.normal(size=100)))
model = smf.logit('y~x', data=df).fit()
print(model.params)
plt.scatter(df.x, df.y)
plt.plot(df.x, model.predict(df), color='k')
plt.show()
另一个值得考虑的问题是模型的评估指标。与标准 RMSE 和 MAE 一起,在此类问题中,基于等级的指标(例如 Spearman 相关性)可能很有用。如果您进行加权分类而不是回归,您还可以计算加权分类指标,例如 ROC AUC。
此类指标的基本原理是最终您可能不想预测尽可能准确,但分开低从高尽可能准确,但您事先不知道阈值,或者它是可变的。基于排名的指标比基于差异的指标更能反映这一过程。