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)