将 Spark 特征向量转换为数组

2024-03-08

我有一个特征列,它使用 Spark 的 VectorAssembler 打包成向量向量,如下所示。data是输入 DataFrame(类型为spark.sql.DataFrame).

val featureCols = Array("feature_1","feature_2","feature_3")
val featureAssembler = new VectorAssembler().setInputCols(featureCols).setOutputCol("features")
val dataWithFeatures = featureAssembler.transform(data)

我正在使用以下方法开发自定义分类器Classifier and ClassificationModel开发者API。ClassificationModel需要开发一个predictRaw()从模型输出预测标签向量的函数。

def predictRaw(features: FeaturesType) : Vector

该函数由API设置并带有一个参数,其特点是FeaturesType并输出一个向量(在我的例子中,我将其视为 SparkDenseVector as DenseVector延长了Vector特征)。

由于VectorAssembler的封装,features列的类型Vector每个元素本身就是每个训练样本的原始特征的向量。例如:

特征列 - Vector 类型
[1.0, 2.0, 3.0] - element1,本身是一个向量
[3.5, 4.5, 5.5] - element2,本身是一个向量

我需要将这些特征提取到Array[Double]为了实施我的predictRaw()逻辑。理想情况下,我希望得到以下结果以保留基数:

`val result: Array[Double] = Array(1.0, 3.5, 2.0, 4.5, 3.0, 4.5)` 

即按列优先顺序,因为我会将其转换为矩阵。

我试过了:

val array = features.toArray // this gives an array of vectors and doesn't work

我还尝试将功能输入为 DataFrame 对象而不是 Vector,但由于 VectorAssembler 中的功能打包,API 需要 Vector。例如,此函数本身可以工作,但不符合 API,因为它期望 FeaturesType 为 Vector,而不是 DataFrame:

def predictRaw(features: DataFrame) :DenseVector = {
  val featuresArray: Array[Double] = features.rdd.map(r => r.getAs[Vector](0).toArray).collect 
//rest of logic would go here
}

我的问题是features属于类型Vector, not DataFrame。另一种选择可能是打包features as a DataFrame但我不知道如何在不使用的情况下做到这一点VectorAssembler.

感谢所有建议,谢谢!我看过Spark DataFrame 中向量的访问元素(逻辑回归概率向量) https://stackoverflow.com/questions/44425159/access-element-of-a-vector-in-a-spark-dataframe-logistic-regression-probability但这是用Python编写的,我使用的是Scala。


如果您只想将 DenseVector 转换为 Array[Double],则使用 UDF 相当简单:

