IIS_2023_1/gordeeva_anna_lab_6/laba6.py
Meowweasy 915ec905c6 itog
2024-01-09 16:02:55 +04:00

75 lines
3.6 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 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)