PySpark ML: стратегия OnevsRest для LinearSVC - PullRequest
0 голосов
/ 14 мая 2018

Я новичок в PySpark.Я установил Spark 2.3.0 на Windows 10.Я хочу использовать Linear SVM классификатор для обучения с перекрестной проверкой, но для набора данных, который имеет 3 класса.Поэтому я пытаюсь применить стратегию One vs Rest от Spark ML.Но похоже, что в моем коде что-то не так, потому что я получил ошибку, показывающую, что LinearSVC предназначен для двоичной классификации.

Вот ошибка, которая возникает, когда я пытаюсь выполнить строку "crossval.fit" во время отладки:

 pyspark.sql.utils.IllegalArgumentException: u'requirement failed: LinearSVC only supports binary classification. 1 classes detected in LinearSVC_43a48b0b70d59a8cbdb1__labelCol'

Вот мой код: (я пытаюсь использовать очень маленький набор данных из 10 экземпляров)

        from pyspark import SparkContext
        sc = SparkContext('local', 'my app')
        from pyspark.ml.linalg import Vectors
        from pyspark import SQLContext
        sqlContext = SQLContext(sc)
        import numpy as np

        x_train=np.array([[1,2,3],[5,6,7],[9,10,11],[2,4,5],[2,7,9],[3,7,6],[8,3,6],[5,8,2],[44,11,55],[77,33,22]])
        y_train=[1,0,2,1,0,2,1,0,2,1]  
        #converting numpy array to dataframe          
        df_list = []
        i = 0           
        for element in x_train:  # row
            tup = (y_train[i], Vectors.dense(element))
            i = i + 1
            df_list.append(tup)

        Train_sparkframe = sqlContext.createDataFrame(df_list, schema=['label', 'features'])

        from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
        from pyspark.ml.evaluation import MulticlassClassificationEvaluator
        from pyspark.ml.classification import OneVsRest
        from pyspark.ml.classification import LinearSVC

        LSVC = LinearSVC()
        ovr = OneVsRest(classifier=LSVC)
        paramGrid = ParamGridBuilder().addGrid(LSVC.maxIter, [10, 100]).addGrid(LSVC.regParam,
                                                                                      [0.001, 0.01, 1.0,10.0]).build()

        crossval = CrossValidator(estimator=ovr,
                                  estimatorParamMaps=paramGrid,
                                  evaluator=MulticlassClassificationEvaluator(metricName="f1"),
                                  numFolds=2) 
        cvModel = crossval.fit(Train_sparkframe)
        bestModel = cvModel.bestModel

1 Ответ

0 голосов
/ 20 марта 2019

Мне удалось эффективно воспроизвести ваш код в письме без проблем в среде, размещенной на Python 3.5 / Spark 2.3, в этой записной книжке IBM: https://eu -gb.dataplatform.cloud.ibm.com / analytics / notebooks/ v2 / 24bb87d9-d28b-433b-b85a-5a86f4d0b56b / view? access_token = 3c7bec3ed89bb518357fcce8005874a66a1d65833e997603141632b5cbb484db * Spark, вы настраиваете на себя, что бы вы ни делали, вы бы даже хотели, чтобы вы даже взглянули, что бы вы ни делали, вы бы хотели, чтобы вы даже взглянули, что бы вы ни делали, вы бы хотели, что бы вы ни делали, вы бы хотели, что бы вы ни делали, вы бы хотели, что бы вы ни делали, вы бы хотели, что бы вы ни делали, и вы бы даже попробовали, так как вы, я бы даже сказал, что вы будете вдаваться в контекстпроверьте название столбца.

...