加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – RDD到LabeledPoint的转换

发布时间:2020-12-16 09:24:17 所属栏目:安全 来源:网络整理
导读:如果我有一个大约500列和2亿行的RDD,RDD.columns.indexOf(“target”,0)显示Int = 77,告诉我我的目标因变量是在第77列.但我没有关于如何选择所需(部分)列作为特征的足够知识(假设我想要从23到59,111到357,399到489的列).我想知道我是否可以申请: val data =
如果我有一个大约500列和2亿行的RDD,RDD.columns.indexOf(“target”,0)显示Int = 77,告诉我我的目标因变量是在第77列.但我没有关于如何选择所需(部分)列作为特征的足够知识(假设我想要从23到59,111到357,399到489的列).我想知道我是否可以申请:

val data = rdd.map(col => new LabeledPoint(
    col(77).toDouble,Vectors.dense(??.map(x => x.toDouble).toArray))

任何建议或指导将不胜感激.

也许我搞砸了RDD与DataFRrame,我可以用.toDF()将rdd转换为DataFrame,或者使用DataFrame比RDD更容易实现目标.

解决方法

我假设您的数据看起来或多或少像这样:

import scala.util.Random.{setSeed,nextDouble}
setSeed(1)

case class Record(
    foo: Double,target: Double,x1: Double,x2: Double,x3: Double)

val rows = sc.parallelize(
    (1 to 10).map(_ => Record(
        nextDouble,nextDouble,nextDouble
   ))
)
val df = sqlContext.createDataFrame(rows)
df.registerTempTable("df")

sqlContext.sql("""
  SELECT ROUND(foo,2) foo,ROUND(target,2) target,ROUND(x1,2) x1,ROUND(x2,2) x2,2) x3 
  FROM df""").show

所以我们有如下数据:

+----+------+----+----+----+
| foo|target|  x1|  x2|  x3|
+----+------+----+----+----+
|0.73|  0.41|0.21|0.33|0.33|
|0.01|  0.96|0.94|0.95|0.95|
| 0.4|  0.35|0.29|0.51|0.51|
|0.77|  0.66|0.16|0.38|0.38|
|0.69|  0.81|0.01|0.52|0.52|
|0.14|  0.48|0.54|0.58|0.58|
|0.62|  0.18|0.01|0.16|0.16|
|0.54|  0.97|0.25|0.39|0.39|
|0.43|  0.23|0.89|0.04|0.04|
|0.66|  0.12|0.65|0.98|0.98|
+----+------+----+----+----+

我们想忽略foo和x2并提取LabeledPoint(target,Array(x1,x3)):

// Map feature names to indices
val featInd = List("x1","x3").map(df.columns.indexOf(_))

// Or if you want to exclude columns
val ignored = List("foo","target","x2")
val featInd = df.columns.diff(ignored).map(df.columns.indexOf(_))

// Get index of target
val targetInd = df.columns.indexOf("target") 

df.rdd.map(r => LabeledPoint(
   r.getDouble(targetInd),// Get target value
   // Map feature indices to values
   Vectors.dense(featInd.map(r.getDouble(_)).toArray) 
))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读