Как построить кривую RO C в pyspark для GBTClassifier? - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь построить кривую RO C для модели повышения градиента. Я сталкивался с этим постом, но он не работает для модели GBTclassifier. экстракт pyspark RO C кривая?

Я использую набор данных в блоках данных, и ниже приведен мой код. Выдает следующую ошибку

AttributeError: 'PipelineModel' object has no attribute 'summary'

%fs ls databricks-datasets/adult/adult.data

from pyspark.sql.functions import *
from pyspark.ml.classification import  RandomForestClassifier, GBTClassifier
from pyspark.ml.feature import StringIndexer, OneHotEncoderEstimator, VectorAssembler, VectorSlicer
from pyspark.ml import Pipeline
from pyspark.ml.evaluation import BinaryClassificationEvaluator,MulticlassClassificationEvaluator
from pyspark.ml.linalg import Vectors
from pyspark.ml.tuning import ParamGridBuilder, TrainValidationSplit
import pandas as pd

dataset = spark.table("adult")
# spliting the train and test data frames 
splits = dataset.randomSplit([0.7, 0.3])
train_df = splits[0]
test_df = splits[1]

def predictions(train_df,
                     target_col, 
                    ):
  """
  #Function attributes
  dataframe        - training df
  target           - target varibale in the model
  """



  # one hot encoding and assembling
  encoding_var = [i[0] for i in train_df.dtypes if (i[1]=='string') & (i[0]!=target_col)]
  num_var = [i[0] for i in train_df.dtypes if ((i[1]=='int') | (i[1]=='double')) & (i[0]!=target_col)]

  string_indexes = [StringIndexer(inputCol = c, outputCol = 'IDX_' + c, handleInvalid = 'keep') for c in encoding_var]
  onehot_indexes = [OneHotEncoderEstimator(inputCols = ['IDX_' + c], outputCols = ['OHE_' + c]) for c in encoding_var]
  label_indexes = StringIndexer(inputCol = target_col, outputCol = 'label', handleInvalid = 'keep')
  assembler = VectorAssembler(inputCols = num_var + ['OHE_' + c for c in encoding_var], outputCol = "features")
  gbt = GBTClassifier(featuresCol = 'features', labelCol = 'label',
                     maxDepth = 5, 
                     maxBins  = 45,
                     maxIter  = 20)


  pipe = Pipeline(stages = string_indexes + onehot_indexes + [assembler, label_indexes, gbt])

  model = pipe.fit(train_df)

  return model

gbt_model = predictions(train_df = train_df,
                     target_col = 'income')

import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))
plt.plot([0, 1], [0, 1], 'r--')
plt.plot(gbt_model.summary.roc.select('FPR').collect(),
         gbt_model.summary.roc.select('TPR').collect())
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()

1 Ответ

0 голосов
/ 13 января 2020

Исходя из вашей ошибки, посмотрите на PipelineModel в этом do c: https://spark.apache.org/docs/2.4.3/api/python/pyspark.ml.html#pyspark .ml.PipelineModel

Нет атрибута summary в объект этого класса. Вместо этого я считаю, что вам нужно получить доступ к этапам PipelineModel индивидуально, например gbt_model.stages[-1] (что должно дать доступ к вашему последнему этапу - GBTClassifier. Затем попробуйте поиграть с такими атрибутами, как:

gbt_model.stages[-1].summary

И если у вашего GBTClassifier есть резюме, вы найдете его там. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...