使用spark的MLLib例程和pandas数据帧

时间:2015-05-06 00:52:18

标签: python apache-spark pyspark apache-spark-mllib

我有一个非常大的数据集(~20GB)存储在磁盘上作为Pandas / PyTables HDFStore,我想运行随机森林并在其上提升树木。试图在我的本地系统上执行它需要永远,所以我想把它耕种到我可以访问的火花簇,而是使用MLLib例程。

虽然我已经设法将pandas数据帧加载为spark数据帧,但我对如何在MLLib例程中使用它感到有些困惑。我对MLLib不太熟悉,似乎它只接受LabeledPoint数据类型。

我很感激任何想法/指针/代码解释如何使用(pandas或spark)数据帧作为MLLib算法的输入 - 直接或间接地转换为支持的类型。

感谢。

2 个答案:

答案 0 :(得分:1)

您需要将DataFrame转换为RDD[LabeledPoint]。请注意,LabeledPoint只是(label: Double, features: Vector)。考虑一个映射例程来抓取每一行的值:

val rdd = df.map { row =>
  new LabeledPoint(row(0), DenseVector(row.getDouble(1),..., row.getDouble(n)))
}

这将返回RDD[LabeledPoint],例如,您可以将其输入RandomForest.trainRegressor(...)。有关详细信息,请查看DataFrame API

答案 1 :(得分:-1)

y_train,X_train 在 pandas 数据帧中,将其转换为 mllib 输入数据格式

  1. 转换成numpy数组
y_train=np.array(y_train)
X_train=np.array(X_train)
  1. 转换为 rdd 数据格式
from pyspark.mllib.regression import LabeledPoint
train_data=[]
for i in range(X_train.shape[0]):                                                                   
          train_data.append( LabeledPoint(y_train[i],X_train[i]))
  1. 并行化
train_data_rdd=sparkContext.parallelize(train_data)

{for spark context ->
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('pandasToSparkDF').getOrCreate()

spark = SparkSession \
    .builder \
    .getOrCreate()
sparkContext=spark.sparkContext
}

model = GradientBoostedTrees.trainRegressor(train_data_rdd,categoricalFeaturesInfo={}, numIterations=3)