0
votes

I am trying to implement Logistic Regression using pySpark Here is my code

from pyspark.mllib.classification import LogisticRegressionWithLBFGS
from time import time
from pyspark.mllib.regression import LabeledPoint
from numpy import array


RES_DIR="/home/shaahmed115/Pet_Projects/DA/TwitterStream_US_Elections/Features/"
sc= SparkContext('local','pyspark')

data_file = RES_DIR + "training.txt"
raw_data = sc.textFile(data_file)

print "Train data size is {}".format(raw_data.count())


test_data_file = RES_DIR + "testing.txt"
test_raw_data = sc.textFile(test_data_file)

print "Test data size is {}".format(test_raw_data.count())

def parse_interaction(line):
    line_split = line.split(",")
    return LabeledPoint(float(line_split[0]), array([float(x) for x in line_split]))

training_data = raw_data.map(parse_interaction)
logit_model = LogisticRegressionWithLBFGS.train(training_data,iterations=10, numClasses=3) 

This is throwing an error : Currently, LogisticRegression with ElasticNet in ML package only supports binary classification. Found 3 in the input dataset

Below is a sample of my dataset: 2 , 1.0 , 1.0 , 1.0 0 , 1.0 , 1.0 , 1.0 1 , 0.0 , 0.0 , 0.0

The first element is the class while the rest is the vector.As you can see there are three classes. Is there a workaround that can make multinomial classification work with this?

1

1 Answers

1
votes

The error you see

LogisticRegression with ElasticNet in ML package only supports binary classification.

is clear. You can use the mllib version to support multinomial:
org.apache.spark.mllib.classification.LogisticRegression

/**
 * Train a classification model for Multinomial/Binary Logistic Regression using
 * Limited-memory BFGS. Standard feature scaling and L2 regularization are used by default.
 * NOTE: Labels used in Logistic Regression should be {0, 1, ..., k - 1}
 * for k classes multi-label classification problem.
 *
 * Earlier implementations of LogisticRegressionWithLBFGS applies a regularization
 * penalty to all elements including the intercept. If this is called with one of
 * standard updaters (L1Updater, or SquaredL2Updater) this is translated
 * into a call to ml.LogisticRegression, otherwise this will use the existing mllib
 * GeneralizedLinearAlgorithm trainer, resulting in a regularization penalty to the
 * intercept.
 */