Бизнес-проблема/исследования
- Бизнес-задача/предпосылки исследования: Точное прогнозирование качества вина является сложной задачей в винодельческой отрасли. Внедрение модели машинного обучения может повысить эффективность и точность оценки качества вина. Это позволяет компаниям принимать обоснованные решения о стратегиях производства, продаж и маркетинга.
- Кроме того, потребители и винные профессионалы могут воспользоваться прогностической моделью, которая дает представление о качестве вина до принятия решения о покупке.
- Таким образом, использование машинного обучения для прогнозирования качества вина повышает эффективность работы, предоставляет потребителям объективную информацию и поддерживает принятие решений в винодельческой отрасли.
Бизнес-цель
- Предскажите, хорошего или плохого качества вино, основываясь на таких факторах, как химический состав и другие соответствующие атрибуты. Эта цель направлена на обеспечение объективной оценки качества вина, которая помогает заинтересованным сторонам различать вина, соответствующие высоким стандартам качества, и те, которые не соответствуют ожиданиям.
Бизнес-показатели
- Измерьте точность и согласованность прогнозов модели для разных вин. Этот показатель указывает на надежность модели при последовательной оценке качества вина и может помочь обеспечить правильную классификацию вин.
Набор данных
Набор данных состоит из 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:
- Настройте экземпляр EC2: создайте и настройте экземпляр EC2 на AWS для размещения своего приложения. Убедитесь, что у вас настроены необходимые разрешения и группы безопасности.
- Установите Docker на экземпляр EC2: следуйте инструкциям по установке Docker, чтобы настроить Docker на экземпляре EC2.
- Контейнеризируйте модель с помощью FastAPI и Streamlit: создайте образ Docker, включающий как приложение FastAPI, так и интерфейс Streamlit. Используйте Dockerfile, чтобы указать зависимости и конфигурацию для вашего приложения.
- Запустите контейнер Docker. Запустите контейнер Docker в экземпляре EC2, предоставив соответствующие порты для связи. Убедитесь, что приложение FastAPI и интерфейс Streamlit правильно работают в контейнере.
- Протестируйте приложение с помощью Postman: используйте Postman для отправки HTTP-запросов на конечные точки FastAPI в экземпляре EC2. Введите желаемые значения параметров вина и наблюдайте за реакцией с прогнозируемым выходным качеством вина.
- Доступ к интерфейсу Streamlit. Получите доступ к интерфейсу Streamlit, открыв соответствующий порт на инстансе EC2 в веб-браузере. Убедитесь, что вы можете взаимодействовать с интерфейсом и вводить параметры вина для просмотра прогнозируемого качества вина.
- Выполнив эти действия, вы сможете развернуть модель прогнозирования качества вина с помощью FastAPI и Streamlit в контейнере Docker на экземпляре EC2. Затем вы можете использовать Postman для тестирования конечных точек FastAPI и взаимодействия с интерфейсом Streamlit. Эта настройка позволяет нескольким пользователям получать доступ к API и интерфейсу, предоставляя прогнозы и удобный способ ввода параметров вина и просмотра прогнозируемого качества.
Не забудьте принять меры безопасности, такие как защита ваших конечных точек, управление контролем доступа и использование HTTPS при раскрытии API.
Вот пример тестирования API с помощью Postman с методом «predict».
Живое приложение машинного обучения развернуто на AWS EC2. Вы можете получить к нему доступ, используя предоставленный URL-адрес: URL:http://54.255.220.105:8501. Не стесняйтесь использовать и делиться им с друзьями.
Заключение и будущие работы
- Мы можем построить довольно хорошую модель с довольно высокой точностью.
- Из-за ограниченного времени мне удалось выполнить сквозное машинное обучение только с использованием случайного леса, необходимо сделать аналогичные реализации, сравнить все возможные модели регрессии и проанализировать лучшую производительность между ними.
- Получите больше данных для тестирования, чтобы наша модель могла учиться и создавать более точные прогнозы.
- Сделайте PCA, уменьшите количество функций данных и упростите процесс в нашей модели.
- Если у вас есть время, создайте автоматизацию на GitHub с помощью GitHub Actions, чтобы было удобнее.
Набор данных:
Исходный код на GitHub: https://github.com/ariprachmaan/winepredict.git