【问题标题】:Spark MLlib packages NaN weightSpark MLlib 封装 NaN 权重
【发布时间】:2015-06-23 07:25:32
【问题描述】:

我正在尝试使用测试机器学习数据集在 pyspark 中运行 Spark MLlib 包。我将数据集分成一半的训练数据集和一半的测试数据集。下面是我构建模型的代码。但是,它显示了所有因变量的 NaN、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,是的,它是一个包含 9 个预测变量的标准数据集。是因为 SGD 对特征缩放非常敏感吗?我有一些较大的变量和一些较小的变量(例如,一个因变量是平均总收入为 1mill,另一个是平均客户数量为 5),所以我需要对它们进行缩放每个?
  • 啊,给你!那应该行得通。我刚刚在我的答案中发布了。

标签: apache-spark machine-learning pyspark apache-spark-mllib


【解决方案1】:

尝试缩放特征

StandardScaler 通过缩放到单位方差和/或使用训练集中样本的列汇总统计数据去除均值来标准化特征。这是一个非常常见的预处理步骤。

标准化可以提高优化过程中的收敛速度,也可以防止方差很大的特征对模型训练产生过大的影响。由于您有一些较大的变量(例如:收入)和一些较小的变量(例如:客户数量),这应该可以解决您的问题。

【讨论】:

  • 嗨,Rishi,感谢您的回答。我尝试使用 StandardScaler 来缩放每个变量。但是,当我将预测误差 (RMSE) 与其他 ML 包(如 sklearn)进行比较时,我得到的误差明显更高。请注意我是否对 StandardScaler 做错了什么。我已将缩放代码附加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 2016-01-05
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2015-02-23
  • 2017-12-20
相关资源
最近更新 更多