为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以通过机器学习学习和预测 NaN 值?

是否可以通过机器学习学习和预测 NaN 值?

PIPIONE 2023-06-13 16:32:41
我正在尝试用两个输出值解决回归问题。输出值充当传入预订值的两个不同阈值,以接受或拒绝预订。这两个输出值是在业务案例中手动设置的,但这应在机器学习的帮助下自动完成。在业务案例中,其中一个输出值可以是 Nan,那么所有预订都将接受此标准。因此,如果一个输出值未填充,则它对业务案例有效。例子:X_train = np.array([(1,1),(2,2),(3,3),(4,4)])Y_train =np.array([(1,1),(2,2),(3,3),(4,np.nan)])X_test = np.array([(5,5),(6,6),(7,7)])Y_test = np.array([(5,5),(6,np.nan),(7,7)])reg  = MLPRegressor()reg = reg.fit(X_train,Y_train)我的问题是当我为输出 Y_train/Y_test 设置 NaN 值时,例如 scikit-learn 会抛出错误。ValueError: Input contains NaN, infinity or a value too large for dtype('float64').我不想用平均值或 0 来估算这些值,因为如上所述,缺失值是业务案例的有效设置。是否有可能用 scikit-learn 或一般的机器学习来解决这样的问题?编辑:业务未设置的输出值不直接存储为 NaN 而是存储为 -9999999999 以表示无穷大。我用 NaN 替换了这些值,因为我认为如此高的值会扭曲结果。所以如果我不替换任何东西,变量实际上会导致以下结果:X_train = np.array([(1,1),(2,2),(3,3),(4,4)])Y_train =np.array([(1,1),(2,2),(3,3),(4,-9999999999)])X_test = np.array([(5,5),(6,6),(7,7)])Y_test = np.array([(5,5),(6,-9999999999),(7,7)])是保留这些值比保留 NaN 更好,还是它们会扭曲结果而必须被忽略?
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

也许将您的问题分成两个任务是一个可以接受的解决方案。一个用于回归和分类是否提供数据。


X_train = np.array([(1,1),(2,2),(3,3),(4,4)])

Y1_train = np.array([(1,1),(2,2),(3,3),(4,4)])

Y2_train = np.array([(1,1),(1,1),(1,1),(1,0)])


X_test = np.array([(5,5),(6,6),(7,7)])

Y1_test = np.array([(5,5),(6,6),(7,7)])

Y2_test = np.array([(1,1),(1,0),(1,1)])

对于回归,请执行与对 X_train 和 Y1_train 对相同的操作。


分类部分的示例代码


from sklearn.neural_network import MLPClassifier

clf = MLPClassifier()

clf.fit(X_train, Y2_train)


查看完整回答
反对 回复 2023-06-13
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

训练数据的全部意义在于监督模型,教它预测具有一组特征的输出。因此,将 nan 值作为训练 X, y 的一部分是没有意义的。模型不会在“填补空白”的同时继续学习。吨

标准方法是使用缺失值技术,例如 - 按均值/0 估算,使用 KNN 通过检测包含缺失数据的样本的最近邻居来替换值,顺序数据的估算技术(线性、akima、二次、样条等)或可以处理丢失数据的编码方法。

如果您不想使用缺失值处理策略,则不应将该行保留为训练数据集的一部分。

是否有可能用 scikit-learn 或一般的机器学习来解决这样的问题?

是的,正如我提到的,有一个完整的研究领域来解决这个问题(KNN 是处理这个问题的最流行和最容易获得的机器学习方法)。本文可能有助于指导您更多


编辑(基于 OP 编辑)

将 99999999 值替换为 Nan 是正确的方法,因为我们不知道为什么业务部门将它们设置为该值。很可能是丢失了数据,他们将这些数据归为垃圾值,以便能够将数据存储在数据库中而不会出现太多问题。其次,将它们视为 Nan 值而不是异常值会更明智。因此,出于监督培训的目的,我建议删除具有这些值的行。

另一件事是我注意到这些值是 Y train 和 Y test 的一部分。如果 Nans 仅在 Y 数据中,这会使事情变得更容易,因为您可以简单地将这些行保留为数据的一部分以进行预测。在非 nan 数据上训练模型,并使用该模型预测行的 Y 值以替换 Nan 值。

但是,如果您认为这些是极值并且应该被视为异常值,您仍然必须将它们从模型训练中删除,因为它们会疯狂地偏向模型结果。

最后,如果这是一个分类练习(不是回归),那么您实际上可以将 999999 视为一个单独的类,并像其他任何类一样对其进行预测。这不适用于回归,因为在回归中 999999 是将要进行预测的连续尺度的一部分。


查看完整回答
反对 回复 2023-06-13
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

即使您的模型可以在输出时生成 NaN,也无法判断这是错误还是实际估计。我不会在训练集中使用 NaN。

不仅因为 NaN 不能用任何数值数据类型表示,而且因为不可能对 NaN 执行算术运算:这意味着您无法计算它的梯度,无法计算与其相交的直线或斜率. 简而言之,您的模型无法将其学习为数值,因为它不是数字。


查看完整回答
反对 回复 2023-06-13
  • 3 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信