【问题标题】:Use MLLib in Spark with Missing Values在 Spark 中使用缺失值的 MLLib
【发布时间】:2015-09-01 05:04:21
【问题描述】:

我有大约 70 列的 RDD。它存储为 tsv。以下是我使用 Python 阅读它的方式:

txtFiles = sc.textFile("temp/txtFiles/*") \
    .map(lambda x: x.split("\t"))

这会读入文件,然后沿选项卡拆分为 70 列。理想情况下,我的代码的下一部分应该是这样的:

asDouble = txtFiles.map(lambda y: MISSING VALUE if len(x) == 0 \
    else float(x) for x in y)

截至目前,我无法做到这一点。如果我想创建一个保留缺失值的 RDD,它必须是“Any”类型的数组,并且它将 NA 保存为字符串,将数值保存为双精度值。

这是我的问题的症结所在:我想将每一行转换为 LabeledPoint 对象,如下所示:

lblPt = asDouble.map(lambda x: LabeledPoint(x[70], x[0:69]))

但是,由于我在 asDouble 中的数据实际上是“Any”类型,因此我无法将其转换为一组 LabeledPoints。 LabeledPoint 对象只需要双精度。

有没有办法对 RDD 中的缺失值进行编码,以便 RDD 可用于各种机器学习问题,例如决策树、朴素贝叶斯等?

【问题讨论】:

    标签: python null apache-spark rdd


    【解决方案1】:

    解决方案最终将我想要的missing value 编码为None。然而,len 并没有像我希望的那样工作。相反,我意识到我的数据缺少编码为'NaN' 的值。 所以我的解决方案是这样的:

    txtFiles = sc.textFile("temp/txtFiles/*") \
        .map(lambda x: x.split("\t"))
    asDouble = txtFiles.map(lambda y: None if x == 'Nan' \
        else float(x) for x in y)
    lblPt = asDouble.map(lambda x: LabeledPoint(x[70], x[0:69]))
    

    我对缺失值如何存储在我的原始数据集中有一个根本的误解(我认为它们是空字符串,而实际上它们存储为'NaN'(一个字符串)。我还需要找到关键字None

    【讨论】:

    • 在此修复后您是否能够运行 ML 算法?如果是这种情况,哪些算法会在缺失值的情况下运行(它们必须在内部使用代理拆分)。我不知道处理缺失值的 Spark 算法,也许它们最近更新了。
    • @Earnest_learner,有很多算法可以处理缺失值!朴素贝叶斯、决策树和随机森林都可以在缺少数据的情况下执行分类问题。
    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 2017-10-18
    • 2015-09-12
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2018-09-17
    • 2017-06-27
    相关资源
    最近更新 更多