138 lines
5.0 KiB
Python
138 lines
5.0 KiB
Python
|
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("Предсказанная популярность: популярно")
|