Введение

В этом руководстве используются 3 очищенных набора данных, которые обсуждались и были подготовлены в части 1 этой серии.

  1. Dimension сократил данные о настроениях для 1 600 000 твитов, помеченных 0 для отрицательных и 1 для положительных настроений.
  2. 8981 невидимый твит о covid-19.
  3. Размер уменьшенной версии 8 981 твита о covid-19.

Цель состоит в том, чтобы обучить модель LDA на основе данных об настроениях и использовать эту модель для прогнозирования настроений каждого твита о covid-19.

Код, сопровождающий это руководство, можно найти здесь: https://github.com/aletna/Covid-19-Tweets-Classification.git

Мы будем использовать следующие библиотеки:

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import metrics
import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.metrics import classification_report,confusion_matrix

1. Тренинг с пометкой настроения

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

Сначала загрузим данные о настроениях. В части 1 этой серии мы подготовили данные о настроениях, чтобы они были разделены на входные и выходные (целевые) переменные. Загрузим подготовленные данные.

target = np.load('target.npy')/4
sent_input = np.load('sentiment_input.npy')

Здесь я делю целевые данные на 4, так как исходный набор данных помечал положительные твиты как 4, а отрицательные твиты как 0. Разделив их на 4, каждый твит просто помечается как 0 и 1. Это не обязательно, но помогает избежать путаницы.

Затем давайте разделим наши входные и выходные переменные на обучающие и тестовые наборы, чтобы иметь возможность протестировать нашу модель на невидимых тестовых данных. Здесь я разделяю данные на 75% обучающих данных и 25% тестовых данных, задав для test_size значение 0,25. Random_state действует как начальное число, чтобы иметь возможность воспроизвести те же результаты.

# Splitting input and output variables into training and test sets
X = sent_input
y = target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=7)

Используя данные обучения, давайте обучим модель LDA.

lda = LinearDiscriminantAnalysis()
lda.fit(X_train, y_train)

После того, как мы подобрали обучающие данные к модели, мы можем делать прогнозы на основе невидимых тестовых данных с помощью функции прогнозирования.

y_pred = lda.predict(X_test)

Поскольку мы обучили модель классификации потенциальным выходам 0 или 1, наши прогнозы будут выглядеть одинаково. Переменная y_pred теперь хранит значение 0 или 1 для каждого твита y_test.

2. Обзор модели

Прежде чем приступить к прогнозированию невидимых твитов Covid, важно взглянуть на результаты и точность модели. Давайте начнем с печати его оценки точности и отчета о классификации, в котором представлены такие оценки, как точность, отзывчивость или оценка f1.

print(precision_score(y_test, y_predicted, average='weighted')
print(classification_report(y_test,y_pred))

Эта конкретная модель имеет точность 0,694, что не идеально, но и не так уж плохо. Это означает, что около 7 из 10 предсказаний тестовой выборки были точными. Матрица неточностей помогает нам понять, сколько было истинных и ложных срабатываний, а также истинных и ложных отрицательных результатов.

print(confusion_matrix(y_test,y_pred))

3. Прогнозирование настроения к твитам covid

Теперь, когда мы обучили нашу модель помеченным данным настроений, мы можем применить ее к нашим невидимым данным covid, которые также были подготовлены в части 1 этой серии.

covid_data = np.load('vectorized_100.npy')

Чтобы выполнить прогнозы, нам просто нужно запустить следующую строку кода.

covid_predictions = lda.predict(covid_data)

Теперь все прогнозы наших моделей хранятся в covid_predictions. Давайте создадим фрейм данных, чтобы можно было прикрепить его к нашим невекторизованным данным covid для дальнейшей визуализации позже (часть 4).

covid_predicted_values = pd.DataFrame({'Predicted Values': covid_predictions.flatten()})

Ниже приведен снимок того, как это будет выглядеть. Видно, что, например, первые 5 твитов в нашем наборе данных были скорее отрицательными, чем положительными. Последний твит, номер 8980, с другой стороны, кажется положительным.

Однако мы можем получить больше информации о настроении твита, используя LDA sklearn, встроенную в функцию pred_proba. Это даст нам вероятность того, что каждая выборка принадлежит каждому из двух классов. Например, прогнозируемый отрицательный твит может иметь только 55% вероятности быть отрицательным или более 90%. Это сделает за нас функция pred_proba.

covid_predictions_probability = lda.predict_proba(covid_data)

Прежде чем добавить его в наш исходный фрейм данных всех данных covid, давайте создадим массив всех отрицательных и положительных вероятностей для каждого твита.

covid_negative_probability=[]
covid_positive_probability=[]
for i in covid_predictions_probability:
    covid_positive_probability.append(i[1])
    covid_negative_probability.append(i[0])

Давайте импортируем очищенный невекторизованный фрейм данных covid-19, чтобы затем связать все наши данные прогнозов с каждым соответствующим твитом.

data_country_random = pd.read_csv('data_country_random.csv')

Теперь мы можем прикрепить прогнозы в виде новых столбцов.

data_country_random['predictions'] = covid_predicted_values
data_country_random['positive_probability'] = covid_positive_probability
data_country_random['negative_probability'] = covid_negative_probability

Наконец, давайте напечатаем заголовок фрейма данных covid.

data_country_random.head()

Ниже приведен фрагмент его заголовка (обратите внимание, не все столбцы помещаются на снимок экрана, но всю таблицу можно найти в репозитории github).

Последние три столбца - это наши новые данные прогноза.

  • прогнозы: показывает прогноз наших моделей в отношении тональности твитов. 0 для отрицательного и 1 для положительного.
  • positive_probability: показывает вероятность того, что этот твит будет положительным. Например, первая строка имеет положительную вероятность 0,4.
  • negative_probability: Как и positive_probability, это показывает вероятность того, что твит будет отрицательным. В случае записи первой строки вероятность того, что он отрицательный, составляет 0,59, поэтому модель решила, что это отрицательный твит.

Анализ положительной и отрицательной вероятности каждого твита показывает, что часто не совсем ясно, является ли твит положительным или отрицательным, и что мы должны относиться к каждому прогнозу с долей скептицизма.

Наконец, мы можем проверить некоторые положительные и отрицательные твиты, чтобы увидеть, правильно ли их классифицирует модель.

# printing out first 50 positive tweets 
# and the probability ofhow likely it is positive vs negative
data_country_random[['text','positive_probability','negative_probability']].loc[data_country_random['predictions'] == 1][:50]

# printing out first 50 negative tweets 
# and the probability of how likely it is positive vs negative
data_country_random[['text','positive_probability','negative_probability']].loc[data_country_random['predictions'] == 0][:50]

Теперь, когда прогнозы covid сохранены во фрейме данных, давайте экспортируем их для дальнейшего анализа и визуализации в части 4.

data_country_random.to_csv("covid_predictions_with_proba.csv")

Заключение

В заключение, мы взяли чистый набор данных с пометкой настроения (положительный и отрицательный) твитов, обучили на нем классификатор LDA и достигли точности классификации 0,694. После обучения этой модели мы использовали ее для прогнозирования настроений наших невидимых, но очищенных ковидных твитов. Мы не только спрогнозировали классификацию, но и сохранили прогнозируемую моделью вероятность того, что любой из заданных твитов будет положительным или отрицательным. Вся эта информация была добавлена ​​в общий фрейм данных твита covid, после чего мы сохранили ее для визуализации в части 4 этой серии.