在 Python 中从 Spark DataFrame 创建 labeledPoints
Create labeledPoints from Spark DataFrame in Python
我使用 python 中的什么 .map()
函数从 spark 数据帧创建一组 labeledPoints
?如果 The label/outcome 不是第一列但我可以参考它的列名 'status'?
是什么表示法
我用这个 .map() 函数创建了 Python 数据框:
def parsePoint(line):
listmp = list(line.split('\t'))
dataframe = pd.DataFrame(pd.get_dummies(listmp[1:]).sum()).transpose()
dataframe.insert(0, 'status', dataframe['accepted'])
if 'NULL' in dataframe.columns:
dataframe = dataframe.drop('NULL', axis=1)
if '' in dataframe.columns:
dataframe = dataframe.drop('', axis=1)
if 'rejected' in dataframe.columns:
dataframe = dataframe.drop('rejected', axis=1)
if 'accepted' in dataframe.columns:
dataframe = dataframe.drop('accepted', axis=1)
return dataframe
在 reduce 函数重新组合所有 Pandas 数据帧后,我将其转换为 Spark 数据帧。
parsedData=sqlContext.createDataFrame(parsedData)
但是现在如何在 Python 中从中创建 labledPoints
?我假设它可能是另一个 .map()
函数?
如果您已经有了数值特征并且不需要额外的转换,您可以使用 VectorAssembler
来组合包含自变量的列:
from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(
inputCols=["your", "independent", "variables"],
outputCol="features")
transformed = assembler.transform(parsedData)
接下来就可以简单的贴图了:
from pyspark.mllib.regression import LabeledPoint
from pyspark.sql.functions import col
(transformed.select(col("outcome_column").alias("label"), col("features"))
.rdd
.map(lambda row: LabeledPoint(row.label, row.features)))
从 Spark 2.0 开始,ml
和 mllib
API 不再兼容,后者将被弃用和删除。如果您仍然需要它,则必须将 ml.Vectors
转换为 mllib.Vectors
。
from pyspark.mllib import linalg as mllib_linalg
from pyspark.ml import linalg as ml_linalg
def as_old(v):
if isinstance(v, ml_linalg.SparseVector):
return mllib_linalg.SparseVector(v.size, v.indices, v.values)
if isinstance(v, ml_linalg.DenseVector):
return mllib_linalg.DenseVector(v.values)
raise ValueError("Unsupported type {0}".format(type(v)))
和地图:
lambda row: LabeledPoint(row.label, as_old(row.features)))
我使用 python 中的什么 .map()
函数从 spark 数据帧创建一组 labeledPoints
?如果 The label/outcome 不是第一列但我可以参考它的列名 'status'?
我用这个 .map() 函数创建了 Python 数据框:
def parsePoint(line):
listmp = list(line.split('\t'))
dataframe = pd.DataFrame(pd.get_dummies(listmp[1:]).sum()).transpose()
dataframe.insert(0, 'status', dataframe['accepted'])
if 'NULL' in dataframe.columns:
dataframe = dataframe.drop('NULL', axis=1)
if '' in dataframe.columns:
dataframe = dataframe.drop('', axis=1)
if 'rejected' in dataframe.columns:
dataframe = dataframe.drop('rejected', axis=1)
if 'accepted' in dataframe.columns:
dataframe = dataframe.drop('accepted', axis=1)
return dataframe
在 reduce 函数重新组合所有 Pandas 数据帧后,我将其转换为 Spark 数据帧。
parsedData=sqlContext.createDataFrame(parsedData)
但是现在如何在 Python 中从中创建 labledPoints
?我假设它可能是另一个 .map()
函数?
如果您已经有了数值特征并且不需要额外的转换,您可以使用 VectorAssembler
来组合包含自变量的列:
from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(
inputCols=["your", "independent", "variables"],
outputCol="features")
transformed = assembler.transform(parsedData)
接下来就可以简单的贴图了:
from pyspark.mllib.regression import LabeledPoint
from pyspark.sql.functions import col
(transformed.select(col("outcome_column").alias("label"), col("features"))
.rdd
.map(lambda row: LabeledPoint(row.label, row.features)))
从 Spark 2.0 开始,ml
和 mllib
API 不再兼容,后者将被弃用和删除。如果您仍然需要它,则必须将 ml.Vectors
转换为 mllib.Vectors
。
from pyspark.mllib import linalg as mllib_linalg
from pyspark.ml import linalg as ml_linalg
def as_old(v):
if isinstance(v, ml_linalg.SparseVector):
return mllib_linalg.SparseVector(v.size, v.indices, v.values)
if isinstance(v, ml_linalg.DenseVector):
return mllib_linalg.DenseVector(v.values)
raise ValueError("Unsupported type {0}".format(type(v)))
和地图:
lambda row: LabeledPoint(row.label, as_old(row.features)))