在带有缺失值的 Spark 中使用 MLLib
Use MLLib in Spark with Missing Values
我有一个大约 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 可以用于各种机器学习问题,例如决策树、朴素贝叶斯等?
解决方案最终将我想要的 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'
(a string)。我还需要找到关键字None
.
我有一个大约 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 可以用于各种机器学习问题,例如决策树、朴素贝叶斯等?
解决方案最终将我想要的 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'
(a string)。我还需要找到关键字None
.