diff --git a/gordeeva_anna_lab_6/1aIk7s_b66s.jpg b/gordeeva_anna_lab_6/1aIk7s_b66s.jpg new file mode 100644 index 0000000..fa96873 Binary files /dev/null and b/gordeeva_anna_lab_6/1aIk7s_b66s.jpg differ diff --git a/gordeeva_anna_lab_6/README.md b/gordeeva_anna_lab_6/README.md new file mode 100644 index 0000000..2e0e5f5 --- /dev/null +++ b/gordeeva_anna_lab_6/README.md @@ -0,0 +1,23 @@ +## Данные +Я использую следующие данные: +* Ссылка на изображение картины +* Размер картины в см +* Средняя оценка по отзывам +* Количество заказов +* Стоимость +Чтобы сделать анализ конкретнее были добавлены вручную следующие +данные: +* Жанр (Например: пейзаж, животные, портрет и т.д) +* Поджанр (Например: городской пейзаж, коты, собаки и т.д) + +## Задание и решение классификации (нейронная сеть) +Необходимо посоветовать/предсказать пользователю поджанр на основе выбранного +жанра и категории стоимости. Нет необходимости разбивать на группы, так как сам +параметр является категориальным. Для выполнения классификации все категориальные +параметры переводим в числа. Точность модель не превышает 0.30, что можно сказать, +что модель не удачная. На это влияет то, что в данные достаточно много классов, что +делает модель сложнее. Результат предсказания представлен на рисунке 5 и 6 + +## Результат +![Alt text](cAofDwrO6o4.jpg "Optional Title") +![Alt text](1aIk7s_b66s.jpg "Optional Title") diff --git a/gordeeva_anna_lab_6/cAofDwrO6o4.jpg b/gordeeva_anna_lab_6/cAofDwrO6o4.jpg new file mode 100644 index 0000000..0a792eb Binary files /dev/null and b/gordeeva_anna_lab_6/cAofDwrO6o4.jpg differ diff --git a/gordeeva_anna_lab_6/laba6.py b/gordeeva_anna_lab_6/laba6.py new file mode 100644 index 0000000..273db93 --- /dev/null +++ b/gordeeva_anna_lab_6/laba6.py @@ -0,0 +1,74 @@ +import pandas as pd +import streamlit as st +import statsmodels.api as sm +from sklearn.neural_network import MLPClassifier +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.metrics import accuracy_score +import numpy as np + +data = pd.read_csv('222.csv') + +genre_mapping = {genre: code for code, genre in enumerate(data['Жанр'].unique())} +subgenre_mapping = {subgenre: code for code, subgenre in enumerate(data['Поджанр'].unique())} +price_mapping = {price: code for code, price in enumerate(data['Категория стоимости'].unique())} + +# Преобразование категориальных значений +data['Жанр'] = data['Жанр'].map(genre_mapping) +data['Поджанр'] = data['Поджанр'].map(subgenre_mapping) +data['Категория стоимости'] = data['Категория стоимости'].map(price_mapping) + +columns_to_check = ['Размер', 'Жанр', 'Поджанр', 'Категория стоимости'] +data = data.dropna(subset=columns_to_check) + +# Разделение данных на признаки (X) и целевую переменную (y) +X = data[['Жанр', 'Категория стоимости']] +y = data['Поджанр'] + +# Разделение на обучающий и тестовый наборы +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) + +# Нормализация данных +scaler = StandardScaler() +X_train = scaler.fit_transform(X_train) +X_test = scaler.transform(X_test) + +# Инициализация MLPClassifier +clf = MLPClassifier(hidden_layer_sizes=(100, 50), max_iter=500, alpha=0.1, solver='adam', random_state=42) + +# Обучение модели +clf.fit(X_train, y_train) + +# Предсказание на тестовом наборе +predictions = clf.predict(X_test) + +# Оценка точности модели +accuracy = accuracy_score(y_test, predictions) +st.write(f"Точность модели: {accuracy}") + +on_pred = st.toggle('') +if on_pred: + selected_genre = st.selectbox('Выберите жанр:', genre_mapping) + selected_price = st.selectbox('Выберите категорию стоимости:', price_mapping) + + new_data = pd.DataFrame({'Жанр': [selected_genre], 'Категория стоимости': [selected_price]}, index=[0]) + + new_data['Жанр'] = new_data['Жанр'].map(genre_mapping) + new_data['Категория стоимости'] = new_data['Категория стоимости'].map(price_mapping) + + new_data_normalized = scaler.transform(new_data.values) + new_predictions = clf.predict(new_data_normalized) + + # Создание обратного словаря для обратного маппинга числовых кодов поджанров в текстовые метки + reverse_subgenre_mapping = {code: subgenre for subgenre, code in subgenre_mapping.items()} + + # Преобразование числовых предсказаний обратно в текстовые метки поджанров + predicted_subgenres = [reverse_subgenre_mapping[code] for code in new_predictions] + + # Вывод предсказанных поджанров для новых данных + st.write("Предсказанный поджанр:") + for subgenre in predicted_subgenres: + if isinstance(subgenre, float) and np.isnan(subgenre): + st.write("Не удалось предсказать, мало данных по данному жанру") + else: + st.write(subgenre)