Бизнес-проблема/исследования

  • Бизнес-задача/предпосылки исследования: Точное прогнозирование качества вина является сложной задачей в винодельческой отрасли. Внедрение модели машинного обучения может повысить эффективность и точность оценки качества вина. Это позволяет компаниям принимать обоснованные решения о стратегиях производства, продаж и маркетинга.
  • Кроме того, потребители и винные профессионалы могут воспользоваться прогностической моделью, которая дает представление о качестве вина до принятия решения о покупке.
  • Таким образом, использование машинного обучения для прогнозирования качества вина повышает эффективность работы, предоставляет потребителям объективную информацию и поддерживает принятие решений в винодельческой отрасли.

Бизнес-цель

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

Бизнес-показатели

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

Набор данных

Набор данных состоит из 1599 строк и 12 столбцов. Тип данных всех переменных - float

Разбираясь в различных характеристиках вина, мы видим, что всего имеется 12 столбцов, включая окончательный параметр качества.

  • Фиксированная кислотность: нелетучие кислоты, которые плохо испаряются.
  • Летучие кислоты: высокое содержание уксусной кислоты в вине, что приводит к неприятному вкусу уксуса.
  • Лимонная кислота действует как консервант, повышая кислотность. В небольших количествах придает вину свежесть и аромат.
  • Остаточный сахар: количество сахара, оставшееся после остановки брожения. Главное, чтобы был идеальный баланс между сладостью и кислинкой. Важно отметить, что вина › 45 г/л сладкие.
  • Хлориды: количество соли в вине.
  • Свободный диоксид серы: предотвращает рост микробов и окисление вина.
  • Общее количество диоксида серы: количество свободных и связанных форм SO2.
  • Плотность: более сладкие вина имеют более высокую плотность.
  • pH: описывает уровень кислотности по шкале от 0 до 14. Большинство вин всегда находятся в пределах 3–4 по шкале pH.
  • Алкоголь: доступный в небольших количествах в винах, делает пьющих общительными.
  • Сульфаты: добавка к вину, которая способствует повышению уровня SO2 и действует как антимикробное и антиоксидантное средство.
  • Качество: выходная переменная/предиктор.

Исследовательский анализ данных

1. Проверка нулевых или отсутствующих значений

#Check null or missing value
df.isnull().sum()

output :
fixed acidity           0
volatile acidity        0
citric acid             0
residual sugar          0
chlorides               0
free sulfur dioxide     0
total sulfur dioxide    0
density                 0
pH                      0
sulphates               0
alcohol                 0
quality                 0
dtype: int64

Похоже, что нет пропущенных значений. Это означает, что набор данных может быть обработан.

2. Визуализация данных

  • Распределение переменной целевого качества

  • Визуализируйте содержание корреляции в красном вине

Рисунок выше: аналитика

  • Алкоголь положительно коррелирует с качеством красного вина.
  • Алкоголь имеет слабую положительную корреляцию со значением рН.
  • Лимонная кислота и плотность имеют сильную положительную корреляцию с фиксированной кислотностью.
  • pH имеет отрицательную корреляцию с плотностью, фиксированной кислотностью, лимонной кислотой и сульфатами.

Предварительная обработка данных

1. Масштабирование функций

Масштабируйте набор данных по качеству

Прочитав описание набора данных качества красного вина, мы находим:

  • качество ›= 7 – «хорошее»
  • качество ‹= 7 — «плохое»
df['quality'] = df['quality'].apply(lambda x: 1 if x >= 7 else 0)
sns.countplot(data = df, x = 'quality')
plt.xticks([0,1], ['bad wine','good wine'])
plt.title("Types of Wine")
plt.show()

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

2. Повторная выборка набора данных

  • для искаженного или несбалансированного набора данных мы можем выполнить повторную выборку, используя метод передискретизации синтетического меньшинства для балансировки данных.
