IIS_2023_1/gordeeva_anna_lab_3/laba3.py
2023-11-17 17:49:09 +04:00

138 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import streamlit as st
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import f1_score
# Метод для расстановки меток
def define_popularity(num_orders):
if num_orders < 100:
return 0
elif 100 <= num_orders:
return 1
# Добавление метки популярности, где 0(не популярно), 1(популярно)
on_add_pop = st.toggle("Добавить метки популярности")
if on_add_pop:
data = pd.read_csv('data222.csv', sep=',')
data['Популярность'] = None
data['Популярность'] = data['Количество заказов'].apply(define_popularity)
data.to_csv('data222.csv', index=False)
on_start = st.toggle("Создать и обучить модель классификации по популярности")
if on_start:
data = pd.read_csv('data222.csv')
size_mapping = {
'15х15': 0,
'20х14': 1,
'20х20': 2,
'21х15': 3,
'30х40': 4,
'30х60': 5,
'38х50': 6,
'40х40': 7,
'40х50': 8,
'40х60': 9
}
genre_mapping = {
"Абстракция": 0,
"Аниме": 1,
"Графити и стрит-арт": 2,
"Животные": 3,
"Историческая живопись": 4,
"Мультфильмы": 5,
"Натюрморт": 6,
"Пейзаж": 7,
"Поп-арт": 8,
"Портрет": 9,
"Религия": 10,
"Ретро и винтаж": 11,
"Спорт": 12,
"Фантастика": 13,
"Фильмы": 14,
"Эротика": 15
}
# Преобразуем данные в числовые значения
data['Жанр'] = data['Жанр'].map(genre_mapping)
data['Размер'] = data['Размер'].map(size_mapping)
X = data[['Размер', 'Жанр']]
y = data['Популярность']
# Разделяем данные на тестовую и обучающую выборку
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Создания дерева решений
model = DecisionTreeClassifier()
# Обучение модели на тестовой выборке
model.fit(X_train, y_train)
# Получение предсказаний на тестовом наборе данных
y_pred = model.predict(X_test)
# Вычисление F1-меры
f1 = f1_score(y_test, y_pred)
st.write(f"F1-мера: {f1}")
on_pred = st.toggle('')
if on_pred:
# Список с вариантами для выпадающего списка
sizes = ['15х15', '20х14', '20х20', '21х15', '30х40', '30х60', '38х50', '40х40', '40х50', '40х60']
selected_size = st.selectbox('Выберите размер:', sizes)
genres = ['Абстракция', 'Аниме', 'Графити и стрит-арт', 'Животные', 'Историческая живопись', 'Мультфильмы',
'Натюрморт', 'Пейзаж', 'Поп-арт', 'Портрет', 'Религия', 'Ретро и винтаж', 'Спорт', 'Фантастика', 'Фильмы',
'Эротика']
selected_genre = st.selectbox('Выберите жанр:', genres)
# Новая строка данных, для которой нужно сделать предсказание
new_data = pd.DataFrame({'Размер': [selected_size], 'Жанр': [selected_genre]}, index=[0])
size_mapping = {
'15х15': 0,
'20х14': 1,
'20х20': 2,
'21х15': 3,
'30х40': 4,
'30х60': 5,
'38х50': 6,
'40х40': 7,
'40х50': 8,
'40х60': 9
}
genre_mapping = {
"Абстракция": 0,
"Аниме": 1,
"Графити и стрит-арт": 2,
"Животные": 3,
"Историческая живопись": 4,
"Мультфильмы": 5,
"Натюрморт": 6,
"Пейзаж": 7,
"Поп-арт": 8,
"Портрет": 9,
"Религия": 10,
"Ретро и винтаж": 11,
"Спорт": 12,
"Фантастика": 13,
"Фильмы": 14,
"Эротика": 15
}
# Преобразование категориальных значений, если нужно
new_data['Жанр'] = new_data['Жанр'].map(genre_mapping)
new_data['Размер'] = new_data['Размер'].map(size_mapping)
# Предсказание для новой строки
prediction = model.predict(new_data)
if prediction == 0:
st.write("Предсказанная популярность: не популярно")
else:
st.write("Предсказанная популярность: популярно")