ValueError: unknown is not supported in sklearn.RFECV

kaggle, numpy, python, scikit-learn

Solution

`RFECV` checks target/train data to be of one of types `binary`, `multiclass`, `multilabel-indicator` or `multilabel-sequences`:

- 'binary': `y` contains <= 2 discrete values and is 1d or a column vector.

- 'multiclass': `y` contains more than two discrete values, is not a sequence of sequences, and is 1d or a column vector.

- 'mutliclass-multioutput': `y` is a 2d array that contains more than two discrete values, is not a sequence of sequences, and both dimensions are of size > 1.

- 'multilabel-indicator': `y` is a label indicator matrix, an array of two dimensions with at least two columns, and at most 2 unique values.

while your `Y` is `unknown`, that is

- 'unknown': `y` is array-like but none of the above, such as a 3d array, or an array of non-sequence objects.

The reason for that is your target data is string (of form `"0"` and `"1"`) and is loaded with `read_table` as object:

>>> training_data[:, -1].dtype
dtype('O')
>>> type_of_target(training_data[:, -1])
'unknown'

To solve the issue, you can convert to `int`:

>>> Y = training_data[:, -1].astype(int)
>>> type_of_target(Y)
'binary'

Problem

I was trying to narrow down the number of features really relevant for my classifier using rfecv. This is the code I have written ``` import sklearn import pandas as p import numpy as np import scipy as sp import pylab as pl from sklearn import linear_model, cross_validation, metrics from sklearn.svm import SVC from sklearn.feature_selection import RFECV from sklearn.metrics import zero_one_loss from sklearn import preprocessing #from sklearn.feature_extraction.text import CountVectorizer #from sklearn.feature_selection import SelectKBest, chi2 modelType = "notext" # ---------------------------------------------------------- # Prepare the Data # ---------------------------------------------------------- training_data = np.array(p.read_table('F:/NYC/NYU/SM/3/SNLP/Project/Data/train.tsv')) print ("Read Data\n") # get the target variable and set it as Y so we can predict it Y = training_data[:,-1] print(Y) # not all data is numerical, so we'll have to convert those fields # fix "is_news": training_data[:,17] = [0 if x == "?" else 1 for x in training_data[:,17]] # fix -1 entries in hasDomainLink training_data[:,14] = [0 if x =="-1" else x for x in training_data[:,10]] # fix "news_front_page": training_data[:,20] = [999 if x == "?" else x for x in training_data[:,20]] training_data[:,20] = [1 if x == "1" else x for x in training_data[:,20]] training_data[:,20] = [0 if x == "0" else x for x in training_data[:,20]] # fix "alchemy category": training_data[:,3] = [0 if x=="arts_entertainment" else x for x in training_data[:,3]] training_data[:,3] = [1 if x=="business" else x for x in training_data[:,3]] training_data[:,3] = [2 if x=="computer_internet" else x for x in training_data[:,3]] training_data[:,3] = [3 if x=="culture_politics" else x for x in training_data[:,3]] training_data[:,3] = [4 if x=="gaming" else x for x in training_data[:,3]] training_data[:,3] = [5 if x=="health" else x for x in training_data[:,3]] training_data[:,3] = [6 if x=="law_crime" else x for x in training_data[:,3]] training_data[:,3] = [7 if x=="recreation" else x for x in training_data[:,3]] training_data[:,3] = [8 if x=="religion" else x for x in training_data[:,3]] training_data[:,3] = [9 if x=="science_technology" else x for x in training_data[:,3]] training_data[:,3] = [10 if x=="sports" else x for x in training_data[:,3]] training_data[:,3] = [11 if x=="unknown" else x for x in training_data[:,3]] training_data[:,3] = [12 if x=="weather" else x for x in training_data[:,3]] training_data[:,3] = [999 if x=="?" else x for x in training_data[:,3]] print ("Corrected outliers data\n") # ---------------------------------------------------------- # Models # ---------------------------------------------------------- if modelType == "notext": print ("no text model\n") #ignore features which are useless X = training_data[:,list([3, 5, 6, 7, 8, 9, 10, 14, 15, 16, 17, 19, 20, 22, 25])] scaler = preprocessing.StandardScaler() print("initialized scaler \n") scaler.fit(X,Y) print("fitted train data and labels\n") X = scaler.transform(X) print("Transformed train data\n") svc = SVC(kernel = "linear") print("Initialized SVM\n") rfecv = RFECV(estimator = svc, cv = 5, loss_func = zero_one_loss, verbose = 1) print("Initialized RFECV\n") rfecv.fit(X,Y) print("Fitted train data and label\n") rfecv.support_ print ("Optimal Number of features : %d" % rfecv.n_features_) savetxt('rfecv.csv', rfecv.ranking_, delimiter=',', fmt='%f') ``` At call of "rfecv.fit(X,Y)" my code throws an error from the metrices.py file "ValueError: unknown is not supported" The error sprouts in `sklearn.metrics.metrics`: ``` # No metrics support "multiclass-multioutput" format if (y_type not in ["binary", "multiclass", "multilabel-indicator", "multilabel-sequences"]): raise ValueError("{0} is not supported".format(y_type)) ``` This is a classification problem, target values only 0 or 1. The data set can be found at Kaggle Competition Data If anyone can point out where I am going wrong, I would appreciate it.

Original source

Related problems