#parameter for requires seed
random_value = 1000
X = df[['fixed_acidity', 'volatile_acidity', 'sulphates', 'alcohol', 'density']]
y = df.quality
oversample = SMOTE()
X_ros, y_ros = oversample.fit_resample(X, y)
sns.countplot(x=y_ros)
plt.xticks([0,1], ['bad wine','good wine'])
plt.title("Types of Wine")
plt.show()

3. Разделить набор данных на поезд и тест

# split dataset to train and test variable 
# use test size of 20% of the data proportion
X_train, X_test, y_train, y_test = train_test_split(X_ros, y_ros, test_size=0.2, random_state=random_value)
X_train.shape, X_test.shape

output:
((2211, 11), (553, 11))

4. Масштабируйте набор данных с помощью StandardScaler

# scale with StandardScaler
scaler = StandardScaler()

# fit to data training
scaler.fit(X_train)

# transform
x_train = scaler.transform(X_train)
x_test = scaler.transform(X_test)

Модель обучения

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

Случайный лес

# Random Forest Regression initialization
rfc = RandomForestClassifier(n_estimators=100, random_state=random_value)
# Cross Validation
rf_score = cross_val_score(estimator = rfc,
                               X = x_train, y= y_train,
                               scoring = 'recall',cv = 10,
                               verbose = 3, n_jobs=-1)
# Fit data training
rfc.fit(x_train, y_train)
# Predict data test
y_pred = rfc.predict(x_test)
print('Avarage Recall score', np.mean(rf_score))
print('Test Recall score', recall_score(y_test, y_pred))
output :
[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=-1)]: Done   3 out of  10 | elapsed:    0.8s remaining:    1.9s
[Parallel(n_jobs=-1)]: Done   7 out of  10 | elapsed:    0.8s remaining:    0.3s
[Parallel(n_jobs=-1)]: Done  10 out of  10 | elapsed:    1.3s finished
Avarage Recall score 0.9638738738738739
Test Recall score 0.9708029197080292
  • Основываясь на аналогичных результатах, полученных из оценок, можно сделать вывод, что производительность модели хорошая при прогнозировании целевой переменной.
# Confusion Matrix
conf_mat = confusion_matrix(y_test, y_pred)
# Heatmap Confusion Matrix
sns.heatmap(conf_mat, cmap = 'Reds', annot = True, fmt='.1f')
plt.title('Confusion Matrix dari Prediksi Random Forest')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

Предсказание модели:

  • Наша модель правильно предсказала «0» 253 раза, а неверно предсказала «0» 26 раз.
  • Также он неправильно предсказал «1» 8 раз, а правильно предсказал «1» 266 раз.

Настройка гиперпараметров

# Grid parameters
rf_grid = {
                'n_estimators': [50, 100, 200],
                'max_depth': [3, 5, 10],
                'min_samples_split': [2, 5, 10]
                }
                
# Use RandomizedSearchCV
rf_cv = RandomizedSearchCV(estimator=rfc, param_distributions=rf_grid,
                            scoring='recall', cv=10)
# Fit to model
rf_cv.fit(X_train, y_train)
# Best Score
print(f'Best score: {rf_cv.best_score_}')
print(f'Best params: {rf_cv.best_params_}')
output :
Best score: 0.9701801801801802
Best params: {'n_estimators': 100, 'min_samples_split': 5, 'max_depth': 10}

Сравнить балл

# Random Forest Regression initialization
rf_tuned = RandomForestClassifier(**rf_cv.best_params_, random_state=random_value)
# Cross Validation
rf_tuned_score = cross_val_score(estimator = rf_tuned,
                               X = x_train, y= y_train,
                               scoring = 'recall',cv = 10,
                               verbose = 0)
