输出在特定区间内时的回归

机器算法验证 回归 物流 多重比较
2022-04-09 08:56:44

假设我的输出在间隔上是连续的[1,1]. 有没有标准的技术来处理这个问题?我是否只使用逻辑函数,与逻辑回归相同,但用于实际回归而不是分类?还有哪些其他选择,标准方法是什么?

2个回答

适当的技术取决于您的目标。

如果您正在构建推理模型,则应关注以协变量为条件的目标分布的属性,p(y|x).

例如,值0.5(y+1)可以分布为Beta(α(x),β(x)). 在这种情况下,您可以对函数的参数执行最大似然估计α(x)β(x),并为它们找到最佳形式(例如线性或对数线性)。谷歌“beta回归”了解更多细节。

代替Beta,您可以将 GLM 与您想要的任何链接功能配合使用(实际上,logit 链接是常用的)。你也可以映射y进入(,)使用您想要的任何功能,并使用无约束回归。然而,如果准确的话,最后一种方法可能会失败±1s 存在于您的数据中。

另一个技巧是将回归转换为加权分类。从每次训练观察(x,y)您可以生成两个观察结果(x,1)(x,0)具有相应的权重1+y21y2,拟合概率分类器(例如逻辑或概率回归),然后转换预测的概率1回到y.

如果您正在构建预测模型,则可能会忽略概率属性,您只需专注于预测y尽可能接近,无论它意味着什么。在这种情况下,您可以适合任何功能y=f(x), 并在外面截断[1,1]. 这种方法允许您尝试许多不同的回归算法,而无需过多关注y.

此外,一些机器学习模型(例如,决策树及其集合随机森林、k-最近邻或任何其他预测 a 是训练样本加权平均值的方法)在设计上无法预测高于最高训练值,或低于最低。如果您使用它们,您可能永远不会担心y.

什么方法是标准的,取决于领域和您的目标但是将逻辑函数拟合到连续数据似乎没问题:

  • 它总是预测(1,1)
  • 它甚至可以精确地工作±1
  • 广义线性形式为您提供推理和特征选择的基础
  • 在我看到的大多数情况下,它的预测准确度都不错。

现在是实施的时候了。有一个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。

此类指标的基本原理是最终您可能不想预测y尽可能准确,但分开低y从高y尽可能准确,但您事先不知道阈值,或者它是可变的。基于排名的指标比基于差异的指标更能反映这一过程。

与其他分布相比,简单线性回归理论更适用于正态变量。当我们必须处理像你这样的问题时,我们可以使用变量的变化在您的情况下,我将使用如下更改:

z=2y1y2=11y11+y

这个函数正在增加:如果y更伟大,z更伟大。什么时候y靠近1,z靠近; 什么时候y靠近+1,z靠近+. 通过这些技巧,您可以计算自变量之间的线性关系x和因变量z.