Я вручную извлек некоторые особенности из предложений, например, POS-теги, заголовки и т. Д., А также создал пакет слов, используя CountVectorizer
.Я пытаюсь выполнить вложенную перекрестную проверку и хочу создать пакет слов с различными параметрами.Для этой цели я использую класс Pipeline
, но получаю ошибки.
Я унаследовал класс CountVectorizer
для включения различных настроек.Однако, когда я комбинирую пакет слов с другими функциями, которые конвертируются в csr_matrix
, я получаю следующую ошибку: X has 4058 features per sample; expecting 4766
.
class FeatureCombiner(CountVectorizer):
def __init__(self,analyzer='word',stop_words=None,ngram_range=(1, 1)):
CountVectorizer.__init__(self)
def fit_transform(self, x, y=None, **fit_params):
x_indices = x.index
vect = DictVectorizer()
temp_feats = np.take(features, x_indices, axis=0)
eng_features = vect.fit_transform(temp_feats)
bow = CountVectorizer.fit_transform(self, x, y, **fit_params)
final_features = scipy.sparse.hstack([eng_features, bow])
final_features = sklearn.preprocessing.normalize(final_features, axis=0)
return final_features
pipeline = Pipeline([
('vec', FeatureCombiner()),
# ('vec', CountVectorizer()),
('clf', LinearSVC(random_state=0))
])
parameters = {
'clf__C': [0.1, 1, 10],
'vec__stop_words': [None, 'english']
}
NUM_TRIALS = 1
for i in range(NUM_TRIALS):
inner_cv = KFold(n_splits=5, shuffle=True, random_state=i)
outer_cv = KFold(n_splits=5, shuffle=True, random_state=i)
clf = GridSearchCV(pipeline, parameters, cv=inner_cv,
iid=False)
clf.fit(sentences, labels)
nested_score = cross_val_score(clf, X=sentences, y=labels, cv=outer_cv, scoring="f1")
print(clf.best_estimator_)