Рубрики
Без рубрики

🤖 Возьмите свое вино. Пришло время демистифицировать ML и NLP 🍷

В этом руководстве вы узнаете, как использовать ML для прогнозирования цены, очки и разновидности вина из текстового описания. Мы обработаем текст описания вина с помощью библиотеки Scikit, научитесь создавать модульную модель логистической регрессии сумки из слов. Если это не имеет смысла, то вы находитесь в нужном месте! Если это имеет смысл продолжить чтение, потому что вино. Теги с машиной, AI, начинающим, Python.

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

Мы обработаем текст описания вина с библиотекой Scikit Учитесь Создать модульную модель логистической регрессии мешок с несколькими словами. Если это не имеет смысла, то вы находитесь в нужном месте! Если это имеет смысл продолжить чтение, потому что вино.

Настройте среду DEV ML ML

Есть два варианта: облако или местные.

Настройка Azure Cloud Setup – используйте рабочее пространство обучения Azure Machine с интегрированным облачным видеотетрами. Рабочая область дает вам много функциональности, и я очень рекомендую это.

  1. Создать бесплатный Azure Account Если у вас уже нет одного.
  2. Следуйте за Создать рабочее пространство Учебное пособие через «Создать ноутбук VM» шаг
  3. Нажмите «Jupyter Lab» из ноутбука VM навигации
  4. Затем запустите команду ниже в терминале, чтобы клонировать ноутбук из GitHub.
#CTRL+SHIFT+V to paste
curl https://raw.githubusercontent.com/cassieview/intro-nlp-wine-reviews/master/winereview-nlp.ipynb --output winereview-nlp.ipynb

Местная настройка

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

Импортировать пакеты и данные

Если вы получите ошибку «No модуль с именем» Установите его с помощью команды Действительно PIP Установить WordCloud Отказ Заменить WordCloud С именем модуля в сообщении об ошибке.

#This package need to be installed first
!pip install wordcloud
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import math
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_recall_curve
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer
from joblib import dump, load

Нам нужны данные! Я использовал набор данных, который я нашел на Kaggle. Kaggle – это онлайн-сообщество ученых данных. Загрузите набор данных из GitHub Repo или Kaggle.

Импортируйте данные как Пандас Dataframe.

#File path to the csv file
csv_file = "https://raw.githubusercontent.com/cassieview/intro-nlp-wine-reviews/master/dataset/winemag-review.csv"

# Read csv file into dataframe
df = pd.read_csv(csv_file)

# Print first 5 rows in the dataframe
df.head()

Визуализируйте данные

Как только у нас есть данные, то время его проанализировать и сделать некоторые Выбор функций и инжиниринг Отказ Мы визуализируем наши данные, используя Морной Отказ Это позволит нам посмотреть, существует ли сильная корреляция между различными точками данных и помогает нам ответить на вопросы о наших данных. Поскольку наш начальный вопрос оказался вокруг прогнозирования Цена , очки или разнообразие от описание Мы уже знаем, что наша особенность будет описание И наша этикетка будет цена , очки или разнообразие Отказ Особенности – это данные, которые мы используем для прогнозов, и этикетки – это то, что мы предсказываем. Каждая этикетка будет отдельной моделью, поэтому в целом будет три моделя, если вы решите построить все три прогнозных моделя.

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

Есть ли корреляция между ценой и точками?

sns.barplot(x = 'points', y = 'price', data = df)
sns.boxplot(x = 'points', y = 'price', data = df)

Один винный критик дает более высокие рейтинги, чем другие?

sns.catplot(x = 'points', y = 'taster_name', data = df)

Давайте посмотрим на WordCloud из описание Текст

from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
text = df.description.values
wordcloud = WordCloud(
    width = 3000,
    height = 2000,
    background_color = 'black',
    stopwords = STOPWORDS).generate(str(text))
fig = plt.figure(
    figsize = (40, 30),
    facecolor = 'k',
    edgecolor = 'k')
plt.imshow(wordcloud, interpolation = 'bilinear')
plt.axis('off')
plt.tight_layout(pad=0)
plt.show()

Мне нравится думать об этом облачном словам, как чит-лист описательных слов, используемых при дегустике вина, чтобы сделать себя звучать как винный эксперт 😃

Какие еще вопросы вы могли бы задать и ответить на графику этих данных?

Создать расчетные колонны для меток

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

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

def getQuality(points):
    if(points <= 85):
        return 'bad'
    elif(points<=90 ):
        return 'ok'
    elif(points<=95):
        return 'good'
    elif(points<=100):
        return 'great'
    else:
        return 'If this gets hit, we did something wrong!'

Далее примените функцию в столбец точек данных DataFrame и добавьте новый столбец с именем Качество Отказ

df['quality'] = df['points'].apply(getQuality)

Визуализируйте новый столбец против ценовой колонны, как мы сделали выше.

