Измените форму pandas.Df для использования в GridSearch

Я пытаюсь использовать несколько столбцов функций в GridSearch с Pipeline. Итак, я передаю два столбца, для которых хочу выполнить TfidfVectorizer, но у меня возникают проблемы при запуске GridSearch.

Xs = training_data.loc[:,['text','path_contents']]
y = training_data['class_recoded'].astype('int32')

for col in Xs:
    print Xs[col].shape

print Xs.shape
print y.shape

# (2464L,)
# (2464L,)
# (2464, 2)
# (2464L,)

from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import GridSearchCV

pipeline = Pipeline([('vectorizer', TfidfVectorizer(encoding="cp1252", stop_words="english")), 
                     ('nb', MultinomialNB())])

parameters = {
    'vectorizer__max_df': (0.48, 0.5, 0.52,),
    'vectorizer__max_features': (None, 8500, 9000, 9500),
    'vectorizer__ngram_range': ((1, 3), (1, 4), (1, 5)),
    'vectorizer__use_idf': (False, True)
}

if __name__ == "__main__":
    grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=2)
    grid_search.fit(Xs, y) # <- error thrown here

    print("Best score: {0}".format(grid_search.best_score_))  
    print("Best parameters set:")  
    best_parameters = grid_search.best_estimator_.get_params()  
    for param_name in sorted(list(parameters.keys())):  
        print("\t{0}: {1}".format(param_name, best_parameters[param_name]))

Ошибка: ValueError: найдены входные переменные с несовместимым количеством выборок: [2, 1642]

Я прочитал аналогичную ошибку здесь и здесь, и я попробовал оба вопроса предложения, но безрезультатно.

Я попытался выбрать свои данные по-другому:

features = ['text', 'path_contents']
Xs = training_data[features]

Вместо этого я попытался использовать .values, как было предложено здесь, например:

grid_search.fit(Xs.values, y.values) 

но это дало мне следующую ошибку:

AttributeError: объект «numpy.ndarray» не имеет атрибута «нижний»

Так что же происходит? Я не уверен, как продолжить с этого.


person Bram Vanroy    schedule 27.05.2017    source источник
comment
TfidfVectorizer.fit() нужен итерируемый объект, элементы которого являются строками, но Xs содержит два столбца, поэтому каждый элемент Xs является объектом массива, и когда TfidfVectorizer вызывает метод lower() элементов в Xs, он вызывает AttributeError: объект 'numpy.ndarray' не имеет атрибут «нижний». Итак, вопрос в том, почему вы передаете два столбца в TfidfVectorizer.   -  person HYRY    schedule 27.05.2017
comment
Как я уже говорил в своем ответе на ваш предыдущий вопрос, использование нескольких столбцов в TfidfVectorizer внутри конвейера не так просто.   -  person Vivek Kumar    schedule 27.05.2017


Ответы (1)


TfidfVectorizer ожидает ввода списка строк. Это объясняет «AttributeError: объект 'numpy.ndarray' не имеет атрибута 'ниже'», потому что вы вводите 2d-массив, что означает список массивов.

Таким образом, у вас есть 2 варианта: либо заранее объединить 2 столбца в 1 столбец (в пандах), либо, если вы хотите сохранить 2 столбца, вы можете использовать объединение функций в конвейере (http://scikit-learn.org)./stable/modules/pipeline.html#feature-union)

Что касается первого исключения, я думаю, это вызвано общением между pandas и sklearn. Однако вы не можете сказать наверняка из-за вышеуказанной ошибки в коде.

person THN    schedule 27.05.2017
comment
Если бы первым исключением была ошибка: ValueError: Found input variable с несовместимым количеством выборок: [2, 2464], я бы сказал, что это также вызвано искаженным вводом. Так как Xs — это список из двух столбцов, y — это последовательность длиной 2464, что составляет сообщение [2, 2464]. - person THN; 27.05.2017