istyukov_timofey_lab_6 is ready #294
BIN
istyukov_timofey_lab_6/1_plot_result.png
Normal file
BIN
istyukov_timofey_lab_6/1_plot_result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 42 KiB |
BIN
istyukov_timofey_lab_6/2_dataset.jpg
Normal file
BIN
istyukov_timofey_lab_6/2_dataset.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
BIN
istyukov_timofey_lab_6/3_score.jpg
Normal file
BIN
istyukov_timofey_lab_6/3_score.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
96
istyukov_timofey_lab_6/README.md
Normal file
96
istyukov_timofey_lab_6/README.md
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
# Лабораторная работа №6. Нейронная сеть
|
||||||
|
## 12 вариант
|
||||||
|
___
|
||||||
|
|
||||||
|
### Задание:
|
||||||
|
Использовать регрессию по варианту для своих данных по варианту,
|
||||||
|
самостоятельно сформулировав задачу. Оценить, насколько хорошо она
|
||||||
|
подходит для решения сформулированной вами задачи.
|
||||||
|
|
||||||
|
### Вариант:
|
||||||
|
- Модель нейронной сети: **MLPRegressor**
|
||||||
|
|
||||||
|
### Вариант набора данных по курсовой работе:
|
||||||
|
- Прогнозирование музыкальных жанров ("Prediction of music genre")
|
||||||
|
|
||||||
|
___
|
||||||
|
|
||||||
|
### Запуск
|
||||||
|
- Запустить файл lab6.py
|
||||||
|
|
||||||
|
### Используемые технологии
|
||||||
|
- Язык программирования **Python**
|
||||||
|
- Среда разработки **PyCharm**
|
||||||
|
- Библиотеки:
|
||||||
|
* pandas
|
||||||
|
* sklearn
|
||||||
|
* matplotlib
|
||||||
|
* seaborn
|
||||||
|
|
||||||
|
### Описание программы
|
||||||
|
**Набор данных (Kaggle):** Полный список жанров, включенных в CSV:
|
||||||
|
«Электронная музыка», «Аниме», «Джаз», «Альтернатива», «Кантри», «Рэп»,
|
||||||
|
«Блюз», «Рок», «Классика», «Хип-хоп».
|
||||||
|
|
||||||
|
**Задача, решаемая нейронной сетью:**
|
||||||
|
Предсказание популярности нового музыкального трека на основе его
|
||||||
|
определённых характеристик.
|
||||||
|
|
||||||
|
**Задача оценки:**
|
||||||
|
Анализ с помощью коэффициента детерминации и потери регрессии
|
||||||
|
среднеквадратичной логарифмической ошибке, плюсом к ним график сравнения
|
||||||
|
реальных и предсказанных значений.
|
||||||
|
|
||||||
|
---
|
||||||
|
### Пример работы
|
||||||
|
|
||||||
|
*Датасет, сформированный из случайных строк csv-файла.*
|
||||||
|
|
||||||
|
![Graphics](2_dataset.jpg)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
***Коэффициент детерминации** используется для оценки эффективности модели
|
||||||
|
линейной регрессии. Он показывает, насколько хорошо наблюдаемые результаты
|
||||||
|
воспроизводятся моделью, в зависимости от соотношения суммарных отклонений
|
||||||
|
результатов, описываемых моделью. По выводу можно отметить, что 33,4%
|
||||||
|
изменчивости зависимого выходного атрибута можно объяснить с помощью модели,
|
||||||
|
в то время как остальные 66,6% изменчивости все ещё не учтены.*
|
||||||
|
|
||||||
|
***Потери регрессии среднеквадратичной логарифмической ошибки (MSLE)** использует
|
||||||
|
тот же подход, что и **MSE**, но использует логарифм для компенсации больших
|
||||||
|
выбросов в наборе данных и обрабатывает их так, как если бы они были в одном
|
||||||
|
масштабе. Это наиболее ценно в стремлении к сбалансированной модели с
|
||||||
|
одинаковым процентом ошибок.*
|
||||||
|
|
||||||
|
![Graphics](3_score.jpg)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*График нейронной сети MLPRegressor, показывающий сравнение реальных
|
||||||
|
(ось абсцисс) и предсказанных (ось ординат) данных.*
|
||||||
|
|
||||||
|
![Graphics](1_plot_result.png)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Вывод
|
||||||
|
Итак, нейронная сеть с поставленной задачей по сути не справилась. Работа
|
||||||
|
со скрытыми слоями смогла улучшить результат, но лишь на значение, равное 0,100.
|
||||||
|
|
||||||
|
Использование слишком малого количества нейронов в скрытых слоях приведет к
|
||||||
|
недообучению. Недообучение происходит, когда в скрытых слоях слишком мало
|
||||||
|
нейронов для адекватного обнаружения сигналов в сложном наборе данных.
|
||||||
|
Использование же слишком большого количества нейронов в скрытых слоях может
|
||||||
|
привести к переобучению. Очевидно, должен быть достигнут некоторый компромисс
|
||||||
|
между слишком большим и слишком малым количеством нейронов в скрытых слоях.
|
||||||
|
Я пришёл к тому, что использовал 4 скрытых слоя с 50 нейронов в каждом.
|
||||||
|
|
||||||
|
Можно сделать заключение, что целевая переменная (процент популярности
|
||||||
|
музыкального трека) выбрана неудачно, либо же требуется более детальная
|
||||||
|
обработка данных и другой подход к оцениваемым признакам. Как вариант,
|
||||||
|
можно рассмотреть StandardScaler или MinMaxScaler на этапе предварительной
|
||||||
|
обработки данных. Но как упоминалось в прошлой лабораторной работе,
|
||||||
|
популярность музыкального трека слишком неоднозначная величина, которую
|
||||||
|
саму по себе предсказать не просто, так как нет точной формулы песни,
|
||||||
|
которая взлетит в чартах. Искусство само по себе коварное :)
|
84
istyukov_timofey_lab_6/lab6.py
Normal file
84
istyukov_timofey_lab_6/lab6.py
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
"""
|
||||||
|
Использовать нейронную сеть по варианту для ваших данных по варианту, самостоятельно сформулировав задачу.
|
||||||
|
Интерпретировать результаты и оценить, насколько хорошо она подходит для решения сформулированной вами задачи.
|
||||||
|
"""
|
||||||
|
|
||||||
|
"""
|
||||||
|
Задача, решаемая нейронной сетью:
|
||||||
|
Регрессия: Предсказание популярности нового музыкального трека на основе его определённых характеристик.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 12 вариант
|
||||||
|
# Набор данных по курсовой: "Prediction of music genre"
|
||||||
|
# Модель мейронной сети: MLPRegressor
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
import seaborn as sns
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from sklearn import metrics
|
||||||
|
from sklearn.neural_network import MLPRegressor
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DATASET_FILE = 'music_genre.csv'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
df = open_dataset(DATASET_FILE) # берём полный набор данных
|
||||||
|
print("\033[92m[----------> Набор данных <----------]\033[00m")
|
||||||
|
print(df)
|
||||||
|
|
||||||
|
# Перевод ладов (минор/мажор) в числовые признаки
|
||||||
|
df_music = df.copy()
|
||||||
|
df_music['mode'] = df_music['mode'].apply(lambda x: 1 if x == 'Major' else 0)
|
||||||
|
|
||||||
|
X = df_music.drop(columns=['popularity']) # характеристики музыкального трека
|
||||||
|
y = df_music['popularity'] # уровень популярности
|
||||||
|
|
||||||
|
# Разделение датасета на тренировочные (99%) и тестовые данные (1%)
|
||||||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01)
|
||||||
|
|
||||||
|
model = MLPRegressor(
|
||||||
|
# несколько размеров слоёв и узлов
|
||||||
|
hidden_layer_sizes=(50, 50, 50, 50,),
|
||||||
|
# функция активации (relu, tanh, identity)
|
||||||
|
activation='relu',
|
||||||
|
max_iter=2000
|
||||||
|
)
|
||||||
|
model.fit(X_train, y_train)
|
||||||
|
|
||||||
|
# Предсказание на тестовых данных
|
||||||
|
y_pred = model.predict(X_test)
|
||||||
|
|
||||||
|
print("\033[92m\n[----------> Оценка модели <----------]\033[00m")
|
||||||
|
print("Коэффициент детерминации = ",
|
||||||
|
round(metrics.r2_score(y_test, y_pred), 3))
|
||||||
|
print("Потери регрессии среднеквадратичной логарифмической ошибки = ",
|
||||||
|
round(metrics.mean_squared_log_error(y_test, y_pred), 3))
|
||||||
|
|
||||||
|
# График для наглядности
|
||||||
|
sns.regplot(x=y_test, y=y_pred, scatter_kws={'s': 10}, line_kws={'color': 'red'})
|
||||||
|
plt.xlabel('Реальность')
|
||||||
|
plt.ylabel('Предсказание')
|
||||||
|
plt.title('MLPRegressor на примере популярности треков')
|
||||||
|
plt.savefig("1_plot_result")
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
# Функция считывания и очищения csv-файла
|
||||||
|
def open_dataset(csv_file):
|
||||||
|
# открываем файл с указанием знака-отделителя
|
||||||
|
df = pd.read_csv(csv_file, delimiter=',')
|
||||||
|
# выбираем необходимые признаки
|
||||||
|
df = df[['mode', 'tempo', 'instrumentalness', 'acousticness', 'speechiness', 'danceability',
|
||||||
|
'energy', 'liveness', 'valence', 'loudness', 'popularity']]
|
||||||
|
# очищаем набор данных от пустых и неподходящих значений
|
||||||
|
df = df[df['tempo'] != '?']
|
||||||
|
df = df.dropna()
|
||||||
|
return df
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
50006
istyukov_timofey_lab_6/music_genre.csv
Normal file
50006
istyukov_timofey_lab_6/music_genre.csv
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user