Я делаю проект по анализу настроений в наборе данных Twitter. Я использовал извлечение функций TF-IDF и регрессионную модель logisti c для классификации. До сих пор я обучал модель с помощью следующего:
def get_tfidf_features(train_fit, ngrams=(1,1)):
vector = TfidfVectorizer(ngrams, sublinear_tf=True)
vector.fit(train_fit)
return vector
X = tf_vector.transform(traintest['text'])
y = traintest['sentiment']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.01, random_state = 42)
LR_model = LogisticRegression(solver='lbfgs')
LR_model.fit(X_train, y_train)
y_predict_lr = LR_model.predict(X_test)
Эта регрессионная модель logisti c была обучена на наборе данных из примерно 1,5 миллиона твитов. У меня есть набор из 1,7 миллиона твитов, для которых я пытаюсь использовать эту модель анализа настроений, df_april
. С первой попытки я извлекаю функции следующим образом:
tfidf = TfidfVectorizer(ngram_range = unigrams, max_features = None, sublinear_tf = True)
X_april = tfidf.fit_transform(df_april['text'].values.astype('U'))
Моя первая мысль заключалась в том, чтобы просто вызвать прогноз на X_april
, но это выдает ошибку:
y_predict_april = LR_model.predict(X_april)
ValueError: X has 208976 features per sample; expecting 271794
Это имело смысл для меня: форма этих векторов признаков была другой:
X.shape
(1578614, 271794)
X_april.shape
(1705758, 208976)
Итак, я знаю, что мне нужно как-то отрегулировать количество функций для соответствия между X
и X_april
, чтобы вызвать прогноз X_april
. Моя попытка сделать это была:
x = pd.DataFrame.sparse.from_spmatrix(X)
x_april = pd.DataFrame.sparse.from_spmatrix(X_april)
not_existing_cols = [c for c in x.columns.tolist() if c not in x_april]
x_april = x_april.reindex(x_april.columns.tolist() + not_existing_cols, axis=1)
x_april = x_april[x.columns.tolist()]
Я работаю в ноутбуке Jupyter, и этот код приводит к мертвому ядру каждый раз, когда я его пробовал. Как я могу настроить функции так, чтобы я мог вызывать модель регрессии logisti c?