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() |