<jupyter_start><jupyter_text><jupyter_code>import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
%matplotlib inline
df = pd.read_csv("/content/file.csv",  sep='\t')
df.head()
# Правильный ответ записываем в вектор y
y = df[u'Номер образца']
# Удаляем колонку с правильным ответом
df = df.drop(u'Номер образца', axis=1)
df['Класс'] = df['Территория'] + ' ' + df['Тип керамики']
df['Класс'] = pd.factorize(df['Класс'])[0]
X = df.drop(['Территория', 'Тип керамики', 'Класс'], axis=1)
Y = df['Класс']
Y.head()
from sklearn.tree import DecisionTreeClassifier

# Инициализируем модель
model = DecisionTreeClassifier(random_state=42,
                               # функция для impurity ('gini' или 'entropy')
                               criterion='gini',
                               # максимальная глубина дерева
                               max_depth=5,
                               # минимальное число элементов в узле для разбиения (может быть долей)
                               min_samples_split=5,
                               # минимальное число элементов в листе (может быть долей)
                               min_samples_leaf=5,
                               # минимальное значение дельты impurity
                               # min_impurity_decrease=0,
                               # веса для классов (можно дополнительно штрафовать за ошибку в нужных классах).
                               # поддерживает опцию 'balanced'.
                               class_weight=None,
                               # предварительная сортировка.
                               # ускоряет обучение на данных небольшого размера или с ограниченной глубиной дерева.
                               # иначе замедляет обучение.
                               #presort=False
                              )

# Обучаем модель
model.fit(X, Y)
from IPython.display import Image
from sklearn.tree import export_graphviz
from subprocess import call

export_graphviz(model,
                out_file='tree.dot',
                # задать названия фич
                feature_names=X.columns,
                class_names=None,
                # показывать названия полей у численных значений внутри узла
                label='all',
                # раскрашивать узлы в цвет преобладающего класса
                filled=True,
                # показывать значение impurity для каждого узла
                impurity=True,
                # показывать номера узлов
                node_ids=True,
                # Показывать доли каждого класса в узлах (а не количество)
                proportion=True,
                # Повернуть дерево на 90 градусов (вертикальная ориентация)
                rotate=True,
                # Число точек после запятой для отображаемых дробей
                # precision=3
               )
# Преобразуем файл tree.dot в tree.png
call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png']);
# Вставляем картинку в блокнот
Image("tree.png")
pd.DataFrame({'feature': X.columns,
              'importance': model.feature_importances_}).sort_values('importance', ascending=False)
pred = model.predict(X)
pred
Y.array
df2 = pd.DataFrame([Y.array, pred], ['real', 'pred']).transpose()
df2['T/F'] = (df2['real'] == df2['pred'])
df2.head(10)
from sklearn import metrics
conf_mat = metrics.confusion_matrix(Y, pred)
conf_mat = pd.DataFrame(conf_mat, index=model.classes_, columns=model.classes_)
conf_mat
from sklearn.metrics import accuracy_score
accuracy_score(Y, pred)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09012276785714286, 'fraction_numerical': 0.005301339285714286, 'mean_word_length': 1.9193811074918568, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 11, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '562863', 'license': 'MIT', 'n_tokens_mistral': 1159, 'n_tokens_neox': 1222, 'n_words': 257, 'path': 'hw10.ipynb', 'repo_name': 'ancka019/data_analysis-', 'size': '3584'}