# Fit data training
rf_tuned.fit(x_train, y_train)
# Predict data test
y_pred_tuned = rf_tuned.predict(x_test)
# Cek Score
print('Avarage Recall score', np.mean(rf_score))
print('Test Recall score', recall_score(y_test, y_pred))
print('Avarage Recall score Tuning', np.mean(rf_tuned_score))
print('Test Recall score Tuning', recall_score(y_test, y_pred_tuned))
output :
Avarage Recall score 0.9638738738738739
Test Recall score 0.9708029197080292
Avarage Recall score Tuning 0.9701801801801802
Test Recall score Tuning 0.9708029197080292
# Save Random Forest model
model_name = 'rf_model.pkl'
model_path = '../src/Model/{}'.format(model_name)
# Save the trained model
with open(model_path, 'wb') as f:
pickle.dump(rf_tuned, f)
print('Model saved as {}'.format(model_name))
  • Судя по полученным результатам, производительность немного улучшилась.

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

Демо в приложении Postman & Live

Вот обновленное руководство по развертыванию модели прогнозирования качества вина с использованием FastAPI, Docker, Streamlit, EC2 и ее тестированию с помощью Postman:

  1. Настройте экземпляр EC2: создайте и настройте экземпляр EC2 на AWS для размещения своего приложения. Убедитесь, что у вас настроены необходимые разрешения и группы безопасности.
  2. Установите Docker на экземпляр EC2: следуйте инструкциям по установке Docker, чтобы настроить Docker на экземпляре EC2.
  3. Контейнеризируйте модель с помощью FastAPI и Streamlit: создайте образ Docker, включающий как приложение FastAPI, так и интерфейс Streamlit. Используйте Dockerfile, чтобы указать зависимости и конфигурацию для вашего приложения.
  4. Запустите контейнер Docker. Запустите контейнер Docker в экземпляре EC2, предоставив соответствующие порты для связи. Убедитесь, что приложение FastAPI и интерфейс Streamlit правильно работают в контейнере.
  5. Протестируйте приложение с помощью Postman: используйте Postman для отправки HTTP-запросов на конечные точки FastAPI в экземпляре EC2. Введите желаемые значения параметров вина и наблюдайте за реакцией с прогнозируемым выходным качеством вина.
  6. Доступ к интерфейсу Streamlit. Получите доступ к интерфейсу Streamlit, открыв соответствующий порт на инстансе EC2 в веб-браузере. Убедитесь, что вы можете взаимодействовать с интерфейсом и вводить параметры вина для просмотра прогнозируемого качества вина.
  7. Выполнив эти действия, вы сможете развернуть модель прогнозирования качества вина с помощью FastAPI и Streamlit в контейнере Docker на экземпляре EC2. Затем вы можете использовать Postman для тестирования конечных точек FastAPI и взаимодействия с интерфейсом Streamlit. Эта настройка позволяет нескольким пользователям получать доступ к API и интерфейсу, предоставляя прогнозы и удобный способ ввода параметров вина и просмотра прогнозируемого качества.

Не забудьте принять меры безопасности, такие как защита ваших конечных точек, управление контролем доступа и использование HTTPS при раскрытии API.

Вот пример тестирования API с помощью Postman с методом «predict».

Живое приложение машинного обучения развернуто на AWS EC2. Вы можете получить к нему доступ, используя предоставленный URL-адрес: URL:http://54.255.220.105:8501. Не стесняйтесь использовать и делиться им с друзьями.

Заключение и будущие работы

  1. Мы можем построить довольно хорошую модель с довольно высокой точностью.
  2. Из-за ограниченного времени мне удалось выполнить сквозное машинное обучение только с использованием случайного леса, необходимо сделать аналогичные реализации, сравнить все возможные модели регрессии и проанализировать лучшую производительность между ними.
  3. Получите больше данных для тестирования, чтобы наша модель могла учиться и создавать более точные прогнозы.
  4. Сделайте PCA, уменьшите количество функций данных и упростите процесс в нашей модели.
  5. Если у вас есть время, создайте автоматизацию на GitHub с помощью GitHub Actions, чтобы было удобнее.

Набор данных:



Исходный код на GitHub: https://github.com/ariprachmaan/winepredict.git