From 0b1489dd30dce14e6a24863b8fdc8b5e524742f1 Mon Sep 17 00:00:00 2001 From: Nelikey Date: Fri, 12 Jan 2024 11:56:56 +0400 Subject: [PATCH] lab5 --- kozlov_alexey_lab_5/README.md | 116 ++++ kozlov_alexey_lab_5/lab5.py | 55 ++ kozlov_alexey_lab_5/output.png | Bin 0 -> 4858 bytes kozlov_alexey_lab_5/spotify.csv | 954 ++++++++++++++++++++++++++++++++ 4 files changed, 1125 insertions(+) create mode 100644 kozlov_alexey_lab_5/README.md create mode 100644 kozlov_alexey_lab_5/lab5.py create mode 100644 kozlov_alexey_lab_5/output.png create mode 100644 kozlov_alexey_lab_5/spotify.csv diff --git a/kozlov_alexey_lab_5/README.md b/kozlov_alexey_lab_5/README.md new file mode 100644 index 0000000..bfe8f8c --- /dev/null +++ b/kozlov_alexey_lab_5/README.md @@ -0,0 +1,116 @@ +# Лабораторная работа №5. Регрессия +## 14 вариант +___ + +### Задание: +Использовать метод гребневой регрессиии, самостоятельно сформулировав задачу. Интерпретировать результаты и оценить, насколько хорошо он подходит для решения сформулированной вами задачи. + +### Описание используемого набора данных: +Объектом исследования является набор данных, который размещен на платформе Kaggle (https://www.kaggle.com/datasets/nelgiriyewithana/top-spotify-songs-2023/data). Он представляет собой полный список самых известных песен 2023 года, перечисленных на Spotify. Данный набор представлен в виде файла spotify.csv + +Столбцами являются: +1. track_name – Название композиции +2. artist(s)_name – Имя исполнителя/имена исполнителей песни. +3. artist_count – Количество исполнителей, участвовавших в со-здании песни +4. released_year – Год, когда песня была выпущена +5. released_month – Месяц, когда песня была выпущена +6. released_day – День месяца, когда песня была выпущена. +7. in_spotify_playlists – Количество плейлистов Spotify, в которые песня включена +8. in_spotify_charts – Присутствие и рейтинг песни в чартах Spotify. +9. streams – Общее количество прослушиваний в Spotify. +10. in_apple_playlists – Количество плейлистов Apple Music, в которые песня включена. +11. in_apple_charts – Присутствие и рейтинг песни в чартах Apple Music. +12. in_deezer_playlists – Количество плейлистов Deezer, в ко-торые песня включена. +13. in_deezer_charts – Присутствие и рейтинг песни в чартах Deezer +14. in_shazam_charts – Присутствие и рейтинг песни в чартах Shazam. +15. bpm – Количество ударов в минуту, показатель темпа песни. +16. key – Тональность песни. +17. mode – Режим песни (мажорный или минорный). +18. danceability_% – Процент, указывающий, насколько песня подходит для танцев. +19. valence_% - Позитивность музыкального содержания пес-ни +20. energy_% - Воспринимаемый уровень энергии песни +21. acousticness_% - Количество акустического звука в песне +22. instrumentalness_% - Количество инструментального кон-тента в песне +23. liveness_% - Наличие элементов живого исполнения +24. speechiness_% - Количество произнесенных слов в песне + +Задачей регрессии на данном наборе данных является прогнозирование значения столбца «in_spotify_playlists» по столбцам «streams», «in_apple_playlists», «in_deezer_playlists» и «bpm». +___ + +### Запуск +- Запустить файл lab5.py + +### Используемые технологии +- Язык программирования **Python** +- Среда разработки **PyCharm** +- Библиотеки: + * sklearn + * matplotlib + * numpy + * pandas + +### Описание программы +Код программы выполняет следующие действия: + +1. Импортирует необходимые библиотеки: pandas, numpy, Ridge из sklearn.linear_model, mean_absolute_error и mean_squared_error из sklearn.metrics, train_test_split из sklearn.model_selection, StandardScaler из sklearn.preprocessing. + +2. Загружает данные из файла "spotify.csv" в объект DataFrame. + +3. Удаляет строки с пропущенными значениями из DataFrame. + +4. Удаляет столбец 'artist(s)_name' из DataFrame. + +5. Удаляет запятые из значений в столбце 'in_deezer_playlists'. + +6. Приводит столбец 'in_deezer_playlists' к числовому типу данных (int64). + +7. Удаляет запятые из значений в столбце 'in_shazam_charts'. + +8. Приводит столбец 'in_shazam_charts' к числовому типу данных (int64). + +9. Создает словарь соответствия числовых значений и названий трека. + +10. Заменяет значения в столбце 'track_name' на числовые, используя словарь. + +11. Создает словарь соответствия числовых значений и названий тональности. + +12. Заменяет значения в столбце 'key' на числовые, используя словарь. + +13. Создает словарь соответствия числовых значений и режимов песни. + +14. Заменяет значения в столбце 'mode' на числовые, используя словарь. + +15. Создает список regrData содержащий имена столбцов для обучения модели. + +16. Разделяет данные на обучающую и тестовую выборки с помощью функции train_test_split. + +17. Создает объект StandardScaler и выполняет масштабирование данных обучающей и тестовой выборок. + +18. Создает объект Ridge регрессора с параметром alpha=1.0. + +19. Обучает регрессор на масштабированных обучающих данных. + +20. Прогнозирует значения для тестовой выборки. + +21. Вычисляет среднюю абсолютную ошибку (MAE) и среднеквадратичную ошибку (MSE) между фактическими и прогнозируемыми значениями. + +22. Вычисляет коэффициент детерминации модели (Score). + +23. Выводит значения MAE, MSE и Score на экран. + +___ +### Пример работы + +![Graphics](output.png) +```text +Значение метрик ошибки (MAE и MSE) и коэффициент детерминации (Score) +``` + +### Вывод +Значение MAE равно 1491.2695835796214, это означает, что в среднем модель ошибается на примерно 1491 единицу при прогнозировании значений целевой переменной. Чем меньше значение MAE, тем более точные предсказания даёт модель. + +Значение MSE (среднеквадратическая ошибка) равно 7440679.027329878. Оно вычисляется как среднее значение квадратов разницы между предсказанными и наблюдаемыми значениями. Чем меньше значение MSE, тем ближе предсказанные значения к наблюдаемым. + +Score (оценка модели) равен 0.853940909276013. Это означает, что модель объясняет около 85.39% дисперсии в данных. Чем ближе значение score к 1, тем более точная модель. + +В целом, значения MSE и score указывают на достаточно низкую точность модели. Возможно, стоит использовать другие алгоритмы или настраивать параметры текущей модели для получения более точных прогнозов. \ No newline at end of file diff --git a/kozlov_alexey_lab_5/lab5.py b/kozlov_alexey_lab_5/lab5.py new file mode 100644 index 0000000..5953a20 --- /dev/null +++ b/kozlov_alexey_lab_5/lab5.py @@ -0,0 +1,55 @@ +import pandas as pd +import numpy as np +from sklearn.linear_model import Ridge +from sklearn.metrics import mean_absolute_error, mean_squared_error +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler + +# Загрузить данные +data = pd.read_csv("spotify.csv") +# Удалить все строки с пропусками +data = data.dropna() +data.drop('artist(s)_name', axis=1, inplace=True) +# Удалить запятые из значений в столбце +data['in_deezer_playlists'] = data['in_deezer_playlists'].str.replace(',', '') +# Привести столбец к числовому типу данных +data['in_deezer_playlists'] = data['in_deezer_playlists'].astype(np.int64) +# Удалить запятые из значений в столбце +data['in_shazam_charts'] = data['in_shazam_charts'].str.replace(',', '') +# Привести столбец к числовому типу данных +data['in_shazam_charts'] = data['in_shazam_charts'].astype(np.int64) +# Создаем словарь соответствия числовых значений и названий трека +track_name_dict = {name: index for index, name in enumerate(data['track_name'].unique())} +# Заменяем значения в столбце на числовые +data['track_name'] = data['track_name'].map(track_name_dict) +# Создаем словарь соответствия числовых значений и названий тональности +key_dict = {'C': 0, 'C#': 1, 'D': 2, 'D#': 3, 'E': 4, 'F': 5, 'F#': 6, + 'G': 7, 'G#': 8, 'A': 9, 'A#': 10, 'B': 11} +# Заменяем значения в столбце на числовые +data['key'] = data['key'].map(key_dict) +# Создаем словарь соответствия числовых значений и режимов песни +mode_dict = {'Major': 0, 'Minor': 1} +# Заменяем значения в столбце на числовые +data['mode'] = data['mode'].map(mode_dict) + +regrData = ['in_apple_playlists', 'in_deezer_playlists', 'streams', 'bpm'] +y = data['in_spotify_playlists'] +x_train, x_test, y_train, y_test = train_test_split(data[regrData], y, test_size=0.2, random_state=42) + +scaler = StandardScaler() +X_train_scaled = scaler.fit_transform(x_train) +X_test_scaled = scaler.transform(x_test) + +ridge = Ridge(alpha=1.0) +ridge.fit(X_train_scaled, y_train) + +y_pred = ridge.predict(X_test_scaled) + +mae = mean_absolute_error(y_test, y_pred) +mse = mean_squared_error(y_test, y_pred) + +score = ridge.score(X_test_scaled, y_test) + +print("MAE:", mae) +print("MSE:", mse) +print("Score:", score) diff --git a/kozlov_alexey_lab_5/output.png b/kozlov_alexey_lab_5/output.png new file mode 100644 index 0000000000000000000000000000000000000000..200393837d296c3129d8a1a0466db78d34e9bac5 GIT binary patch literal 4858 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%0D`GZhiC(ZX?Ue)$i(;xHWAM+dc15Jca znjOlIGpAIq)7ifrkN*0S2-DSi2fm6KNXv6e1ZFBjgpcGm*+DnTwT?pb;o9^;t@^n; zaFN@^KN>+65o4#?hlN!EtJltYcb|C