Преобразовать искровой конвейер в датафрейм - PullRequest
0 голосов
/ 14 ноября 2018

Платформа Spark Pipeline позволяет создавать конвейеры преобразований для машинного обучения или других приложений воспроизводимым способом.Однако при создании фреймов данных я хочу иметь возможность выполнить исследовательский анализ.

В моем случае у меня ~ 100 столбцов, из которых 80 - это строки, и один из них должен быть в горячем виде:

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)

Когда я смотрю на dataset_2 display(dataset_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.

Не дубликат

Не является дубликатом Как разбить Vector на столбцы - используя PySpark Здесь задается вопрос, как выполнить расщепление буквенных строк на основе разделителя.Преобразование, выполняемое конвейером, не является простым разбиением строки.См. Использование Spark ML Pipelines только для преобразований

1 Ответ

0 голосов
/ 14 ноября 2018

Как посмотреть на фрейм данных, созданный конвейером под колпаком?

Нет такой скрытой структуры. Spark ML Pipelines построен вокруг VectorUDT столбцов и метаданных, чтобы обогатить структуру. Не существует промежуточной структуры, которая содержит расширенные столбцы, и если там где, она не будет масштабироваться (Spark не обрабатывает широкие и плотные данные, которые будут сгенерированы здесь, и планировщик запросов задыхается, когда число столбцов достигает десятков тысяч) учитывая текущую реализацию.

Разделение столбцов и для анализа метаданных - ваш лучший и единственный вариант.

...