import org.apache.spark.ml.linalg.DenseVector
val toArr: Any => Array[Double] = _.asInstanceOf[DenseVector].toArray
val toArrUdf = udf(toArr)
val dataWithFeaturesArr = dataWithFeatures.withColumn("features_arr",toArrUdf('features))

这将为您提供一个新列:

|-- features_arr: array (nullable = true)
|    |-- element: double (containsNull = false)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Spark 特征向量转换为数组 的相关文章

随机推荐

  • wamp 2.2 中调用未定义函数curl_init() 错误

    当我尝试实施 google 和 facebook 身份验证时出现以下错误在 Windows 7 中使用 wamp 服务器 致命错误 调用未定义的函数curl init E wamp www mysite protected extensio
  • cabal 沙盒安装仍然失败,并显示“软件包可能会因重新安装而损坏”

    我正在尝试建立榆树平台 http elm lang org 使用阴谋集团沙箱 但是安装失败 并显示消息 软件包可能会因重新安装而损坏 在我看来 这似乎与沙盒的整个目的相矛盾 我曾相信沙盒应该避免这种错误 任何人都可以为我解释这个错误 甚至更
  • Scala 中的“上下文绑定”是什么?

    Scala 2 8 的新功能之一是上下文边界 什么是上下文绑定以及它在哪里有用 当然 我首先搜索了 并发现例如this https stackoverflow com questions 2961986 how do you write a
  • 以编程方式更改 iPhone 中的设备方向

    我有基于导航的应用程序 当我单击根视图中的任何行时 下一个视图应该处于横向模式 我无法找到适当的方法来实现这一点 我尝试的是 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOr
  • 按绝对值排序而不改变数据

    我正在寻找一种简单的方法来按特定列的绝对值对 pandas 数据框进行排序 但实际上不更改数据框中的值 类似的东西sorted df key abs 所以如果我有一个像这样的数据框 a b 0 1 3 1 2 5 2 3 1 3 4 2 4
  • 在 ES6 模块中通过字符串访问导出函数

    考虑以下 exports handleEvent event export function handleEvent event do something with event 这在使用 babel 转译节点模块时有效 因为它将所有内容粘贴
  • 在 XSLT 1.0 中将 EDT 转换为 GMT

    我的输入值为 2017 年 9 月 12 日星期二 15 03 22 EDT 或 2017 09 12T15 03 22 0000000 我需要类似 2017 09 12T19 03 22Z 是否可以在 XSLT 1 0 中将 EDT 日期
  • 在 Android 中隐藏键盘的最佳方法

    我想知道在 EditText 输入文本后隐藏键盘的最佳方法 1 setonfocuschangelistener 是否仅在按下完成按钮或焦点从一个 EditText 更改为另一个时触发此侦听器 当我使用这个方法时 我无法隐藏键盘 2 set
  • SSMS 2012 智能感知行为

    SSMS 2012 中智能感知的行为似乎已更改 因此它的行为与 Visual Studio 或 SSMS 2008 不同 以前我总是按空格键 这会插入智能感知中当前突出显示的单词 但在 SSMS 2012 中我必须按 TAB 或按向下键然后
  • 如何使用 python 传递字符串+ web url并接收响应[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 Python 和谷歌翻译
  • iOS 的 BLE 外设名称不正确

    我正在编写一个 iOS 应用程序来与 BLE 设备通信 设备可以在连接之间更改名称 不能在 BLE 连接期间 但 iOS 拒绝更改设备名称 例如 当设备名称为 SadName 时 我可以连接到该设备 我断开连接 关闭应用程序等 然后将设备的
  • 检查空值并在不存在时分配另一个值的最短方法

    我拉着varchar值来自数据库并想要设置string如果它们是 我将它们分配为 null 我目前正在这样做 if string IsNullOrEmpty planRec approved by true this approved by
  • 如何在 CSS 中组合变换?

    我有一个 CSS 动画 它使用变换来相对于其当前位置移动 CSS fish animation fishanimation 4s ease in out infinite alternate keyframes fishanimation
  • Android espresso - 如何检查 Listview 底部 TextView 的值?

    在上面的附图中 它是一个带有TextView 交付报告 的ListView Its status can be Sent or Sending or Failed 我想检查 已发送 条件 这意味着断言消息已成功发送 由于这是一个对话 新消息
  • CSS 声明 - 元素类型和 ID 还是只是 ID?

    我应该如何使用 CSS 声明 这边走 div main content width 900px border 1px solid CCC margin 20px 0 20px 0 padding 40px overflow hidden 或
  • 我可以用算术运算的方式编写关系运算符吗?

    所以我有一个相当复杂的函数 template
  • 从 csv 导入时如何获取记录为 NULL 的缺失值

    我有多个大型 csv 文件 每个文件在许多地方都有缺失值 当我将 csv 文件导入 SQLite 时 我希望将缺失值记录为 NULL 因为另一个应用程序希望缺失数据由 NULL 指示 我当前的方法无法产生预期的结果 CSV 文件 test
  • 是否可以从另一个类库中的静态类获取ConnectionString?

    我已在 appsettings json 文件中添加了连接字符串 我需要访问后台操作所需的连接字符串 但为了使用连接字符串 我必须通过同一解决方案中不同项目的静态类进行访问 我无法使用ConfigurationManager Connect
  • 当 TFS 团队查询结果发生更改时发出警报

    是否可以创建一个 TFS 警报 在某个查询的结果发生更改时通知用户 Example 我有一个查询 结果找到 10 个工作项 这些工作项之一已更改 它不再满足此查询 查询结果应为 9 我想要一条通知 告诉我查询结果已更改 也指已更改的工作项
  • 将 Spark 特征向量转换为数组

    我有一个特征列 它使用 Spark 的 VectorAssembler 打包成向量向量 如下所示 data是输入 DataFrame 类型为spark sql DataFrame val featureCols Array feature