【发布时间】:2019-10-30 18:19:14
【问题描述】:
我正在训练 Spark MLlib 线性回归器,但我相信我不了解部分库的实际使用情况。
我有 1 个功能 (NameItem) 和一个输出 (Accumulator)。
第一个是分类的(速度、温度等),第二个是双精度类型的数字。
训练集由数百万个条目组成,它们不是线性相关的(我检查了热图和相关指数)。
问题:我想通过线性回归估计给定NameItem 值的Accumulator 值,但我认为这不是我实际在做的。
问题:我该怎么做?
我首先将数据集分为training set和data set:
(trainDF, testDF) = df.randomSplit((0.80, 0.20), seed=42)
之后我尝试了一种管道方法,正如大多数教程所示:
1) 我索引了 NameItem
indexer = StringIndexer(inputCol="NameItem", outputCol="CategorizedItem", handleInvalid = "keep")
2) 然后我对其进行编码
encoderInput = [indexer.getOutputCol()]
encoderOutput = ["EncodedItem"]
encoder = OneHotEncoderEstimator(inputCols=encoderInput, outputCols=encoderOutput)
3) 也组装好了
assemblerInput = encoderOutput
assembler = VectorAssembler(inputCols=assemblerInput, outputCol="features")
之后我继续进行有效的培训:
lr = LinearRegression(labelCol="Accumulator")
pipeline = Pipeline(stages=[indexer, encoder, assembler, lr])
lrModel = pipeline.fit(trainDF)
这就是我在测试集上应用预测时得到的结果:
predictions = lrModel.transform(testDF).show(5, False)
+--------------+-----------------+---------------+-----------------+-------------------------------+------------------+
|NameItem |Accumulator |CategorizedItem|EncodedItem |features |prediction |
+--------------+-----------------+---------------+-----------------+-------------------------------+------------------+
|Speed |44000.00000000 |265.0 |(688,[265],[1.0])|(689,[265,688],[1.0,44000.0]) |44000.100892495786|
|Speed |245000.00000000 |265.0 |(688,[265],[1.0])|(689,[265,688],[1.0,245000.0]) |245000.09963708033|
|Temp |4473860.00000000 |66.0 |(688,[66],[1.0]) |(689,[66,688],[1.0,4473860.0]) |4473859.874261986 |
|Temp |6065.00000000 |66.0 |(688,[66],[1.0]) |(689,[66,688],[1.0,6065.0]) |6065.097757082314 |
|Temp |10140.00000000 |66.0 |(688,[66],[1.0]) |(689,[66,688],[1.0,10140.0]) |10140.097731630483|
+--------------+-----------------+---------------+-----------------+-------------------------------+------------------+
only showing top 5 rows
对于相同的分类特征(例如Temp),我怎么可能得到 3 个不同的预测?
虽然非常接近预期值,但我觉得有问题。
【问题讨论】:
-
NameItem真的有688个分类吗? -
@desertnaut 在训练集中,是的
-
好像
VectorAssembler有bug;现在没有时间深入调查,所以请尝试下面的答案,留下反馈,我可能会在明天下午回来深入挖掘(你的 Spark 版本是什么?)
标签: machine-learning pyspark regression apache-spark-mllib apache-spark-ml