2015-04-20 2 views
0

Я выполняю многоуровневую классификационную задачу, используя sci-kit learn. В настройке, которую я создал, я хочу сравнить различные алгоритмы классификации.Плохая форма ввода() в классификации нескольких классов

Я использую конвейер, где текст вставляется как X, а Y - класс (multi-class, N = 5). Текстовые функции извлекаются в конвейере с помощью TfidfVectorizer().

КНН делает работу, но и другие классификаторы дают это: ValueError: bad input shape (670, 5)

Полный отслеживающий:

"/Users/Robbert/pipeline.py", line 62, in <module> 
train_pipeline.fit(X_train, Y_train) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/pipeline.py", line 130, in fit 
self.steps[-1][-1].fit(Xt, y, **fit_params) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 138, in fit 
y = self._validate_targets(y) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 441, in _validate_targets 
y_ = column_or_1d(y, warn=True) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 319, in column_or_1d 
raise ValueError("bad input shape {0}".format(shape)) 
ValueError: bad input shape (670, 5) 

код я использую:

def read_data(f): 
data = [] 
for row in csv.reader(open(f), delimiter=';'): 
    if row: 
     plottext = row[8] 
     target = { 'Age': row[4] } 
     data.append((plottext, target)) 
(X, Ycat) = zip(*data) 
Y = DictVectorizer().fit_transform(Ycat) 
Y = preprocessing.LabelBinarizer().fit_transform(Y) 
return (X, Y) 

X, Y = read_data('development2.csv') 

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=42) 

###KNN Pipeline 
#train_pipeline = Pipeline([ 
# ('vect', TfidfVectorizer(ngram_range=(1, 3), min_df=1)), 
# ('clf', KNeighborsClassifier(n_neighbors=350, weights='uniform'))]) 

###Logistic regression Pipeline 
#train_pipeline = Pipeline([ 
# ('vect', TfidfVectorizer(ngram_range=(1, 3), min_df=1)), 
# ('clf', LogisticRegression())]) 

##SVC 
train_pipeline = Pipeline([ 
('vect', TfidfVectorizer(ngram_range=(1, 3), min_df=1)), 
('clf', SVC(C=1, kernel='rbf', gamma=0.001, probability=True))]) 

##Decision tree 
#train_pipeline = Pipeline([ 
# ('vect', TfidfVectorizer(ngram_range=(1, 3), min_df=1)), 
# ('clf', DecisionTreeClassifier(random_state=0))]) 

train_pipeline.fit(X_train, Y_train) 

predicted = train_pipeline.predict(X_test) 

print accuracy_score(Y_test, predicted) 

Как это возможно, что КНН принимает формы массива и других классификаторов нет? И как изменить эту форму?

ответ

0

Если вы сравниваете документацию для функции fit (X, y) в KNeighborsClassifier и SVC, вы увидите, что только первый принимает y в форме [n_samples, n_outputs].

Возможное решение: зачем вам LabelBinarizer вообще? Просто не используйте его.

0

Если ваш вектор Y имеет размер (n_samples, n_classes) и содержит хотя бы одну строку, которая содержит более одного ненулевого элемента, то вы решаете проблему классификации с несколькими метками. Если это так, то на странице алгоритмов multiclass and multilabel в scikit-learn docs перечислены KNN как один из классификаторов, который поддерживает классификацию с несколькими метками. Возможно, вы захотите попробовать другие классификаторы из этого списка

* sklearn.tree.DecisionTreeClassifier 
* sklearn.tree.ExtraTreeClassifier 
* sklearn.ensemble.ExtraTreesClassifier 
* sklearn.neural_network.MLPClassifier 
* sklearn.neighbors.RadiusNeighborsClassifier 
* sklearn.ensemble.RandomForestClassifier 
* sklearn.linear_model.RidgeClassifierCV 
Смежные вопросы