sns.catplot(x = 'quality', y = 'price', data = df)
sns.barplot(x = 'quality', y = 'price', data = df)

Создать столбец PricEnange из ценовой колонны 1-30 , 31-50 , 51-100 , Выше 100 и 0 Для колонн с нан. Ниже приведена функция для возврата PRICENANGE String на основе цен цены.

def getPriceRange(price):
    if(price <= 30):
        return '1-30'
    elif(price<=50):
        return '31-50'
    elif(price<=100): 
        return '51-100'
    elif(math.isnan(price)):
        return '0'
    else:
        return 'Above 100'

Примените функцию в столбца точек данных DataFrame и добавьте новый столбец с именем PRICERANGE Отказ

df['priceRange'] = df['price'].apply(getPriceRange)

Распечатать итоги для каждого PRICENANGE, назначенного, чтобы увидеть, как распределены этикетки

df.groupby(df['priceRange']).size()
Output: priceRange
        0             8996
        1-30         73455
        31-50        27746
        51-100       16408
        Above 100     3366
        dtype: int64

Теперь у нас есть наши этикетки для моделей для прогнозирования качества, PRICENANGE и сорта винограда.

Описание процесса Текст с библиотекой Scikit Научитесь создавать мешок слова с использованием функции CountVectorizer.

Документы делают большую работу по объяснению CountVectorizer. Я рекомендую прочитать через них, чтобы получить полное понимание того, что происходит, однако я пойду на некоторые основы здесь.

На высоком уровне CountVectorizer принимает текст описания, удаляя стоп-слова (например, «« »,« А »,« Ан »,« в »), создавая токеризацию слов, а затем создание вектора номеров это представляет описание. Описание текста теперь представлено как цифры только с словами, о которых мы заботимся и можем обрабатываться компьютером для обучения модели. Помните, что компьютер понимает номера и слова могут быть представлены в виде номеров, поэтому компьютер может «понять».

Это пример того, как слова становятся цифрами. Мы пройдемся более подробно с примером с набора данных.

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

  • Стопвордам: Стопное слово может быть словом со значением на конкретном языке. Например, на английском языке, такие слова, как «A», «и,« », есть,« и », оставлены из полнотекстового индекса, поскольку они, как известно, бесполезны на поиски. Стопное слово также может быть токеном, который не имеет языкового значения.
  • N-грамм : Схема извлечения функций для текстовых данных: любая последовательность n слов превращается в значение объекта.

  • Лемматизация : преобразует множество связанных слов с одной канонической формой («фруктовый», «фруктовость» и «фрукты» все станут «фруктовыми»)

  • Stemming: похож на лемматизацию, но немного более агрессивную и может оставить слова фрагментированными.

Давайте посмотрим, как использовать CountVectorizer.

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

CountVectorizer( 
  input='content', encoding='utf-8', decode_error='strict', 
  strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, 
  stop_words=None, token_pattern='(?u)\b\w\w+\b', ngram_range=(1, 1), 
  analyzer='word', max_df=1.0, min_df=1, max_features=None, 
  vocabulary=None, binary=False, dtype=
)

Создайте функцию, чтобы получить вектор и вектора из Описание характерная черта.

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

def get_vector_feature_matrix(description):
    vectorizer = CountVectorizer(lowercase=True, stop_words="english", max_features=5)
    #vectorizer = CountVectorizer(lowercase=True, stop_words="english")
    #vectorizer = CountVectorizer(lowercase=True, stop_words="english",ngram_range=(1, 2), max_features=20)

    #vectorizer = CountVectorizer(lowercase=True, stop_words="english", tokenizer=stemming_tokenizer) 
    vector = vectorizer.fit_transform(np.array(description))
    return vector, vectorizer

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

vectorizer = CountVectorizer(lowercase=True, stop_words="english", max_features=5)
#Optional: remove any rows with NaN values. 
#df = df.dropna()

Далее Давайте позвоним нашу функцию и пропустите столбец описания из DataFrame.

Это возвращает Вектор и вектор Отказ вектор Это то, что мы относимся к нашему тексту для создания числа Вектор Представление нашего текста, так что модель обучения машины может научиться.

vector, vectorizer = get_vector_feature_matrix(df['description'])

Если мы распечатаем вектора, мы сможем увидеть текущие параметры по умолчанию для него.

print(vectorizer)
Output: CountVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=5, min_df=1,
        ngram_range=(1, 1), preprocessor=None, stop_words='english',
        strip_accents=None, token_pattern='(?u)\\b\\w\\w+\\b',
        tokenizer=None, vocabulary=None)

Изучите наши переменные и данные, чтобы понять, что здесь происходит.

print(vectorizer.get_feature_names())
Output: ['aromas', 'flavors', 'fruit', 'palate', 'wine']

