我想了解一些关于在将数据输入机器学习算法之前如何进行预处理的一般建议。我正在努力进一步理解我们在预处理时为什么会做出不同的决定,如果有人能详细解释在清理数据、去除多余数据等时我们需要考虑的所有不同事情,我会觉得非常有帮助,因为我在网上搜索了很多关于此类问题的一些标准答案或经验法则,但似乎并没有找到什么。
我有一组数据在一个.tsv文件中,可以在这里找到。训练集有7,000行,测试集有3,000行。如果每组中有100行、500行或1,000行数据无法读取,我应该使用哪些不同的策略来处理这些格式错误的数据?任何帮助我思考的指导原则将非常受欢迎。
看到示例代码会很好,但如果您不愿意提供也没关系,我只是想了解我应该做些什么!:)
谢谢
回答:
需要根据实际数据来决定很多事情。这不像简单地列出一些你每次获取数据时必须做的步骤那么简单。
然而,我可以尝试列出一些通常很有帮助的事情。但首先也是最重要的事情是彻底分析数据,并尽你所能“理解它们”。理解数据以及数据爬取和收集的所有背景是必不可少的一部分。如果你理解为什么会出现缺失数据或噪声,那么你就可能知道如何处理这些问题。
尽管如此,我还是会给你一些提示:
- 归一化值 – 并不是总需要对所有特征进行归一化。但一般来说,归一化不会有害,而且可能大有帮助。因此,如果你没有限制,不妨尝试一下,对除了显然不适合归一化的特征之外的所有特征进行归一化。最常用的归一化方法有:线性归一化(将特征值映射到<0,1>范围)和z-归一化,即你从特征值中减去均值,然后将结果除以标准差。无法一般性地说哪种方法更好。(我们又回到了理解数据的问题上)
- 缺失值 – 必须决定如何处理缺失值。有几种处理方法。删除含有缺失值的样本。如果你有足够的数据样本,可能不需要在意那些含有缺失值的样本。这可能只会给你的结果带来噪声。如果样本中只有一个特征值缺失,你可以用该特征的均值来填充该值。(但要小心,因为这样做也可能给结果带来噪声)
- 异常值 – 在许多情况下,你会遇到与其他样本相距甚远的样本,即异常值。异常值通常只是噪声、数据错误,或者可能是特殊行为的信号(例如,当有违反常规行为模式的事情发生时,这可能是攻击者行为的信号或其他情况 – 例如银行网络)。在大多数情况下,最好是删除异常值,因为异常值的数量通常非常少,但可能对你的结果产生很大影响。以直方图为例 – 我会直接切掉0-2.5百分位和97.5-100百分位。
- 错误 – 数据中很可能存在错误。这是我无法给你任何提示的部分,因为必须真正理解所有背景,并知道可能导致错误的原因是什么。
- 名义值 – 如果有可以排序的名义值,那么只需将名义值替换为数字(0, 1, 2, 3, 4, 和5)。如果无法对值进行排序(例如颜色=蓝色、黑色、绿色…),那么最好的方法是将特征分解为与可能值集的基数一样多的特征。并将特征转换为二进制值 – “是绿色吗?”“是/否”(0/1)。
总结来说,很难给出一个普遍的答案。避免“使事情变得更糟”的好方法是从删除所有“坏值”开始。只要删除所有含有缺失或错误值的行。按照之前提到的方法转换所有其他值,并尝试获得你的第一个结果。然后你将更好地理解所有数据,并会有更好的想法去寻找任何改进的方向。
如果你有关于特定“预处理问题”的进一步问题,我很乐意编辑这个回答,并添加更多关于如何处理这些问题的想法。