【问题标题】:how predict no more than target example?如何预测不超过目标示例?
【发布时间】:2020-07-08 22:46:43
【问题描述】:

我有变量,我需要预测它的值尽可能接近,但不要大于它。例如,给定 y_true = 9000,我希望 y_pred 是 [0,9000] 范围内的任何值,尽可能接近 9000。如果 y_true = 8000 分别 y_pred 应该是 [0,8000]。也就是说,我想对预测值进行某种限制。对于样本中的每对预测和目标变量,该阈值是单独的。如果 y_true = [8750,9200,8900,7600],则 y_pred 应为 [

data, target = np.array(data),np.array(df_tar)
X_train,X_test,y_train,y_test=train_test_split(data,target)
gbr = GradientBoostingRegressor(max_depth=1,n_estimators=100)
%time gbr.fit(X_train,np.ravel(y_train))
print(gbr.score(X_test,y_test),gbr.score(X_train,y_train))

【问题讨论】:

  • 这个关于将序列转换为预定义范围的问题可能会有所帮助:stackoverflow.com/questions/929103/…
  • 请尽量在你的帖子中表达完整的逻辑,而不需要额外的编辑,因为它也会迫使用户修改他们的答案。

标签: python machine-learning scikit-learn


【解决方案1】:

由于实际更改和提出模型的复杂性,该模型可以将您希望的这种方法用于 sklearn 的功能并应用它,我强烈建议您在预测后通过此过滤器,并将所有预测值替换为 9000 到 9000 . 然后,手动计算分数,我相信在这种情况下是mse

这是我的方法的完整工作示例:

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error as mse
import numpy as np

X = [[8500,9500],[9200,8700],[8500,8250],[5850,8800]]
y = [8750,9200,8900,7600]
data, target = np.array(X),np.array(y)
gbr = GradientBoostingRegressor(max_depth=1,n_estimators=100)
gbr.fit(data,np.ravel(target))
predictions = gbr.predict(data)
print(predictions) ## The original predicitions

输出:

[8750.14958301 9199.23464805 8899.87846735 7600.73730159]

执行替换:

fixed_predictions = np.array([z if y>z else y for y,z in zip(target,predictions)])
print(fixed_predictions)

[8750.         9199.23464805 8899.87846735 7600.        ]

计算新分数:

score = mse(target,predictions)
print(score)

输出:

10000.145189724533

【讨论】:

  • 所有值减去 [maxY-9000] 的差异怎么样?这不会引入更少的噪音吗? (我只有 1 个大学年的 ML 经验)
  • 您当然可以对其进行缩放以减少噪音,这是一个好主意,但这不会避免算法(给定适当的数据)做出高于用户期望阈值的预测。 (例如,一个多边形拟合,在缩放之后,可能仍然过拟合并预测一个略高于观察到的 x 的 x 的巨大 a 值)
  • 假设预测的最高 Y 分数是 9500,如果我将所有预测减去 500,它们都将低于 9000,因此它尊重阈值
  • 啊,对不起,我误解了你的意思!这似乎和我的方法一样,我只是将它们强制为 9000 而不是减去差异,但本质上,它会将所有 9000+ 预测值变为 9000 对吗?
  • 唯一的区别是它会保持“订单”,例如 9400 将变为 8900,而 9500 变为 9000。但我不确定这是否改进了模型,这就是我问的原因:)
猜你喜欢
  • 2019-01-28
  • 2020-09-03
  • 2018-05-04
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2021-12-13
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多