Введение
В этом руководстве используются 3 очищенных набора данных, которые обсуждались и были подготовлены в части 1 этой серии.
- Dimension сократил данные о настроениях для 1 600 000 твитов, помеченных 0 для отрицательных и 1 для положительных настроений.
- 8981 невидимый твит о covid-19.
- Размер уменьшенной версии 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 этой серии.