Обучите логистическую регрессию так, чтобы она определяла тональность текста.
Подсчитайте величину TF-IDF для текстов. Лемматизированные тексты твитов для обучения находятся в файле tweets_lemm_train.csv. Целевой признак вы найдёте в столбце positive.
Обученной моделью классификации определите результаты предсказания для тестовой выборки твитов, которая лежит в файле tweets_lemm_test.csv. В этой выборке целевого признака нет. Сохраните предсказания в столбце positive. Таблицу с результатом сохраните как csv-файл, но чтобы тренажёр принял файл, не указывайте расширение (например, назовите файл 'predictions'). Не используйте пробелы в названии файла.
Значение accuracy вашей модели должно быть не меньше 0.62.
Файлы:
# подготавливаем рабочее пространство,
# загружаем библиотеки
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import nltk
from nltk.corpus import stopwords as nltk_stopwords
nltk.download('stopwords')
stopwords = list(set(nltk_stopwords.words('russian')))
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import nltk
from nltk.corpus import stopwords as nltk_stopwords
from sklearn.feature_extraction.text import TfidfVectorizer
pd.set_option('display.max_columns', None)
# загружаем данные тестовой выборки,
# выводим информацию по датасету,
# выводим первые 5 строк
data_test = pd.read_csv('https://code.s3.yandex.net/datasets/tweets_lemm_test.csv')
display(data_test.info())
display(data_test.head(5))
| text | lemm_text | |
|---|---|---|
| 0 | RT @tiredfennel: если криса так интересуют дет... | если крис так интересовать ребёнок то либо они... |
| 1 | @xsealord по 200 руб. в месяц можно разместить... | по рубль в месяц можно разместить ссылка на те... |
| 2 | @haosANDlaw @Etishkindyx учитывая, что сейчас ... | учитывать что сейчас преобладать один половина... |
| 3 | Товарищ :) Но я никак не могу отдельно не о... | товарищ но я никак не мочь отдельно не отметит... |
| 4 | RT @BodyaNick: Квн был отличный !) Оооочень по... | квн быть отличный оооочень понравиться женский... |
# считаем величину TF-IDF для обучающей выборки
count_tf_idf_train = TfidfVectorizer(stop_words=stopwords)
tf_idf_train = count_tf_idf_train.fit_transform(data_train.lemm_text)
display(tf_idf_train.shape)
(5000, 9737)
# считаем величину TF-IDF для тестовой выборки
count_tf_idf_test = TfidfVectorizer(stop_words=stopwords)
tf_idf_test = count_tf_idf_train.transform(data_test.lemm_text)
display(tf_idf_test.shape)
(3000, 9737)
# проверяем распределение классов в обучающей выборке
data_train['positive'].value_counts().plot.bar();

# делим обучающую выборку на признаки (матрица X) и целевую переменную (y)
X_train = data_train.drop('positive', axis=1)
y_train = data_train['positive']
# задаем алгоритм для модели
model = LogisticRegression(random_state=0)
# обучаем модель
model.fit(tf_idf_train, y_train)
# делаем предсказание на обучающей выборке,
# проверяем метрику accuracy
pred_train = model.predict(tf_idf_train)
print('Accuracy: {:.2f}'.format(accuracy_score(y_train, pred_train)))
LogisticRegression(random_state=0)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
# делаем предсказание на обучающей выборке,
# проверяем метрику accuracy
pred_train = model.predict(tf_idf_train)
print('Accuracy: {:.2f}'.format(accuracy_score(y_train, pred_train)))
Accuracy: 0.90
# делаем предсказание на тестовой выборке
predictions = model.predict(tf_idf_test)
# добавляем столбец с предсказаниями в тестовую выборку
data_test['positive'] = predictions
display(data_test.head(5))
| text | lemm_text | positive | |
|---|---|---|---|
| 0 | RT @tiredfennel: если криса так интересуют дет... | если крис так интересовать ребёнок то либо они... | 1 |
| 1 | @xsealord по 200 руб. в месяц можно разместить... | по рубль в месяц можно разместить ссылка на те... | 0 |
| 2 | @haosANDlaw @Etishkindyx учитывая, что сейчас ... | учитывать что сейчас преобладать один половина... | 0 |
| 3 | Товарищ :) Но я никак не могу отдельно не о... | товарищ но я никак не мочь отдельно не отметит... | 0 |
| 4 | RT @BodyaNick: Квн был отличный !) Оооочень по... | квн быть отличный оооочень понравиться женский... | 1 |
# сохраняем файл
data_test.to_csv('predictions')
Машина чувствует позитив. И негатив. Ещё немного — и начнёт доставать табличку «сарказм», когда будет замечать высшую степень иронии.