IIS_2023_1/gordeeva_anna_lab_6/laba6.py

75 lines
3.6 KiB
Python
Raw Normal View History

2024-01-09 16:02:55 +04:00
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)