2014-02-05 2 views
4

Я работаю над классификацией текста, используя scikit-learn. Все хорошо работает с одной функцией, но введение нескольких функций дает мне ошибки. Я думаю, проблема заключается в том, что я не форматирую данные так, как этого требует классификатор.Использование нескольких функций с scikit-learn

Например, это работает отлично:

data = np.array(df['feature1']) 
classes = label_encoder.transform(np.asarray(df['target'])) 
X_train, X_test, Y_train, Y_test = train_test_split(data, classes) 

classifier = Pipeline(...) 

classifier.fit(X_train, Y_train) 

Но это:

data = np.array(df[['feature1', 'feature2']]) 
classes = label_encoder.transform(np.asarray(df['target'])) 
X_train, X_test, Y_train, Y_test = train_test_split(data, classes) 

classifier = Pipeline(...) 

classifier.fit(X_train, Y_train) 

умирает с

Traceback (most recent call last): 
    File "/Users/jed/Dropbox/LegalMetric/LegalMetricML/motion_classifier.py", line 157, in <module> 
    classifier.fit(X_train, Y_train) 
    File "/Library/Python/2.7/site-packages/sklearn/pipeline.py", line 130, in fit 
    Xt, fit_params = self._pre_transform(X, y, **fit_params) 
    File "/Library/Python/2.7/site-packages/sklearn/pipeline.py", line 120, in _pre_transform 
    Xt = transform.fit_transform(Xt, y, **fit_params_steps[name]) 
    File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 780, in fit_transform 
    vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary) 
    File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 715, in _count_vocab 
    for feature in analyze(doc): 
    File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 229, in <lambda> 
    tokenize(preprocess(self.decode(doc))), stop_words) 
    File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 195, in <lambda> 
    return lambda x: strip_accents(x.lower()) 
AttributeError: 'numpy.ndarray' object has no attribute 'lower' 

на стадии предварительной обработки после classifier.fit() называется. Я думаю, проблема в том, что я форматирую данные, но я не могу понять, как правильно это сделать.

особенность1 и feature2 - это как английские текстовые строки, так и цели. Я использую LabelEncoder() для кодирования цели, которая, кажется, работает нормально.

Вот пример того, что возвращает print data, чтобы дать вам представление о том, как оно отформатировано прямо сейчас.

[['some short english text' 
    'a paragraph of english text'] 
['some more short english text' 
    'a second paragraph of english text'] 
['some more short english text' 
    'a third paragraph of english text']] 
+0

Ну, как вы форматируете данные? Я вообще обнаружил, что могу просто передать pandas DataFrame непосредственно на функции 'scikit', и он работает нормально. – BrenBarn

+0

Я пробовал передать DataFrame непосредственно в 'train_test_split()', и я получаю ту же ошибку. 'train_test_split (df ['feature1'], label_encoder.transform (df ['target']))' отлично работает. 'train_test_split (df [['feature1', 'feature2']], label_encoder.transform (df ['matches']))' does not. –

+0

Можете ли вы распечатать, что выглядит 'X_train' в каждом из двух случаев. – ely

ответ

2

Конкретное сообщение об ошибке создает впечатление, что ваш код где-то ожидает, что-то, чтобы быть str (так что .lower можно назвать), но вместо этого он получает целый массив (возможно, целый массив из str с).

Можете ли вы отредактировать вопрос, чтобы лучше описать данные, а также опубликовать полную трассировку, а не только небольшую часть с названной ошибкой?

В то же время, вы также можете попробовать

data = df[['feature1', 'feature2']].values 

и

df['target'].values 

вместо явного приведения к np.ndarray себя.

Мне кажется, что массив делается там, где он равен 1x1, а элемент singleton в «массиве» сам по себе является ndarray.

+0

Я попытался использовать '.values' и получил ту же ошибку. –

+0

Что можно сказать об объединении функций? –

0

Если ваши текстовые столбцы имеют один и тот же кодер/трансформатор, объедините столбцы вместе.

data = np.append(df.feature1. df.feature2) 
Смежные вопросы