首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有可能通过机器学习来学习和预测南价值?

是否有可能通过机器学习来学习和预测南价值?
EN

Stack Overflow用户
提问于 2020-08-23 13:56:12
回答 3查看 871关注 0票数 0

我试图解决一个有两个输出值的回归问题。输出值作为传入预订值的两个不同阈值,用于接受或拒绝预订。

这两个输出值在业务案例中是手动设置的,但这将在机器学习的帮助下自动完成。在业务案例中,输出值之一可以是Nan,那么所有的预订都将被接受。因此,如果一个输出值没有被填充,那么它对业务案例是有效的。

示例:

代码语言:javascript
运行
复制
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就会抛出一个错误。

代码语言:javascript
运行
复制
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

我不想用平均值或0来计算这些值,因为如上所述,缺少的值是业务用例的有效设置。

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

编辑:未由业务设置的输出值不是直接存储为NaN,而是作为无穷大的as -9999999999存储。我用NaN代替了这些值,因为我认为这么高的值会扭曲结果。因此,如果我不替换任何内容,这些变量实际上会产生以下结果:

代码语言:javascript
运行
复制
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相比,保留这些值更好吗?或者,这些值会显示结果并必须省略吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-23 15:58:11

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

代码语言:javascript
运行
复制
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一样。

分类零件的样例代码

代码语言:javascript
运行
复制
from sklearn.neural_network import MLPClassifier
clf = MLPClassifier()
clf.fit(X_train, Y2_train)
票数 1
EN

Stack Overflow用户

发布于 2020-08-23 14:09:27

训练数据的全部目的是对模型进行监督,教它用一组特征来预测输出。因此,将nan价值观作为训练X,y的一部分是没有意义的。一个模型不会“填补空白”而仍然学习。T

标准的方法是使用缺失值技术,如均值/0归算技术,用KNN代替包含缺失数据的样本的近邻,对序列数据(s线性、akima、二次、样条等)或能够处理缺失数据的编码方法进行估算。

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

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

是的,正如我所提到的,解决这个问题有一个研究领域(KNN是处理这个问题的最流行和最容易访问的机器学习方法)。这个文章可能会帮助你更多的指导。

编辑(基于操作系统编辑)

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

另一件事是,我注意到这些值是Y训练和Y测试的一部分。如果Nans仅在Y数据中,这将使事情变得更简单,因为这样您就可以简单地将这些行作为数据的一部分进行预测。对非Nan数据进行模型训练,并使用该模型预测行的Y值以代替Nan值。

但是,如果你认为这些是极端值,并且应该被认为是异常值,那么你仍然需要将它们从模型训练中删除,因为它们会像疯狂地偏置模型结果。

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

票数 1
EN

Stack Overflow用户

发布于 2020-08-23 14:11:38

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

这不仅是因为NaN不能用任何数字数据类型表示,而且还因为不可能在NaNs上执行算术:这意味着不能计算它的梯度,也不能计算与它相交的直线或斜率。简单地说,您的模型无法将它作为一个数值来学习,因为它不是一个数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63547785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档