Обучите модель логистической регрессии на эмбеддингах. Напечатайте на экране значение accuracy на обучающей выборке.
Чтобы не создавать эмбеддинги слишком долго, возьмите из выборки только 400 случайных элементов. Для корректного тестирования поделите их на обучающую и тестовую выборки в соотношении 50:50.
Целевой признак находится в переменной df_tweets['positive']
Подсказка
Выделить 400 случайных твитов можно так:
df_tweets = df_tweets.sample(400).reset_index(drop=True)
import numpy as np
import pandas as pd
import torch
import transformers
from tqdm import notebook
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
df_tweets = pd.read_csv('/datasets/tweets.csv')
df_tweets = df_tweets.sample(400).reset_index(drop=True)
tokenizer = transformers.BertTokenizer(
vocab_file='/datasets/ds_bert/vocab.txt')
tokenized = df_tweets['text'].apply(
lambda x: tokenizer.encode(x, add_special_tokens=True))
max_len = 0
for i in tokenized.values:
if len(i) > max_len:
max_len = len(i)
padded = np.array([i + [0]*(max_len - len(i)) for i in tokenized.values])
attention_mask = np.where(padded != 0, 1, 0)
config = transformers.BertConfig.from_json_file(
'/datasets/ds_bert/bert_config.json')
model = transformers.BertModel.from_pretrained(
'/datasets/ds_bert/rubert_model.bin', config=config)
batch_size = 100
embeddings = []
for i in notebook.tqdm(range(padded.shape[0] // batch_size)):
batch = torch.LongTensor(padded[batch_size*i:batch_size*(i+1)])
attention_mask_batch = torch.LongTensor(attention_mask[batch_size*i:batch_size*(i+1)])
with torch.no_grad():
batch_embeddings = model(batch, attention_mask=attention_mask_batch)
embeddings.append(batch_embeddings[0][:,0,:].numpy())
features = np.concatenate(embeddings)
# обучите и протестируйте модель
# < напишите код здесь >
display(features.shape)
# разделим наши данные на признаки (матрица X) и целевую переменную (y)
X = features
y = df_tweets['positive']
# разделяем модель на обучающую и валидационную выборку
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.5, random_state=42
)
# зададим алгоритм для модели
model = LogisticRegression(random_state=42)
# обучим модель
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(cross_val_score(model, X, y, cv=5))