Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
8
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

82      Глава 3. Библиотеки Python для data science

groupby() возвращает объект GroupBy, который поддерживает несколько статистических функций. В этом конкретном примере мы используем mean() для расчета средней общей суммы для группы заказов конкретного сотрудника. Для этого группируем строки из датафрейма orders по столбцу Empno, а затем применяем операцию mean() к столбцу Total. Созданный набор данных представляет собой объект Series:

Empno

9001 69.666667

9002 156.500000

Name: Total, dtype: float64

Теперь предположим, что требуется узнать сумму всех заказов для каждой группы (сотрудника). Здесь пригодится функция sum() объекта GroupBy:

print(orders.groupby(['Empno'])['Total'].sum())

Мы получим объект Series со следующими данными:

Empno

 

9001

209

9002

313

Name: Total, dtype: int64

ПРИМЕЧАНИЕ

Чтобы узнать больше о функциях, поддерживаемых объектом GroupBy, см. документацию по API pandas1.

scikit-learn

scikit-learn — это библиотека Python, разработанная для приложений машинного обучения. Наряду с NumPy и pandas, это базовый компонент экосистемы Python для data science. scikit-learn предоставляет эффективные, простые в использовании инструменты, которые можно применять для решения общих задач машинного обучения, включая исследовательский и предиктивный анализ данных. В конце книги мы более подробно рассмотрим машинное обучение. А в этом разделе просто ознакомимся с тем, как можно применять Python в машинном обучении, особенно для предиктивного анализа данных.

1 https://pandas.pydata.org/pandas-docs/stable/reference/groupby.html

scikit-learn      83

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

ирегрессия используют уже имеющиеся данные для составления прогнозов относительно новых данных, но в процессе классификации данные сортируются по дискретным категориям, в то время как результатом регрессии служит непрерывный диапазон числовых значений. В этом разделе мы рассмотрим пример классификации, реализованной с помощью scikit-learn. Мы создадим прогностическую модель, анализирующую отзывы покупателей о продукции

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

Установка scikit-learn

Как NumPy и pandas, scikit-learn — сторонняя библиотека Python. Установить ее можно командой:

$ pip install sklearn

Библиотека scikit-learn имеет множество подмодулей с собственной функциональностью. Поэтому обычно импортируется не весь модуль, а только подмодуль, необходимый для конкретной задачи (скажем, sklearn.model_selection).

Получение набора образцов

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

Существует несколько онлайн-ресурсов с размеченными наборами данных. Один из лучших — Machine Learning Repository Калифорнийского университета UC Irvine1. Выполните поиск в репозитории по запросу «customer product reviews», и вы найдете ссылку на датасет Sentiment Labelled Sentences (или про-

1 https://archive.ics.uci.edu/ml/index.php

84      Глава 3. Библиотеки Python для data science

сто вставьте в адресной строке браузера ссылку1). Скачайте и распакуйте файл sentiment labelled sentences.zip с веб-страницы датасета.

ПРИМЕЧАНИЕ

Набор данных Sentiment Labelled Sentences был создан для статьи Димитриоса Котзиасаидр.(DimitriosKotziasetal.)«Отгрупповыхметоккиндивидуальнымспо-

мощьюглубокихпризнаков»(«FromGrouptoIndividualLabelsUsingDeepFeatures»).

Архив .zip содержит отзывы с IMDb, Amazon и Yelp в трех разных файлах с расширением .txt. Отзывы маркированы по тональности: положительные или отрицательные (1 или 0 соответственно); для каждого источника представлено 500 положительных и 500 отрицательных отзывов, всего в датасете 3000 маркированных отзывов. Для простоты будем использовать только экземпляры с Amazon. Они находятся в файле amazon_cells_labelled.txt.

Преобразование загруженного датасета в pandas DataFrame

Чтобы упростить дальнейшие вычисления, необходимо преобразовать загруженный текстовый файл с отзывами в более управляемую структуру данных. Можно прочитать данные из amazon_cells_labelled.txt и преобразовать pandas DataFrame следующим образом:

import pandas as pd

df = pd.read_csv('/usr/Downloads/sentiment labelled sentences/amazon_cells_labelled.txt',

names=[ 'review', 'sentiment'], sep='\t')

Здесь мы используем метод pandas read_csv() для преобразования данных в датафрейм. Указываем два столбца: первый для хранения отзывов и второй для соответствующих оценок тональности . Поскольку в исходном файле для отделения отзывов и соответствующих оценок используется табуляция (tab), мы указываем \t в качестве разделителя .

Разделение набора данных на обучающий и тестовый

Теперь, когда мы импортировали датасет, нужно разделить его на две части: одну — для обучения прогностической модели, а другую — для проверки ее точности. В scikit-learn это можно сделать всего несколькими строками кода:

1 https://archive.ics.uci.edu/ml/datasets/Sentiment+Labelled+Sentences

scikit-learn      85

from sklearn.model_selection import train_test_split reviews = df['review'].values

sentiments = df['sentiment'].values

reviews_train, reviews_test, sentiment_train, sentiment_test = train_test_split(reviews,

sentiments, test_size=0.2,

random_state=500)

Разбиваем датасет с помощью функции train_test_split()из модуля sklearn. model_selection. Отзывы и соответствующие им оценки тональности передаются в функцию в виде массивов NumPy, полученных через свойство values соответствующих серий, извлеченных из датафрейма. Параметр test_size мы передаем, чтобы управлять тем, как именно будет разделен датасет. Значение 0.2 означает, что 20% отзывов будут случайным образом отнесены к тестовому набору. Соответственно, мы следуем схеме 80/20 — оставшиеся 80% отзывов составят обучающий набор. Параметр random_state инициализирует внутренний генератор случайных чисел. Он необходим для разбиения данных случайным образом.

Преобразование текста в числовые векторы признаков

Для обучения и тестирования модели требуется численно выразить текстовые данные. И здесь в дело вступает модель под названием мешок слов (bag of words, BoW). Эта модель представляет текст в виде набора (мешка) входящих в него слов в числовом формате. Наиболее типичной числовой характеристикой, генерируемой моделью BoW, является частота слов — сколько раз каждое слово встречается в тексте. Следующий простой пример показывает, как модель BoW преобразует текст в числовой вектор признаков на основе частоты встречаемости слов:

Text: I know it. You know it too.

BoW: { "I":1, "know":2, "it":2, "You":1, "too":1}

Vector: [1,2,2,1,1]

Для создания BoW-матрицы текстовых данных можно использовать функцию scikit-learn CountVectorizer(). Она преобразует текстовые данные в числовые векторы признаков (n-мерные векторы числовых признаков, представляющих некоторый объект) и выполняет токенизацию (разделение текста на отдельные слова и знаки препинания), используя либо стандартный, либо пользовательский токенизатор. Пользовательский токенизатор может быть реализован с помощью инструмента обработки естественного языка, такого как spaCy, из предыдущей главы. В этом примере для простоты используем вариант по умолчанию.