【问题标题】:StandardScaler returns NaNStandardScaler 返回 NaN
【发布时间】:2016-02-23 09:32:19
【问题描述】:

环境:

spark-1.6.0 with scala-2.10.4

用法:

// row of df : DataFrame = (String,String,double,Vector) as (id1,id2,label,feature)
val df = sqlContext.read.parquet("data/Labeled.parquet")
val SC = new StandardScaler()
.setInputCol("feature").setOutputCol("scaled")
.setWithMean(false).setWithStd(true).fit(df) 


val scaled = SC.transform(df)
.drop("feature").withColumnRenamed("scaled","feature")

这里以代码为例http://spark.apache.org/docs/latest/ml-features.html#standardscaler

NaN 存在于scaledSC.meanSC.std

我不明白为什么 StandardScaler 即使在 mean 中也能做到这一点,也不明白如何处理这种情况。任何建议表示赞赏。

parquet 的数据大小为 1.6GiB,如果有人需要,请告诉我

更新:

打通StandardScaler的代码,这很可能是Double聚合时Double的精度问题。

【问题讨论】:

  • 此外,SC.mean 中的 NaN 列会生成非 NaN 结果以缩放。很奇怪。
  • 你能补充一些细节吗?初学者有问题的列的最小值和最大值。
  • @zero323 (min,max)is (1.5E-5,1.7976931348623157E308) 这让我想起了脏数据
  • 无论是那个还是简单的数字问题。我怀疑你可以做得更好。如果您不希望溢出,您可以尝试转换为小数并直接计算均值 / sd。

标签: apache-spark apache-spark-ml


【解决方案1】:

有一个值等于Double.MaxValue,当StandardScaler 对列求和时,结果溢出。

只需将这些列转换为 scala.math.BigDecimal 作品。

参考这里:

http://www.scala-lang.org/api/current/index.html#scala.math.BigDecimal

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 2019-04-17
    • 2017-08-12
    • 1970-01-01
    • 2018-11-26
    • 2011-04-22
    • 2016-05-20
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多