Merge pull request 'gordeeva_anna_lab_6' (#291) from gordeeva_anna_lab_6 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/291
This commit is contained in:
commit
1cd312ba98
BIN
gordeeva_anna_lab_6/1aIk7s_b66s.jpg
Normal file
BIN
gordeeva_anna_lab_6/1aIk7s_b66s.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
23
gordeeva_anna_lab_6/README.md
Normal file
23
gordeeva_anna_lab_6/README.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
## Данные
|
||||||
|
Я использую следующие данные:
|
||||||
|
* Ссылка на изображение картины
|
||||||
|
* Размер картины в см
|
||||||
|
* Средняя оценка по отзывам
|
||||||
|
* Количество заказов
|
||||||
|
* Стоимость
|
||||||
|
Чтобы сделать анализ конкретнее были добавлены вручную следующие
|
||||||
|
данные:
|
||||||
|
* Жанр (Например: пейзаж, животные, портрет и т.д)
|
||||||
|
* Поджанр (Например: городской пейзаж, коты, собаки и т.д)
|
||||||
|
|
||||||
|
## Задание и решение классификации (нейронная сеть)
|
||||||
|
Необходимо посоветовать/предсказать пользователю поджанр на основе выбранного
|
||||||
|
жанра и категории стоимости. Нет необходимости разбивать на группы, так как сам
|
||||||
|
параметр является категориальным. Для выполнения классификации все категориальные
|
||||||
|
параметры переводим в числа. Точность модель не превышает 0.30, что можно сказать,
|
||||||
|
что модель не удачная. На это влияет то, что в данные достаточно много классов, что
|
||||||
|
делает модель сложнее. Результат предсказания представлен на рисунке 5 и 6
|
||||||
|
|
||||||
|
## Результат
|
||||||
|
![Alt text](cAofDwrO6o4.jpg "Optional Title")
|
||||||
|
![Alt text](1aIk7s_b66s.jpg "Optional Title")
|
BIN
gordeeva_anna_lab_6/cAofDwrO6o4.jpg
Normal file
BIN
gordeeva_anna_lab_6/cAofDwrO6o4.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
74
gordeeva_anna_lab_6/laba6.py
Normal file
74
gordeeva_anna_lab_6/laba6.py
Normal file
@ -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)
|
Loading…
Reference in New Issue
Block a user