Apache spark 将spark管道转换为数据帧
Spark管道框架允许以可复制的方式为机器学习或其他应用程序创建转换管道。但是,在创建数据帧时,我希望能够执行探索性分析 在我的例子中,我有大约100列,其中80列是字符串,需要进行热编码:Apache spark 将spark管道转换为数据帧,apache-spark,pipeline,databricks,Apache Spark,Pipeline,Databricks,Spark管道框架允许以可复制的方式为机器学习或其他应用程序创建转换管道。但是,在创建数据帧时,我希望能够执行探索性分析 在我的例子中,我有大约100列,其中80列是字符串,需要进行热编码: from pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer,VectorAssembler from pyspark.ml import Pipeline from pyspark.ml.classification import
from pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer,VectorAssembler
from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.classification import LogisticRegressionModel
#cols_to_one_hot_encode_2 is a list of columns that need to be one hot encoded
#cols_to_keep_as_is are columns that are **note** one hot encoded
cols_to_one_hot_encode_3=[i+"_hot" for i in cols_to_one_hot_encode_2]
encoder= OneHotEncoderEstimator(inputCols=cols_to_one_hot_encode_2,
outputCols=cols_to_one_hot_encode_3,dropLast=False)
#assemble pipeline
vectorAssembler = VectorAssembler().setInputCols(cols_to_keep_as_is+cols_to_one_hot_encode_3).setOutputCol("features")
all_stages=indexers
all_stages.append(encoder)
all_stages.append(vectorAssembler)
transformationPipeline=Pipeline(stages=all_stages)
fittedPipeline=transformationPipeline.fit(df_3)
dataset = fittedPipeline.transform(df_3)
#now pass to logistic regression
selectedcols = ["response_variable","features"] #+df_3.columns
dataset_2= dataset.select(selectedcols)
# Create initial LogisticRegression model
lr = LogisticRegression(labelCol="response_variable", featuresCol="features", maxIter=10,elasticNetParam=1)
# Train model with Training Data
lrModel = lr.fit(dataset_2)
当我查看数据集_2显示(数据集_2)
时,它会打印:
response_variable features
0 [0,6508,[1,4,53,155,166,186,205,242,2104,6225,6498],[8220,1,1,1,1,1,1,1,1,1,1]]
0 [0,6508,[1,3,53,155,165,185,207,243,2104,6225,6498],[8220,1,1,1,1,1,1,1,1,1,1]]
0 [0,6508,[1,2,53,158,170,185,206,241,2104,6225,6498],[8222,1,1,1,1,1,1,1,1,1,1]]
0 [0,6508,[1,3,53,156,168,185,205,240,2104,6225,6498],[8222,1,1,1,1,1,1,1,1,1,1]]
0 [0,6508,[1,2,53,155,166,185,205,240,2104,6225,6498],[8223,1,1,1,1,1,1,1,1,1,1]]
这对于功能探索是完全无用的。请注意,一个热门的编码器将我的功能从~100列扩展到6508列
我的问题
我如何看待通过管道在引擎盖下创建的数据帧?
这应该是一个具有6058个特性和相应行数的数据帧,例如:
例如,我想要的是:
response_variable feature_1_hot_1 feature_1_hot_2 feature_1_hot_3 ... (6505 more columns)
0 1 1 0
etc.
不是重复的
不是复制品
这就是询问如何基于分隔符进行文本字符串拆分。管道完成的转换不是简单的字符串拆分。看
我如何看待通过管道在引擎盖下创建的数据帧
没有这样的隐藏结构。Spark ML管道
围绕VectorUDT
列和元数据构建,以丰富结构。没有中间结构可以容纳扩展的列,如果在哪里,它就无法扩展(Spark不能处理此处生成的宽而密集的数据,当列数达到数万列时,query planner就会阻塞)
这是您最好的也是唯一的选择。为什么要投否决票?可能会重复Modified以解释为什么不重复,所以没有方法创建这样的数据帧?我觉得这很难相信。