"""
1. Виконати класифікацію набору даних "Sonar classification" (
https://archive.ics.uci.edu/ml/machine-learning-databases/ionosphere/).

2. Розробити моделі три моделі
• дерево рішень;
• бегінг дерев рішень;
• випадковий ліс;

3. Провести обчислювальні експерименти з різними параметрами
моделей та знайти оптимальну конфігурацію з найбільшою точністю
класифікації
"""

from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.ensemble import RandomForestClassifier, BaggingClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import pandas as pd
import seaborn as sns
import graphviz
import random

# названия колонок
columns = [f'prop_{str(i)}' for i in range(1, 35)] + ['class']

# считывание данных
data = pd.read_csv('../input/ionosphere/ionosphere.csv', delimiter=',', names=columns)

df = pd.DataFrame(data) # создание объекта DataFrame
df.head(10)
df.loc[df['class'] == 'g', 'class'] = 1
df.loc[df['class'] == 'b', 'class'] = 0
df.head(10)
# набор входных данных, которые будут использоваться в качестве входных данных для модели
information = df.loc[:,columns[3:-1]]
research = df['class'] # набор данных для проверки построенных моделей

# разделение данных , создаются 4 "порции" информации
X_train, X_test, Y_train, Y_test = train_test_split(information, research, test_size=0.4, random_state=0)
Y_train = Y_train.astype('int')
Y_test = Y_test.astype('int')
#Древо решений
clf = DecisionTreeClassifier(max_depth=10)
clf.fit(X_train, Y_train)
Y_pred = clf.predict(X_test) 
dec_tree_score = clf.score(X_test, Y_test)
print('Дерево решений: ', dec_tree_score)

dot_data = tree.export_graphviz(clf, out_file=None, feature_names=information.columns, 
                                class_names=['good', 'bad'], filled=True, rounded=True,  
                                special_characters=True)
graph = graphviz.Source(dot_data)  
graph
#Беггинг деревьев решения
trees_amount = 500
clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=trees_amount, max_samples=50, 
                        bootstrap=True, n_jobs=-1)
clf.fit(X_train, Y_train)
Y_pred = clf.predict(X_test) 
bag_score = clf.score(X_test, Y_test)
print('Беггинг деревьев решения: ', bag_score)

random_tree_number = random.randint(0, trees_amount - 1)
estimator = clf.estimators_[random_tree_number]  # извлечь одно случайное дерево
dot_data = tree.export_graphviz(estimator, out_file=None, feature_names=information.columns, 
                                class_names=['good', 'bad'], filled=True, rounded=True,  
                                special_characters=True, precision=2)
graph = graphviz.Source(dot_data)  
graph
# Случайный лес
trees_amount = 100

clf = RandomForestClassifier(n_estimators=trees_amount, max_depth=5, random_state=0)
clf = clf.fit(X_train, Y_train) 
Y_pred = clf.predict(X_test) 
rand_frst_score = clf.score(X_test, Y_test) 
print('Случайный лес: ',rand_frst_score) 

random_tree_number = random.randint(0, trees_amount - 1)
estimator = clf.estimators_[random_tree_number]  # извлечь одно случайное дерево
dot_data = tree.export_graphviz(estimator, out_file=None, feature_names=information.columns, 
                                class_names=['good', 'bad'], filled=True, rounded=True,  
                                special_characters=True, precision=2)
graph = graphviz.Source(dot_data)  
graph
"""
Вывод:

В данной лабораторной работе мы работали с данными ionospehere. Эти данные изначально были получены с помощью специальной системы радаров, состоящей из 16 высокочастотных антенн с суммарной мощьностью около 6.4 кВ. Целью были свободные электроны в ионосфере. "Хороший" радар возвращал информацию об электроных определенной структуры в ионосфере, "плохой" - те, которые проходили сквозь ионосферу.

Данные ionospehere содержат в себе 351 запись с 34 числовыми атрибутами и 1 атрибутом "класса" ('g' - good, 'b' - bad).

Были разработаны три модели:Дерево решений, Беггинг деревьев решения, Случайный лес.

Для текущего набора данных, наибольшую точность имел Случайный лес.
"""