Руководство и пример от MITx Analytics Edge с использованием Python

Деревья классификации и регрессии (CART) можно преобразовать в график или набор правил для прогностической классификации. Они помогают, когда модели логистической регрессии не могут предоставить достаточные границы решений для прогнозирования метки. Кроме того, модели дерева решений более интерпретируемы, поскольку они имитируют процесс принятия решений человеком. Кроме того, регрессия дерева решений может фиксировать нелинейные отношения, что позволяет использовать более сложные модели.

Как работают модели CART?

Рассмотрим случай двух независимых переменных X1 и X2. Мы хотим предсказать, будет ли результат красным или синим. CART пытается разбить эти данные на подмножества, чтобы каждое подмножество было как можно более чистым или однородным.

Первое разбиение (split1) разбивает данные таким образом, что если переменная X2 меньше 60, результат будет выделен синим цветом, а если нет, то будет просмотрено второе разбиение (split2). Split2 позволяет прогнозировать красный цвет, когда X1›20 с учетом X2‹60. Split3 будет предсказывать синий, если X2‹90, и красный в противном случае.

Как контролировать производительность модели?

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

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

Чистый узел — это тот, который дает идеальное предсказание.

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

Мы стремимся уменьшить неопределенность после каждого разделения. Плохое разделение сделает результат 50% синим и 50% красным. идеальное разделение даст, например, 100% синий цвет.

Чтобы измерить, как ведет себя расщепление с точки зрения увеличения информации после расщепления, мы можем полагаться на следующие меры:

1 — Энтропия[entropy = -1*sum(p*log(p)) ]

2 — примесь Джини [Gini = sum(p(1-p)), where p is the proportion of misclassified observation within the sub partition]

Пример: Прогнозирование решения судьи Стивенса

Цель состоит в том, чтобы предсказать, проголосовал ли судья Стивен за отмену решения суда, где 1 означает, что он проголосовал за отмену решения, а 0 означает, что он подтвердил решение суда.

Код и данные доступны на GitHub.

Фрейм данных выглядит, как показано ниже, с целевой переменной (Reverse).

Важное примечание. Дерево решений (DT) может обрабатывать как непрерывные, так и числовые переменные. Но если вы используете Python Scikit Learn, вы можете получить ValueError для категориального.

Функции имеют много категориальных значений, которые мы преобразуем в числовые значения с помощью функции ниже:

def convert_cat(df,col):
    """
    input: dataframe and col list of categorical columns
    output: dataframw with numerical values
    """
    for c in col:
        item_list = df[c].unique().tolist()
        enum=enumerate(item_list)
        d = dict((j,i) for i,j in enum)
        print(c)
        print(d)
        
        df[c].replace(d, inplace=True)
    return df
convert_cat(df,['Circuit', 'Issue', 'Petitioner', 'Respondent',
       'LowerCourt'])

Разделите данные на обучение и тестирование

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

Построить модель дерева решений на обучающих данных

clf = tree.DecisionTreeClassifier('gini', min_samples_leaf=30, random_state=0)
clf = clf.fit(X_train, y_train)

Постройте модель дерева решений

from sklearn import tree # for decision tree models
plt.figure(figsize = (20,16))
tree.plot_tree(clf, fontsize = 16,rounded = True , filled = True);

Используйте отчет о классификации для оценки модели.

report = classification_report(predTree, y_test)
print(report)

Рекомендации

Курс аналитики MITx на edX