Перекрестная проверка для модели абзаца-вектора - PullRequest
0 голосов
/ 02 января 2019

Я только что столкнулся с ошибкой при попытке применить перекрестную проверку для векторной модели абзаца:

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from gensim.sklearn_api import D2VTransformer

data = pd.read_csv('https://pastebin.com/raw/bSGWiBfs')
np.random.seed(0)

X_train = data.apply(lambda r: simple_preprocess(r['text'], min_len=2), axis=1)
y_train = data.label

model = D2VTransformer(size=10, min_count=1, iter=5, seed=1)
clf = LogisticRegression(random_state=0)

pipeline = Pipeline([
        ('vec', model),
        ('clf', clf)
    ])

pipeline.fit(X_train, y_train)

score = pipeline.score(X_train, y_train)
print("Score:", score) # This works
cval = cross_val_score(pipeline, X_train, y_train, scoring='accuracy', cv=3)
print("Cross-Validation:", cval) # This doesn't work

KeyError: 0

Я экспериментировал, заменив X_train в cross_val_score на model.transform(X_train) или model.fit_transform(X_train). Кроме того, я попытался сделать то же самое с необработанными входными данными (data.text) вместо предварительно обработанного текста. Я подозреваю, что что-то не так с форматом X_train для перекрестной проверки, по сравнению с функцией .score для Pipeline, которая работает просто отлично. Я также отметил, что cross_val_score работал с CountVectorizer().

Кто-нибудь замечает ошибку?

1 Ответ

0 голосов
/ 02 января 2019

Нет, это не имеет ничего общего с преобразованием из model. Это связано с cross_val_score.

cross_val_score разделит предоставленные данные в соответствии с параметром cv. Для этого он будет делать что-то вроде этого:

for train, test in splitter.split(X_train, y_train):
    new_X_train, new_y_train = X_train[train], y_train[train]

Но ваш X_train - это объект pandas.Series, в котором выбор на основе индекса не работает так. Смотрите это: https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-position

Изменить эту строку:

X_train = data.apply(lambda r: simple_preprocess(r['text'], min_len=2), axis=1)

до:

# Access the internal numpy array
X_train = data.apply(lambda r: simple_preprocess(r['text'], min_len=2), axis=1).values

OR

# Convert series to list
X_train = data.apply(lambda r: simple_preprocess(r['text'], min_len=2), axis=1).tolist()
...