Сегодня мы обсудим прогнозирование настроения твита с помощью логистической регрессии. Главный урок заключается в том, что вместо того, чтобы использовать все слова в вашем наборе слов как отдельные функции для прогнозирования настроения твита, вы можете уменьшить количество функций до 3 функций на твит и делать очень точные прогнозы!
Подробное объяснение логистической регрессии см. в моем предыдущем посте в блоге.
Это краткий обзор Специализированного курса НЛП Deeplearning.ai 1.
Эта статья является частью серии. Продолжите с Бизнес изучает НЛП — Часть 2: анализ настроений с помощью Наивного Байеса.
Подробнейшие заметки для тех, кто хочет докопаться до сути:
Обратите внимание, что логистическая регрессия является частью обучения с учителем, поэтому мы будем использовать метки настроений нашего обучающего набора (реальный ys) для обучения нашей модели.
Шаг 1. Подготовьте данные в качестве входных данных для вашей модели.
- Шаг A. Прежде всего, мы создадим обучающую и тестовую выборки, чтобы оценить, насколько хорошо наши модели обобщают новые данные.
- Шаг Б. Обработайте свои твиты (def process_tweet(tweet)) → все об очистке ваших твитов и приведении их в порядок!
- Ввод: твит.
- Очистите грязь: просмотрите каждый твит, удалите хэштеги, гиперссылки, ретвиты, ручки
- Как только грязь удалена, разрежьте каждый твит на отдельные слова, это называется токенизацией, и создайте переменную (tweet_tokens)
- Создайте пустой массив, в котором будут храниться все вычищенные слова (tweets_clean)
- Для каждого слова в tweet_tokens, если слово не является стоп-словом или знаком препинания, верните слово к его основе и добавьте слово к tweets_clean
- Вывод: tweets_clean, список слов, содержащих обработанный твит.
- Шаг C. Постройте таблицу частот (def build_freqs(tweets, ys)) → получите частоты сообщений и отрицаний каждого слова!
- Теперь мы хотим создать обзор всех слов в нашем корпусе (обучающий набор) и подсчитать, как часто каждое слово используется в положительном или отрицательном контексте. Примечание: вместо того, чтобы смотреть на слово и оценивать, считается ли оно положительным или отрицательным, мы используем наш обучающий набор, чтобы сказать нам, как часто каждое слово упоминается в положительном или отрицательном твите. Следовательно, слово «счастливый», вероятно, будет часто упоминаться в наших позитивных твитах, но может также использоваться и в негативных твитах (например, «Я недоволен»).
- Входные данные: твиты и реальный ys (ярлыки реального настроения: 1 – положительный твит, 0 – отрицательный твит).
- Просмотрите каждый твит и каждый y (метка настроения)
- и протолкните каждый твит через функцию process_tweet, чтобы получить очищенную токенизированную версию вашего твита.
- С каждым вычищенным словом вашего твита создайте пару (слово, настроение (у))
- И добавляйте 1 в свой частотный словарь каждый раз, когда слово с этим конкретным ярлыком обнаруживается в новом твите.
- Если это новое слово, которое не было зарегистрировано, то зарегистрируйте слово и его тональность и назначьте ему частоту «1», так как оно было зарегистрировано впервые.
- Вывод: частотный словарь: обзор наших слов, их тональности и частотности.
- Шаг D. Извлеките функции (def extract_features( tweet, freqs)) → Теперь мы, наконец, создадим нашу закодированную версию твитов для вставки в нашу модель logreg!
- В итоге мы получаем строку из трех столбцов для каждого твита: единица смещения, сумма всех положительных значений слов в этом твите и сумма всех отрицательных значений слов в этом твите.
- Исходные данные: твит и таблица частот
- Создайте вектор 1 x 3 для каждого твита и инициализируйте нулями, чтобы у нашей функции был шаблон для хранения функций.
- Для каждого токенизированного твита, состоящего из списка слов, просмотрите каждое слово,
- Если мы находим это конкретное слово в положительном настроении с его соответствующей частотой (количество раз, когда это слово встречается во всех наших твитах вместе), то для этого твита добавьте его частоту в столбец «положительное настроение». Если мы не можем найти это конкретное слово (потому что это может быть стоп-слово), то ничего не делайте.
- Выходные данные: матрица данных X: обзор всех обучающих примеров, где для каждого твита есть только 3 функции столбца: единица смещения, сумма положительных частот и сумма отрицательные частоты
Шаг 2. Обучите свою модель (градиентный спуск по определению (X, y, thetas, alpha, num. iter)) → теперь мы готовы обучить нашу модель, подобрать оптимальные значения тета и определить нашу функцию гипотезы для определения настроение новых твитов
- Входные данные: матрица данных X, Y, начальные тета-параметры, скорость обучения альфа, количество итераций)
- Инициализируйте матрицу данных X нулями
- Заполните матрицу данных X с помощью нашей функции extract_features().
- Установите Y на train_y (настоящие чувства твитов!)
- Примените градиентный спуск, начав с 3 нулевых тета, рассчитав стоимость по всему обучающему набору (сравнив, насколько далеко каждое предсказанное настроение от его реального настроения, выполнив градиентный спуск, обновив тета и продолжая это упражнение для фиксированного количества итераций ( скажем, после 1500 циклов обработки данных мы придем к нашим оптимальным тэтам).
- Выход: наши оптимальные тета-параметры, при которых затраты минимальны.
Шаг 3. Предсказать тональность нового твита (def Predict tweet(tweet, freqs, theta)) → После того, как мы обучили нашу модель, нам не терпится узнать, можем ли мы правильно предсказать тональность нового входящего твита!
- Входные данные: новый твит, таблица частот и оптимальные тета-параметры.
- Извлеките особенности твита с помощью def extract_features()
- Предсказать с помощью новой гипотезы (сигмоидальной) функции с оптимальными тетами
- Вывод: y_pred: вероятность того, что твит будет положительным или отрицательным, в диапазоне от 0 до 1.
- Eg:
Я счастлив -> 0,518580
Я плохой -> 0,494339
этот фильм должен был быть отличным. -> 0,515331
Шаг 4. Проверьте производительность с помощью набора тестов (def test_logistic_regression (test_x, test_y, freqs, theta)) → используйте наш набор тестов для проверки производительности на невидимых данных.
- Входные данные: test_x (список тестовых твитов), test_y (вектор m*1 с соответствующими метками для списка тестовых твитов, наш частотный словарь и оптимальные тэты
- Создайте пустой массив y_hat для хранения наших прогнозов
- Пройдите тестовый твит, получите прогноз метки для твита y_pred (вероятность от 0 до 1)
- Если вероятность равна или выше 0,5, добавьте «1» к нашему массиву y_hat для положительного прогноза.
- Если вероятность ниже 0,5, добавьте «0» к нашему массиву y_hat для отрицательного прогноза.
- Рассчитайте точность модели, сравнив наши прогнозы (y_hat) с нашими test_y (настоящими метками y), подсчитав экземпляры, в которых они совпадают, и разделив на все тестовые выборки.
- Вывод: точность нашей модели.
Шаг 5. Выполните анализ ошибок
- Проверьте неправильно классифицированные твиты и определите, почему они классифицированы неправильно.
Вот и все! Спасибо ребятам из deeplearning.ai за этот замечательный урок. Увидимся на следующей неделе с НЛП и Наивным Байесом!