Я пытаюсь объединить элементы из tfidf и другие категориальные функции для выполнения классификации в результирующем наборе данных.Из разных блогов я понимаю, что FeatureUnion можно использовать для объединения функций, а затем передать их в алгоритм (в моем случае - наивный байесовский анализ).
Я следовал за кодом по этой ссылке - http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html
Когда я пытаюсь выполнить код, он выдает ошибку
TypeError: no supported conversion for types: (dtype('O'),)
Ниже приведен код, который япытаюсь выполнить:
class textdata():
def transform(self, X, Y):
return X[desc]
def fit(self, X, Y):
return self
class one_hot_trans():
def transform(self, X, Y):
X = pd.get_dummies(X, columns=obj_cols)
return X
def fit(self, X, Y):
return self
pipeline = Pipeline([
('features', FeatureUnion([
('ngram_tf_idf', Pipeline([
('text', textdata()),
('tf_idf', TfidfTransformer())
])),
('one_hot', one_hot_trans())
])),
('classifier', MultinomialNB())
])
d_train, d_test, y_train, y_test = train_test_split(data, data[target], test_size=0.2, random_state = 2018)
pipeline.fit(d_train, y_train)
Может кто-нибудь помочь мне в решении этой ошибки.
Примечание: данные имеют всего 9 столбцов с 1 целевой переменной (категориальной) и 1 текстовым столбцом (для которого я хочу выполнить tfidf), а остальные являются категориальными (obj_cols в приведенном выше коде).
Редактировать: Спасибо Вивек.Я этого не заметил.По ошибке я поставил трансформатор вместо Vectorizer.Даже после замены я получаю ошибку ниже.
~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\pipeline.py in _fit_transform_one(transformer, weight, X, y, **fit_params)
579 **fit_params):
580 if hasattr(transformer, 'fit_transform'):
--> 581 res = transformer.fit_transform(X, y, **fit_params)
582 else:
583 res = transformer.fit(X, y, **fit_params).transform(X)
~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\pipeline.py in fit_transform(self, X, y, **fit_params)
745 self._update_transformer_list(transformers)
746 if any(sparse.issparse(f) for f in Xs):
--> 747 Xs = sparse.hstack(Xs).tocsr()
748 else:
749 Xs = np.hstack(Xs)
~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\sparse\construct.py in hstack(blocks, format, dtype)
462
463 """
--> 464 return bmat([blocks], format=format, dtype=dtype)
465
466
~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\sparse\construct.py in bmat(blocks, format, dtype)
598 if dtype is None:
599 all_dtypes = [blk.dtype for blk in blocks[block_mask]]
--> 600 dtype = upcast(*all_dtypes) if all_dtypes else None
601
602 row_offsets = np.append(0, np.cumsum(brow_lengths))
~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\sparse\sputils.py in upcast(*args)
50 return t
51
---> 52 raise TypeError('no supported conversion for types: %r' % (args,))
53
54
TypeError: no supported conversion for types: (dtype('float64'), dtype('O'))
Редактировать ::
Я проверил уникальные значения во всех категориальных переменных, кроме столбца описания иЯ не нашел ни одного из значений, появляющихся в тестовых данных, которых нет в поезде.Я делаю что-то неправильно.
for col in d_train.columns.drop(desc):
ext = set(d_test[col].unique().tolist()) - set(d_train[col].unique().tolist())
if ext: print ("extra columns: \n\n", ext)
Edit2 :: Дополнительная информация - подробности о d_train, упомянутые функции d_test.Может кто-нибудь помочь, я все еще получаю ошибку "несоответствие размеров" на метод прогнозирования.
obj cols:: ['priority', 'ticket_type', 'created_group', 'Classification', 'Component', 'ATR_OWNER_PLANT', 'created_day']
d_train cols:: Index(['priority', 'ticket_type', 'created_group', 'Description_ticket', 'Classification', 'Component', 'ATR_OWNER_PLANT', 'created_day'], dtype='object')
d_test cols:: Index(['priority', 'ticket_type', 'created_group', 'Description_ticket','Classification', 'Component', 'ATR_OWNER_PLANT', 'created_day'], dtype='object')
d_train shape:: (95080, 8)
d_test shape:: (23770, 8)
desc:: Description_ticket