使用Pyspark将pandas.Dataframe转为LabeledPoint

使用Pyspark将pandas.Dataframe转为LabeledPoint

本人刚刚开始学习pyspark,由于之前只在单机中进行过数据处理,习惯利用python中的pandas进行数据预处理,但是在pyspark中,模型训练时只支持LabeledPoint数据,所以使用pandas的Dataframe处理完数据以后需要将其转化为LabeledPoint,在此过程中查询了许多博文,看了stackflow的解决方法,在此总结一下。

标注点(LabeledPoint)

标注点LabeledPoint是一种带有标签(Label/Response)的本地向量,它可以是稠密或者是稀疏的。在MLlib中,标注点在监督学习算法中被使用。由于标签是用双精度浮点型来存储的,故标注点类型在回归(Regression)和分类(Classification)问题上均可使用。例如,对于二分类问题,则正样本的标签为1,负样本的标签为0,而对于多类别的分类问题来说,标签则应是一个以0开始的索引序列:0, 1, 2 …

spark官方文档链接

参数

  • label — 数据集的label
  • features — 数据集这一个样本的特征值 (NumPy array, list, pyspark.mllib.linalg.SparseVector, or scipy.sparse column matrix)

第一步:使用Pandas读取文件

import pandas as pd
df_data = pd.read_csv('filePath')

filePath可以为本地文件也可以为HDFS上的文件

使用pandas读取文件后,即可使用熟悉的pandas模块进行数据处理了。

第二步:将pandas的DataFrame转化为spark的DataFrame

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
sparkdf = spark.createDataFrame(df_data)

参考博文

第三步:将spark的DataFrame转为LabeledPoint

from pyspark.mllib.regression import LabeledPoint
labelpointRDD = sparkdf.rdd.map(lambda row:LabeledPoint(row[-1], row[:-1]))

说明:

  1. LabeledPoint只能一个样本一个样本的读取数据存入,不支持整个矩阵数据的读入,即其 label 只接受一个数值(在二分类问题中为0或1),feature 只接受一个列向量。
    所以这里需要使用map方法将dataframe逐行转化为LabeledPoint;
  2. Spark的DataFrame没有map方法,需要先使用.rdd将其转化为rdd;
  3. spark的DataFrame支持切片方法,这里使用的数据集中,最后一列为label,row[-1]表示label,row[:-1]表示feature。

至此,处理好的数据集就转化为了LabeledPoint,可以使用spark.mllib导入模型进行训练了。

你可能感兴趣的:(Spark)