StandardScaler returns NaN
StandardScaler returns NaN
环境:
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 存在于 scaled
、SC.mean
、SC.std
我不明白为什么 StandardScaler
即使在 mean
中也可以这样做,或者如何处理这种情况。任何建议表示赞赏。
parquet 的数据大小为 1.6GiB,如果有人需要它,请告诉我
更新:
通过StandardScaler
的代码,这很可能是MultivariateOnlineSummarizer
聚合时Double
的精度问题。
有一个值等于 Double.MaxValue
,当 StandardScaler
对列求和时,结果溢出。
只需将这些列转换为 scala.math.BigDecimal
即可。
参考这里:
http://www.scala-lang.org/api/current/index.html#scala.math.BigDecimal
环境:
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 存在于 scaled
、SC.mean
、SC.std
我不明白为什么 StandardScaler
即使在 mean
中也可以这样做,或者如何处理这种情况。任何建议表示赞赏。
parquet 的数据大小为 1.6GiB,如果有人需要它,请告诉我
更新:
通过StandardScaler
的代码,这很可能是MultivariateOnlineSummarizer
聚合时Double
的精度问题。
有一个值等于 Double.MaxValue
,当 StandardScaler
对列求和时,结果溢出。
只需将这些列转换为 scala.math.BigDecimal
即可。
参考这里:
http://www.scala-lang.org/api/current/index.html#scala.math.BigDecimal