69 lines
3.4 KiB
Python
69 lines
3.4 KiB
Python
|
"""
|
|||
|
Решите с помощью библиотечной реализации дерева решений задачу изnлабораторной работы
|
|||
|
«Веб-сервис «Дерево решений» по предмету «Методы искусственного интеллекта» на 99% ваших данных.
|
|||
|
Проверьте работу модели на оставшемся проценте, сделайте вывод.
|
|||
|
"""
|
|||
|
|
|||
|
"""
|
|||
|
Задача, решаемая деревом решений: Классификация музыкальных треков на основе их характеристик,
|
|||
|
таких как акустика, танцевальность, инструментальность, темп и т.д.
|
|||
|
Дерево решений может предсказывать жанр трека, основываясь на его характеристиках.
|
|||
|
"""
|
|||
|
|
|||
|
# 12 вариант
|
|||
|
# Набор данных по курсовой: "Prediction of music genre"
|
|||
|
|
|||
|
import pandas as pd
|
|||
|
from sklearn.tree import DecisionTreeClassifier
|
|||
|
from sklearn.model_selection import train_test_split
|
|||
|
from sklearn.metrics import accuracy_score
|
|||
|
|
|||
|
|
|||
|
DATASET_FILE = 'music_genre.csv'
|
|||
|
|
|||
|
|
|||
|
def main():
|
|||
|
df = open_dataset(DATASET_FILE)
|
|||
|
df = df.sample(frac=.1) # отбираем 10% рандомных строк с набора данных, т.к. он большой
|
|||
|
print("\033[92m[-----> Набор данных <-----]\033[00m")
|
|||
|
print(df)
|
|||
|
|
|||
|
X = df.drop(columns=['music_genre']) # набор числовых признаков
|
|||
|
y = df['music_genre'] # набор соответствующих им жанров
|
|||
|
|
|||
|
# Разделение датасета на тренировочные (99,5%) и тестовые данные (0,5%)
|
|||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.005)
|
|||
|
|
|||
|
# Создание и обучение дерева решений
|
|||
|
model = DecisionTreeClassifier()
|
|||
|
model.fit(X_train.values, y_train)
|
|||
|
|
|||
|
# Прогнозирование жанра на тестовых данных
|
|||
|
y_pred = model.predict(X_test.values)
|
|||
|
|
|||
|
print("\033[92m\n\n\n[-----> Сравнение жанров <-----]\033[00m")
|
|||
|
df_result = pd.DataFrame({'Прогноз': y_pred, 'Реальность': y_test})
|
|||
|
print(df_result)
|
|||
|
|
|||
|
score = accuracy_score(y_test, y_pred)
|
|||
|
print("\033[92m\n> Оценка точности модели: {}\033[00m" .format(round(score, 2)))
|
|||
|
|
|||
|
print("\033[92m\n\n\n[-----> Оценки важности признаков <-----]\033[00m")
|
|||
|
df_feature = pd.DataFrame({'Признак': X.columns, "Важность": model.feature_importances_})
|
|||
|
print(df_feature)
|
|||
|
|
|||
|
|
|||
|
# Функция считывания и очищения csv-файла
|
|||
|
def open_dataset(csv_file):
|
|||
|
# открываем файл с указанием знака-отделителя
|
|||
|
df_genres = pd.read_csv(csv_file, delimiter=',')
|
|||
|
# выбираем необходимые признаки
|
|||
|
df_genres = df_genres[['tempo', 'instrumentalness', 'acousticness', 'speechiness', 'danceability', 'energy', 'liveness', 'music_genre']]
|
|||
|
# очищаем набор данных от пустых и неподходящих значений
|
|||
|
df_genres = df_genres[df_genres['tempo'] != '?']
|
|||
|
df_genres = df_genres.dropna()
|
|||
|
return df_genres
|
|||
|
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
main()
|