我有一个非常大的数据集(~20GB)存储在磁盘上作为Pandas / PyTables HDFStore,我想运行随机森林并在其上提升树木。试图在我的本地系统上执行它需要永远,所以我想把它耕种到我可以访问的火花簇,而是使用MLLib例程。
虽然我已经设法将pandas数据帧加载为spark数据帧,但我对如何在MLLib例程中使用它感到有些困惑。我对MLLib不太熟悉,似乎它只接受LabeledPoint数据类型。
我很感激任何想法/指针/代码解释如何使用(pandas或spark)数据帧作为MLLib算法的输入 - 直接或间接地转换为支持的类型。
感谢。
答案 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 输入数据格式
y_train=np.array(y_train)
X_train=np.array(X_train)
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]))
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)