有什么想法在数据集中有效处理异常值而不删除它

问题描述 投票:-2回答:1

我是数据科学的初学者。在参加黑客马拉松时面对挑战。我有一个火车数据集,在许多列中有很多异常值。与测试数据相同(列车和测试数据单独提供)。由于测试装置也具有相似的特性,因此我无法在列车组中立即移除异常值。如果我在测试中删除,那么我的测试数据行数会减少,这会在提交时抛出错误。任何人都可以指导我有效地处理异常值。扩展和日志转换也没有多大帮助。

machine-learning data-science outliers
1个回答
1
投票

好。如何检测和处理异常值是我感兴趣的话题之一。

我想回答一下。可以从两个观点回答。

  1. 在机器学习竞赛中,您必须在训练和预测之前预处理数据(训练和测试)。通常,您应该构建一个包含Stage1 .preprocess(清理,转换,添加/删除功能,规范化/标准化)Stage2。管道Stage3 .Cross Validation Stage4的管道。堆叠Stage5。预测。在大多数竞争情况下必须重复上述过程以达到良好的分数。你可以在Kaggle找到许多技巧。
  2. 异常值。如果没有适当的检测和处理异常值,您的模型得分将特别适用于回归类型的竞争。异常值显着影响数据。这是我处理异常值的方法。对于单变量,(你可以逐个模式检查功能中的离群值),检测:如果数据 - data.mean()/ data.std()> 3,你应该有信心它是异常值。 handle:根据对数据的洞察理解,用mode()或mean()或median()替换它。如果你知道单变量与另一个变量有线性关系,你可以应用聚合均值,模式,中位数。 对于多变量(所有功能一起工作以找到某些特征异常值)。我正在探索这条路。关键的挑战是火车/测试数据必须分开。否则数据泄露会很好。可能的模式是:如果你有列车中的X1,X2,X3,Y,测试中的X1,X2,X3。要检测X(i)异常值,可以使用X(i)作为new_y,其余X(j)s具有new_x。并使用如下的statemodels.api函数: 将statsmodels.api导入为sm X_od = data [X1] #assuming我们想找到Data [X1]异常值Y_od = data [[X2,X3]] lm = sm.OLS(X_od,Y_od).fit()#it是OLS行回归 print(lm)outliers_test = lm.outlier_test()#它使用残差来检测异常值print(outlier_test.query('“unadj_p”<0.05))#如果unad p值小于5%,我们知道有异常值。

Check The R-Square通常R-Square可能高于50%,太低,有异常或有问题。在一些极端情况下,R2小于0.5%。

Bonferroni outlier test result

handle:way1。添加名为OD_flag_X1的新列,并将检测到的异常值设置为1. other keep 0. way2。将检测到的异常值替换为way1和way2的其他聚合值(均值,模式,中位数或其他)。正如我先前所说。您已在管道中添加异常值检测/句柄,以避免数据泄漏或步骤丢失。

这是我检测和处理异常值的方法。

希望它可以帮助您或其他读者。

© www.soinside.com 2019 - 2024. All rights reserved.