3 回答
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)
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 是将要进行预测的连续尺度的一部分。
TA贡献1784条经验 获得超2个赞
即使您的模型可以在输出时生成 NaN,也无法判断这是错误还是实际估计。我不会在训练集中使用 NaN。
不仅因为 NaN 不能用任何数值数据类型表示,而且因为不可能对 NaN 执行算术运算:这意味着您无法计算它的梯度,无法计算与其相交的直线或斜率. 简而言之,您的模型无法将其学习为数值,因为它不是数字。
添加回答
举报