Здесь мы получаем особенности вектора. Потому что мы сказали CountVectorizer иметь max_feature Он построит словарный запас, который рассматривает только верхние функции, заказываемые терминой частотой через корпус. Это означает, что наше Описание векторы бы ?|. Только Включите эти слова, когда они токенизированы, все остальные слова будут игнорироваться.

Распечатайте наш первый Описание и сначала Вектор чтобы увидеть это представлено.

print(vector.toarray()[0])
Output: [1 0 1 1 0]
df['description'].iloc[0]
Output: "_Aromas_ include tropical _fruit_, broom, brimstone and dried herb. The _palate_ isn't overly expressive, offering unripened apple, citrus and dried sage alongside brisk acidity."

Векторный массив ( [1 0 1 1 0] ), представляющий функции векторизации ( [«ароматы», «ароматы», «фрукты», «небо», «вино»] ) в первом Описание в корпусе. 1 Указывает, что его нынешние и 0 указывает, что нет в порядке функций векторизации.

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

Обучать модель

Обновите функцию, так что используется вторая конфигурация вектора.

def get_vector_feature_matrix(description):
    #vectorizer = CountVectorizer(lowercase=True, stop_words="english", max_features=5)
    vectorizer = CountVectorizer(lowercase=True, stop_words="english", max_features=1000)
    #vectorizer = CountVectorizer(lowercase=True, stop_words="english",ngram_range=(1, 2), max_features=1000)
    #vectorizer = CountVectorizer(lowercase=True, stop_words="english", tokenizer=stemming_tokenizer) 
    vector = vectorizer.fit_transform(np.array(description))
    return vector, vectorizer

И позвоните в функцию, чтобы обновить вектора

vector, vectorizer = get_vector_feature_matrix(df['description'])

Теперь создайте нашу функцию матрицы. Если вы получите ModelError здесь, уменьшите Max_Features в CountVectorizer.

features = vector.todense()

У нас есть три разных ярлыка для трех разных моделей. Давайте присваиваем переменную метки следую и использовать Качество ярлык сначала.

label = df['quality'] 
#label = df['priceRange']
#label = df['variety']

У нас есть функции и переменные маркировки. Далее нам нужно разделить данные на тренировку и тестирование.

Мы собираемся использовать 80% на тренировку и 20% для тестирования. Это позволит нам получить оценку точности от обучения, чтобы увидеть, как работает модель.

X, y = features, label
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Обучить модель, используя Логистикарессия алгоритм и распечатать точность.

lr = LogisticRegression(multi_class='ovr',solver='lbfgs')
model = lr.fit(X_train, y_train)

accuracy = model.score(X_test, y_test)
print ("Accuracy is {}".format(accuracy))
Output: "Accuracy is 0.7404885554914407"

Это нормальная точность Но я уверен, что это может быть улучшено! Для этого учебника мы будем называть это «достаточно хорошо», которое является решением, которое необходимо сделать с каждой моделью, которую вы когда-либо создаете!

Проверить модель

Когда вы выбираете модель кандидата, она всегда должна быть проверена на невидимых данных. Если модель это переодолен К его данным он будет работать на самом деле будет на собственных данных и плохо на новые данные. Вот почему его очень важно тестировать на невидимые данные.

Я схватил этот отзыв с сайте Wine Mag. Его 95 балл и $ 60 бутылка вина обзора.

test = "This comes from the producer's coolest estate near the town of Freestone. White pepper jumps from the glass alongside accents of lavender, rose and spice. Compelling in every way, it offers juicy raspberry fruit that's focused, pure and undeniably delicious."


x = vectorizer.transform(np.array([test]))
proba = model.predict_proba(x)
classes = model.classes_
resultdf = pd.DataFrame(data=proba, columns=classes)
resultdf

Еще один способ посмотреть на результат – это транспонировать, сортировать, а затем распечатать голову, приводящую к списку 5 лучших прогнозов.

topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
topPrediction.head()

Другие вещи, чтобы попробовать

  1. Измените метку и запускайте снова для прогнозирования ведра цен или сорт винограда.
  2. Попробуйте использовать разные алгоритмы, чтобы увидеть, если вы можете получить лучший результат
  3. Добавьте дополнительные функции в текст описания для повышения точности. Была сильная корреляция между ценой и очками. Возможно, добавление тех, кто улучшит счет точности?
  4. Добавьте лемматизацию к тексту для улучшения оценки, используя NLTK.
  5. Попробуйте выполнить текстовую классификацию на другом наборе данных.

Наука данных – это процесс проб и ошибок. Я уверен, что есть способы улучшить эту модель и точность. Играйте и посмотрите, можете ли вы получить лучший результат!

Другие полезные ссылки

Машинное обучение алгоритм чит лист

Как выбрать алгоритмы для студии обучения Azure Machine

Полный GitHub Repo.

Оригинал: “https://dev.to/azure/grab-your-wine-it-s-time-to-demystify-ml-and-nlp-47f7”