Как объединить пакет слов с другими функциями во вложенной перекрестной проверке с помощью Pipeline - PullRequest
0 голосов
/ 17 мая 2019

Я вручную извлек некоторые особенности из предложений, например, 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_)
...