Здесь несколько вещей не так:
for feature_colunm_name in feature_columns_to_use:
X_train[feature_colunm_name] = CountVectorizer().fit_transform(X_train[feature_colunm_name]).todense()
X_test[feature_colunm_name] = CountVectorizer().fit_transform(X_test[feature_colunm_name]).todense()
1) Вы пытаетесь присвоить столбцы с несколькими строками (результатом CountVectorizer
будет двумерный массив, в котором столбцы представляют объекты) одному столбцу 'feature_colunm_name
' объекта DataFrame. Это не сработает и приведет к ошибке.
2) Вы снова подключаете CountVectorizer к тестовым данным, что неверно. Вы должны использовать тот же объект CountVectorizer для тестовых данных, который вы использовали для данных trainind, и вызывать только transform()
, а не fit_transform()
.
Что-то вроде:
cv = CountVectorizer()
X_train_cv = cv.fit_transform(X_train[feature_colunm_name])
X_test_cv = cv.transform(X_test[feature_colunm_name])
3) GradientBoostingClassifier
хорошо работает с разреженными данными. Это еще не упомянуто в документации (похоже на ошибку в документации).
4) Похоже, вы преобразовываете несколько столбцов ваших исходных данных в форму пакета слов. Для этого вам нужно будет использовать эти многочисленные объекты CountVectorizer, а затем объединить все выходные данные в один массив, который вы передадите в GradientBoostingClassifier.
Обновление
Вам нужно настроить что-то вроде этого:
# To merge sparse matrices
from scipy.sparse import hstack
result_matrix_train = None
result_matrix_test = None
for feature_colunm_name in feature_columns_to_use:
cv = CountVectorizer()
X_train_cv = cv.fit_transform(X_train[feature_colunm_name])
# Merge the vector with others
result_matrix_train = hstack((result_matrix_train, X_train_cv))
if result_matrix_train is not None else X_train_cv
# Now transform the test data
X_test_cv = cv.transform(X_test[feature_colunm_name])
result_matrix_test = hstack((result_matrix_test, X_test_cv))
if result_matrix_test is not None else X_test_cv
Примечание: Если у вас есть и другие столбцы, которые вы не обработали через Countvectorizer, потому что они уже числовые или около того, которые вы хотите объединить с result_matrix_train
, вы также можете сделать это с помощью:
result_matrix_train = hstack((result_matrix_test, X_train[other_columns].values))
result_matrix_test = hstack((result_matrix_test, X_test[other_columns].values))
Теперь используйте их для обучения:
...
grd.fit(result_matrix_train, y_train.values)