Spark MLlib 包中的 NaN 权重

3

我正在尝试使用测试机器学习数据集在pyspark中运行Spark MLlib包。我将数据集分成了一半的训练数据集和一半的测试数据集。以下是构建模型的代码。然而,它显示所有依赖变量的NaN权重。无法找出原因。但是当我尝试使用StandardScaler函数标准化数据时,它可以正常工作。

model = LinearRegressionWithSGD.train(train_data, step = 0.01)  
# evaluate model on test data set
valuesAndPreds = test_data.map(lambda p: (p.label, model.predict(p.features)))

非常感谢您的帮助。
以下是我用于缩放的代码。
scaler = StandardScaler(withMean = True, withStd = True).fit(data.map(lambda x:x.features))
feature = [scaler.transform(x) for x in data.map(lambda x:x.features).collect()]
label = data.map(lambda x:x.label).collect()
scaledData = [LabeledPoint(l, f) for l,f in zip(label, feature)]

这是一个标准数据集吗? - Rishi Dua
嗨Rishi,是的,这是一个有9个预测变量的标准数据集。这是因为SGD对特征缩放非常敏感吗?我有一些变量是大数值,还有一些变量是小数值(例如,一个依赖变量是1百万的总收入平均值,另一个是5个客户的平均数量),所以我需要对它们进行缩放吗? - help_needed
啊,就是这样!应该可以了。我刚在我的答案中发布了那个。 - Rishi Dua
1个回答

0

尝试对特征进行缩放

StandardScaler通过使用训练集中样本的列汇总统计信息,将特征标准化为单位方差和/或去除均值。这是非常常见的预处理步骤。

标准化可以提高优化过程的收敛速度,并防止具有非常大方差的特征在模型训练期间产生过大的影响。由于您有一些变量是大数(例如:收入),而另一些变量是较小的数(例如:客户数量),因此这应该可以解决您的问题。


嗨Rishi,感谢你的回答。我已经尝试使用StandardScaler来缩放每个变量。然而,当我将预测误差(RMSE)与其他ML包(如sklearn)进行比较时,我得到了显著更高的误差。不确定我是否在使用StandardScaler时做错了什么。我已经将缩放代码附在我的回答中。 - help_needed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接