python - scikit - ValueError: unknown no se admite en sklearn.RFECV
que es scikit learn (1)
Estaba tratando de reducir el número de funciones realmente relevantes para mi clasificador usando rfecv. Este es el código que he escrito
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'')
En la llamada de "rfecv.fit (X, Y)" mi código arroja un error desde el archivo metrices.py "ValueError: unknown no es compatible"
El error brota en 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))
Este es un problema de clasificación, los valores objetivo solo son 0 o 1. El conjunto de datos se puede encontrar en Kaggle Competition Data
Si alguien puede señalar dónde estoy yendo mal, lo agradecería.
RFECV
comprueba que los datos de destino / tren sean de uno de los tipos binary
, multiclass
, multilabel-indicator
o multilabel-sequences
:
- ''binary'':
y
contiene <= 2 valores discretos y es 1d o un vector de columna. - ''multiclass'':
y
contiene más de dos valores discretos, no es una secuencia de secuencias, y es 1d o un vector de columna. - ''multiplicidad-salida múltiple'':
y
es una matriz 2d que contiene más de dos valores discretos, no es una secuencia de secuencias, y ambas dimensiones son de tamaño> 1. - ''multilabel-indicator'':
y
es una matriz de indicadores de etiquetas, una matriz de dos dimensiones con al menos dos columnas y, como máximo, 2 valores únicos.
mientras tu Y
es unknown
, eso es
- ''desconocido'':
y
es similar a una matriz, pero ninguno de los anteriores, como una matriz 3D o una matriz de objetos que no son de secuencia.
El motivo es que los datos de destino son cadenas (del formulario "0"
y "1"
) y se cargan con read_table
como objeto:
>>> training_data[:, -1].dtype
dtype(''O'')
>>> type_of_target(training_data[:, -1])
''unknown''
Para resolver el problema, puede convertir a int
:
>>> Y = training_data[:, -1].astype(int)
>>> type_of_target(Y)
''binary''