Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5 / decisiontree

.py
Скачиваний:
6
Добавлен:
19.01.2023
Размер:
4.85 Кб
Скачать
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt

# Функция вывода отношения между количеством записей,
# относящихся к классу 1 и к классу 0 по заданному признаку (col_name)
def get_values_rel_by_class(dataset, col_name, class_col_name):
    print('%s 1/0 class relation' % col_name)
    res1 = dataset.loc[dataset[class_col_name] == 1, [col_name]]
    res1 = res1.groupby([col_name]).size()
    res0 = dataset.loc[dataset[class_col_name] == 0, [col_name]]
    res0 = res0.groupby([col_name]).size()
    for r0, r1 in zip(res0, res1):
        print(r1/r0)

# Функция вывода графика кросстабуляции
def plot_crosstab(data, col_name_x, col_name_y):
    crosstb = pd.crosstab(data[col_name_x], data[col_name_y])
    crosstb.plot(kind='bar')
    plt.title(f'{col_name_x}_{col_name_y}_crosstab')
    plt.xlabel(col_name_x)
    plt.ylabel(col_name_y)
    #plt.savefig('%s_saved' % title)
    plt.show()
    return crosstb


if __name__ == '__main__':
    dataset = pd.read_csv("seeds_dataset.csv", sep=';', header='infer', names=None,
                          encoding="utf-8")  # возвращает Pandas DataFrame
    pd.set_option("display.max_rows", None, "display.max_columns", None)  # Настройки вывода таблицы
    print(dataset.shape)  # Выводим размерность данных
    #print(dataset.head(5)) # Выводим первые 5 строк DataFrame (проверяем, что файл загрузился верно)

    # Выделяем колонки с входными признаками (features)
    in_data = dataset[["area A", "perimeter P", "compactness C", "length of kernel", "width of kernel", "asymmetry coefficient", "length of kernel groove"]]
    # Колонка, определяющая классы (выходные данные)
    out_data = pd.DataFrame(dataset["variety"])

    # Вывод входных и выходных данных (проверка)
    print("Input data: \n", in_data.head(5))
    print("Classes: \n", out_data.head(5))

    # Разделяем из общего набора данных тренировочную (80%) и тестовую выборку (20%),
    # параметр stratify=out_data позволяет делать выборку с сохранением пропорции распределения классов
    in_data_train, in_data_test, out_data_train, out_data_test = train_test_split(in_data, out_data, test_size=0.2, stratify=out_data)

    # Создаем модель дерева решений заданной глубиной (max_depth)
    dtree = tree.DecisionTreeClassifier(max_depth=3)
    # Обучаем модель на тренировочных данных
    dtree.fit(in_data_train, out_data_train)
    # Оценка точности классификатора
    score = dtree.score(in_data_test, out_data_test)
    print("Точность классификатора: ", score)
    # Прогнозирование на обученной модели (используем тестовую выборку)
    y_predicted = dtree.predict(in_data_test)
    # Создаем и выводим таблицу (result_table) с результатами прогнозирования по тестовому набору:
    # колонка Predicted - значения вычисленные классификатором
    # колонка Test - проверочные (реальные) значения
    result_table = in_data_test.copy(deep=True)
    result_table['Predicted'] = list(y_predicted)
    result_table['Test'] = list(list(out_data_test.iloc[:,0]))
    # Сохраняем таблицу в файл
    result_table.to_csv('dtree_result.csv', index=True, sep=";", encoding="utf-8-sig")
    #print(result_table)
    # Вывод итогового отчета по результатам прогнозирования с деталировкой по каждому классу
    print(classification_report(out_data_test, y_predicted))
    # Графический вывод дерева решений
    plt.figure(figsize=(17, 10))    # Размер окна вывода в дюймах
    tree.plot_tree(dtree,  feature_names=list(dataset.columns), filled=True, fontsize=12)
    # Сохранение графа в файл
    plt.savefig('Decision_tree_saved')
    # Вывод графа в отдельном окне
    plt.show()
Соседние файлы в папке 5