В своем последнем блоге я обсуждал две наиболее распространенные метрики в деревьях решений: энтропию / прирост информации и индекс Джини. В этом посте я расскажу, как использовать Python для кодирования деревьев решений и опасностей, которые могут возникнуть при использовании деревьев решений.

Деревья решений кодирования

Чтобы начать кодирование наших деревьев, предположим, что у нас есть фрейм данных Pandas с именем df с категориальной целевой переменной. В дополнение к Pandas вы также должны импортировать следующее, чтобы создать дерево решений.

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

Обратите внимание, что в этом конкретном случае я использую DecisionTreeClassifier, потому что мы прогнозируем целевой класс. Вместо этого вы можете импортировать DecisionTreeRegressor, если у вас есть непрерывная целевая переменная.

Как всегда, первое, что вы должны сделать с фреймом данных, - это выполнить разделение на обучающий тест перед любой очисткой данных. Помните, что вы не хотите заимствовать информацию у своей группы тестирования при обучении модели.

X = df.drop(['target'], axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X,y)

Затем мы можем подогнать наше дерево решений и собрать наши y_hats для данных обучения и тестирования.

dec_tree = DecisionTreeClassifier()
dec_tree.fit(X_train, y_train)
y_train_hat = dec_tree.predict(X_train)
y_test_hat = dec_tree.predict(X_test)

Внутри DecisionTreeClassifer мы можем поместить несколько параметров, чтобы предотвратить переоснащение дерева решений. Это очень важный набор параметров, потому что деревья решений очень подвержены переобучению. Если, например, вы всегда выбираете разделение, которое дает больше всего информации. Кроме того, если у вас есть неограниченное количество разбиений, дерево БУДЕТ идеально соответствовать данным обучения и не будет отражать данные тестирования.

Вот некоторые из параметров, которые вы можете настроить, чтобы не допустить переобучения тренировочных данных.

  • критерий: (по умолчанию = «gini») показатель, используемый для создания разделов. Используйте «энтропию» для получения информации.
  • max_depth: (по умолчанию = Нет) максимальное количество слоев вашего дерева. Если None, слои будут продолжаться до тех пор, пока не будет достигнуто чистое разделение или не будет достигнут другой параметр min / max.
  • min_samples_split: (по умолчанию = 2) минимальное количество выборок во внутреннем узле, при котором может произойти разделение. Если у узла меньше этого числа, он становится листом (конечным узлом).
  • min_samples_leaf: (по умолчанию = 1) минимальное количество выборок, необходимое для листового узла. Разделение произойдет только в том случае, если узлы, полученные в результате разделения, соответствуют этому минимуму. Это может быть особенно полезно в деревьях регрессии.

Оценка деревьев решений

Теперь, когда мы создали наше дерево решений и собрали наши значения y_hat, мы можем оценить наше дерево решений, используя данные тестирования. В двоичном классификаторе отличным показателем для использования является кривая ROC-AUC и матрица неточностей.

Для этих показателей потребуется следующий импорт.

from sklearn.metrics import (roc_curve, auc, roc_auc_score,
                             confusion_matrix)
import matplotlib.pyplot as plt
import numpy as np
import itertools

Затем мы хотим определить некоторые функции для получения оценок AUC и построить кривую ROC-AUC. clf обозначает модель классификатора.

def get_auc_scores(clf, X_train, X_test, y_train, y_test):
   “””Prints the AUC scores for training and testing data
   and returns testing score”””
 
 y_train_score = clf.predict_proba(X_train)[:, 1]
 y_test_score = clf.predict_proba(X_test)[:, 1]
 auc_train = roc_auc_score(y_train, y_train_score)
 auc_test = roc_auc_score(y_test, y_test_score)
 print(f”””
    Training AUC: {auc_train}
    Testing AUC: {auc_test}”””)
 
 return y_test_score

Как только у вас есть y_test_score из приведенной выше функции, мы можем использовать его в кривой ROC.

fpr - частота ложных срабатываний, tpr - частота истинных положительных результатов.

def plot_roc_curve(y_test, y_test_score):
   “””Plot ROC curve for testing data”””
 
 fpr, tpr, _ = roc_curve(y_test, y_test_score)
 roc_auc = auc(fpr, tpr)
 plt.figure()
 plt.plot(fpr, tpr, label=”ROC curve (area = %0.2f)” % roc_auc)
 plt.plot([0, 1], [0, 1], “k — “)
 plt.xlim([0.0, 1.0])
 plt.ylim([0.0, 1.05])
 plt.xlabel(“False Positive Rate”)
 plt.ylabel(“True Positive Rate”)
 plt.title(“Receiver operating characteristic”)
 plt.legend(loc=”lower right”)
 plt.show()

Ниже представлен результат этой функции. Чтобы прочитать кривую ROC, нам нужно, чтобы изгиб кривой находился в верхнем левом углу. Чем ближе кривая к пунктирной линии под углом 45 градусов, тем хуже работает наша модель.

Мы также можем построить матрицу путаницы, которая даст нам числовую разбивку всех истинных / ложных положительных / отрицательных результатов в данных тестирования.

def show_cm(y_true, y_pred, class_names=None, model_name=None):
    “””Show confusion matrix”””
 
 cf = confusion_matrix(y_true, y_pred)
 plt.imshow(cf, cmap=plt.cm.Blues)
 if model_name:
   plt.title(“Confusion Matrix: {}”.format(model_name))
 else:
   plt.title(“Confusion Matrix”)
   plt.ylabel(“True Label”)
   plt.xlabel(“Predicted Label”)
 if class_names:
   tick_marks = np.arange(len(class_names))
   plt.xticks(tick_marks, class_names)
   plt.yticks(tick_marks, class_names)
 else:
   class_names = set(y_true)
   tick_marks = np.arange(len(class_names))
   plt.xticks(tick_marks, class_names)
   plt.yticks(tick_marks, class_names)
 thresh = cf.max() / 2.0
 for i, j in itertools.product(range(cf.shape[0]),
                               range(cf.shape[1])):
   plt.text(j, i, cf[i, j],
            horizontalalignment=”center”,
            color=”white” if cf[i, j] > thresh else “black”,
            )
 plt.colorbar()

В матрице неточностей мы можем видеть, насколько хорошо дерево решений принимало решения. Используя цветовую карту, легко определить, что большинство предметов правильно классифицировано по диагональной синей линии. Затем мы также можем использовать матрицу путаницы для дополнительных показателей, которые могут быть лучше приспособлены для конкретной бизнес-задачи.

Деревья решений сами по себе являются мощными инструментами, но мы хотим быть осторожными с переобучением, поскольку они очень склонны к такому. Мы можем поэкспериментировать с параметрами и оценить, как каждый из них работает, используя кривую ROC или матрицу путаницы.