Как объединить векторизатор TF_IDF с пользовательской функцией - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь построить модель с комбинацией числовых элементов из информационного кадра и текстовых элементов из информационного кадра.Однако у меня много проблем с успешным объединением функций, обучением с использованием этих функций, а затем тестированием функций.

Сейчас я пытаюсь использовать DataFrameMapper следующим образом:

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn_pandas import DataFrameMapper


mapper = DataFrameMapper([
     ('body', TfidfVectorizer()),
     ('numeric_feature', None),

 ]) 

for train_index, test_index in kFold.split(DF['body']):

    # Split the dataset by Kfold

    X_train = even_rand[['body','numeric_feature']].iloc[train_index]
    y_train = even_rand['sub_class'].iloc[train_index]


    X_test = even_rand[['body','numeric_feature']].iloc[test_index]
    y_test = even_rand['sub_class'].iloc[test_index]

    # Vectorize/transform docs

    X_train = mapper.fit_transform(X_train)
    X_test = mapper.fit_transform(X_test)



    # Get SVM
    svm = SGDClassifier(loss='hinge', penalty='l2',
                                            alpha=1e-3, n_iter=5, random_state=10)
    svm.fit(X_train, y_train)
    svm_score = svm.score(X_test, y_test)

Это успешно объединяет данные и обучает данные, однако, когда я пытаюсь проверить данные, функции, кажется, не совпадают правильно, и я получаю ошибку

ValueError: X имеет49974 функции на образец;ожидая 87786

Кто-нибудь знает, как решить эту проблему, или знает, как лучше сочетать / обучать / тестировать числовые и текстовые функции вместе?Я также хотел бы сохранить возможности в качестве разреженных матриц, если это возможно.

1 Ответ

0 голосов
/ 18 февраля 2019

Вместо:

X_train = mapper.fit_transform(X_train)
X_test = mapper.fit_transform(X_test) 

попробуйте:

X_train = mapper.fit_transform(X_train)
X_test = mapper.transform(X_test) # change fit_transform to transform
...