Добавил:
qwerty12vghjmfh3456
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:5 / decisiontree
.pyimport 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