首页 > 解决方案 > 微笑scala api:从数组创建数据框

问题描述

我正在尝试将微笑集成到我的 scala 代码库中。特别是,我想训练一个随机森林分类器。在FAQ中是这样写的:

大多数 Smile 算法都将简单的 double[] 作为输入。因此,只要样本在双数组中,您就可以使用您喜欢的方法或库来导入数据。

但 RandomForest 似乎并非如此,所有拟合方法似乎都以公式和数据框作为输入。就我而言,我有两个 Array[Array[Double]] 包含两个不同类的示例:例如,第一个应标记为 0,第二个应标记为 1。第一个数组具有形状 (n_samples_0, n_features) 和第二个 (n_samples_1, n_features)

据我所知,在此数据上训练微笑 randomForest 的唯一方法是首先将这两个数组转换为一个微笑数据帧,其中包含 n_features + 1 列(每个特征一个 + 标签一个)和 n_samples_0 + n_samples_1 行. 接着:

val formula: Formula = "class" ~
val rf = randomForest(formula, df)

因此我的问题是:有没有办法从 Scala API 中的数组创建数据框?我只能通过读取不同的文件格式来找到创建 Dataframe 的方法。

标签: scalasmile

解决方案


我设法通过使用Smile DataFrames的方法解决了我的问题。

这是一个最小的示例:(X1 和 X0 是包含特征的双精度数组的数组,每个子数组的大小为 600,X1 包含正类示例的特征,X0 包含负类示例的特征)

val X1: List[Array[Double]] = ???
val X0: List[Array[Double]] = ???
val y1 = X1.map(_ => Array(1))
val y0 = X0.map(_ => Array(0))
val X = (X1 ++ X0).toArray
val y = (y1 ++ y0).toArray
val dfX = DataFrame.of(X)
val dfy = DataFrame.of(y, "class")
val df = dfX.merge(dfy)
val formula: Formula = "class" ~
val rf = randomForest(formula, df)

推荐阅读