Решающие деревья в Python: метод, реализация, практика, примеры

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Специалисты по данным и аналитики, интересующиеся машинным обучением
  • Программисты и разработчики, изучающие Python и библиотеки для анализа данных
  • Люди, ищущие практические примеры использования алгоритмов машинного обучения в реальных задачах

    Среди алгоритмов машинного обучения метод решающих деревьев занимает особое место — это мощный, интуитивно понятный инструмент, способный эффективно решать задачи классификации и регрессии. Представьте себе процесс принятия решений, где на каждом этапе вы отвечаете на простой вопрос и двигаетесь к следующему узлу, пока не достигнете финального результата. Именно такую логику имитируют решающие деревья, позволяя создавать модели, которые не только работают, но и поддаются интерпретации даже неспециалистами. В этой статье мы раскроем все секреты реализации решающих деревьев в Python с использованием библиотеки scikit-learn — от базовых принципов до тонкой настройки и визуализации. 🌳🔍

Освоить метод решающих деревьев — лишь первый шаг в карьере Python-разработчика. Хотите погрузиться глубже в мир анализа данных и машинного обучения? Обучение Python-разработке от Skypro даст вам не только теоретические знания, но и практические навыки работы с библиотеками вроде scikit-learn. Вы изучите полный спектр инструментов для анализа данных, от базовых до продвинутых, и сможете создавать собственные модели под реальные задачи бизнеса.

Основы метода решающих деревьев и их применение

Метод решающих деревьев (Decision Trees) представляет собой алгоритм машинного обучения, который моделирует процесс принятия решений в виде древовидной структуры. Каждый внутренний узел дерева содержит условие (обычно сравнение значения признака с пороговым значением), каждая ветвь представляет исход этого условия, а каждый лист (конечный узел) содержит предсказание. 🌱

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

Анна Соколова, старший аналитик данных

Когда я впервые столкнулась с необходимостью объяснить результаты модели клиентам, решающие деревья стали моим спасением. Работая над проектом прогнозирования оттока клиентов для телекоммуникационной компании, я построила модель, которая давала точность около 87%. Но руководству было недостаточно знать только прогноз — им нужно было понимать, почему клиенты уходят.

Реализовав модель решающего дерева с помощью scikit-learn, я смогла визуализировать процесс принятия решений и показать, что ключевыми факторами были длительность контракта, ежемесячные платежи и наличие технической поддержки. Это позволило компании разработать целевую стратегию удержания, сфокусированную именно на этих аспектах. Через 6 месяцев отток сократился на 23%, что принесло компании дополнительный доход более 1,5 млн долларов.

Преимущества метода решающих деревьев:

  • Интерпретируемость — результаты легко объяснить не-техническим специалистам
  • Минимальная предобработка данных — не требуется нормализация или стандартизация
  • Работа с категориальными и числовыми данными без дополнительных преобразований
  • Устойчивость к выбросам и пропущенным значениям
  • Автоматический отбор признаков — алгоритм сам определяет важность переменных

Недостатки метода:

  • Склонность к переобучению, особенно на глубоких деревьях
  • Нестабильность — небольшие изменения в данных могут привести к созданию совершенно другого дерева
  • Ограниченная точность в сравнении с более сложными моделями
Тип задачи Метрика оценки качества Особенности применения
Классификация Индекс Джини, энтропия Категоризация объектов по классам
Регрессия MSE (среднеквадратичная ошибка) Предсказание непрерывных значений
Многоклассовая классификация Индекс Джини, энтропия Работа с более чем двумя классами

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

Пошаговый план для смены профессии

Построение и обучение деревьев решений в scikit-learn

Scikit-learn предоставляет удобный API для создания, обучения и использования моделей решающих деревьев. Основные классы для работы с деревьями решений включают DecisionTreeClassifier для задач классификации и DecisionTreeRegressor для задач регрессии. Рассмотрим процесс построения модели на практическом примере. 🛠️

Начнем с импорта необходимых библиотек и загрузки данных:

Python
Скопировать код
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report

# Загрузка набора данных (например, Iris)
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target

# Разделение на тренировочную и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Теперь создадим и обучим модель решающего дерева:

Python
Скопировать код
# Создание экземпляра классификатора
dt_classifier = DecisionTreeClassifier(random_state=42)

# Обучение модели на тренировочных данных
dt_classifier.fit(X_train, y_train)

# Получение предсказаний на тестовых данных
y_pred = dt_classifier.predict(X_test)

# Оценка точности модели
accuracy = accuracy_score(y_test, y_pred)
print(f"Точность модели: {accuracy:.4f}")

# Вывод детального отчета
print(classification_report(y_test, y_pred, target_names=iris.target_names))

При создании экземпляра DecisionTreeClassifier можно указать ряд параметров, определяющих процесс построения дерева:

  • criterion — мера качества разделения ('gini' или 'entropy')
  • max_depth — максимальная глубина дерева
  • minsamplessplit — минимальное количество образцов для разделения узла
  • minsamplesleaf — минимальное количество образцов в листовом узле
  • max_features — максимальное количество признаков, рассматриваемых при поиске наилучшего разделения

Пример создания дерева с ограниченной глубиной для предотвращения переобучения:

Python
Скопировать код
# Создание модели с ограниченной глубиной
dt_classifier_pruned = DecisionTreeClassifier(
max_depth=3,
min_samples_split=5,
min_samples_leaf=2,
random_state=42
)

# Обучение модели
dt_classifier_pruned.fit(X_train, y_train)

# Получение предсказаний
y_pred_pruned = dt_classifier_pruned.predict(X_test)

# Оценка точности
accuracy_pruned = accuracy_score(y_test, y_pred_pruned)
print(f"Точность модели с ограниченной глубиной: {accuracy_pruned:.4f}")

Scikit-learn также позволяет получать вероятности принадлежности к классам:

Python
Скопировать код
# Получение вероятностей принадлежности к каждому классу
probabilities = dt_classifier.predict_proba(X_test)
print("Вероятности для первых 5 тестовых образцов:")
for i in range(5):
print(f"Образец {i+1}: {probabilities[i]}")

После обучения модели можно получить доступ к различным атрибутам дерева:

  • featureimportances — важность каждого признака
  • tree_ — структура построенного дерева
  • classes_ — классы, используемые при обучении
  • nfeaturesin_ — количество признаков при обучении

Пример анализа важности признаков:

Python
Скопировать код
# Вывод важности признаков
feature_importance = pd.DataFrame({
'Feature': iris.feature_names,
'Importance': dt_classifier.feature_importances_
}).sort_values(by='Importance', ascending=False)

print(feature_importance)

Настройка гиперпараметров для оптимизации модели

Эффективность модели решающего дерева сильно зависит от выбора гиперпараметров. Оптимальная настройка позволяет найти баланс между переобучением и недообучением модели. Scikit-learn предоставляет удобные инструменты для автоматизации этого процесса. 🔧

Основные гиперпараметры, требующие настройки:

Гиперпараметр Описание Типичные значения Влияние на модель
max_depth Максимальная глубина дерева 3-20 (или None) Ограничивает сложность дерева; предотвращает переобучение
minsamplessplit Минимум образцов для разделения узла 2-20 Контролирует процесс разделения; сдерживает переобучение
minsamplesleaf Минимум образцов в листовом узле 1-10 Обеспечивает минимальный размер листа; улучшает обобщаемость
criterion Функция для измерения качества разделения 'gini', 'entropy' (классификация); 'mse', 'mae' (регрессия) Определяет метод оценки разделений; влияет на структуру дерева
max_features Максимум признаков для рассмотрения при разделении 'auto', 'sqrt', 'log2' или числовое значение Вводит случайность; полезно для ансамблевых методов

Для автоматического подбора оптимальных значений гиперпараметров можно использовать GridSearchCV или RandomizedSearchCV:

Python
Скопировать код
from sklearn.model_selection import GridSearchCV

# Определение сетки параметров
param_grid = {
'criterion': ['gini', 'entropy'],
'max_depth': [None, 3, 5, 7, 10],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4]
}

# Создание базовой модели
dt = DecisionTreeClassifier(random_state=42)

# Настройка поиска по сетке
grid_search = GridSearchCV(
estimator=dt,
param_grid=param_grid,
cv=5, # 5-кратная перекрестная проверка
scoring='accuracy',
n_jobs=-1, # использовать все доступные ядра процессора
verbose=1
)

# Выполнение поиска оптимальных параметров
grid_search.fit(X_train, y_train)

# Вывод лучших параметров и результатов
print(f"Лучшие параметры: {grid_search.best_params_}")
print(f"Лучшая точность при кросс-валидации: {grid_search.best_score_:.4f}")

# Оценка модели с лучшими параметрами на тестовых данных
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"Точность оптимизированной модели на тестовых данных: {accuracy_best:.4f}")

Для больших наборов данных или широкого пространства параметров RandomizedSearchCV может быть более эффективным:

Python
Скопировать код
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform

# Определение распределений для параметров
param_distributions = {
'criterion': ['gini', 'entropy'],
'max_depth': [None] + list(randint(3, 20).rvs(10)),
'min_samples_split': randint(2, 20).rvs(10),
'min_samples_leaf': randint(1, 10).rvs(10),
'max_features': ['auto', 'sqrt', 'log2', None]
}

# Создание случайного поиска
random_search = RandomizedSearchCV(
estimator=dt,
param_distributions=param_distributions,
n_iter=100, # Количество комбинаций для проверки
cv=5,
scoring='accuracy',
n_jobs=-1,
random_state=42,
verbose=1
)

# Выполнение поиска
random_search.fit(X_train, y_train)

print(f"Лучшие параметры: {random_search.best_params_}")
print(f"Лучшая точность при кросс-валидации: {random_search.best_score_:.4f}")

Дополнительные техники оптимизации деревьев решений:

  • Пре-прунинг — ограничение роста дерева во время построения с помощью параметров maxdepth, minsamples_split и др.
  • Пост-прунинг — обрезка ветвей уже построенного дерева (в scikit-learn реализуется через cost complexity pruning)
  • Ансамблевые методы — объединение нескольких деревьев для улучшения качества (Random Forest, Gradient Boosting)
  • Балансировка классов — использование параметра class_weight для работы с несбалансированными данными

Пример использования cost complexity pruning:

Python
Скопировать код
from sklearn.tree._tree import TREE_LEAF

# Обучение полного дерева
dt_full = DecisionTreeClassifier(random_state=42)
path = dt_full.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities

# Обучение деревьев с разными значениями ccp_alpha
dt_models = []
for ccp_alpha in ccp_alphas:
dt = DecisionTreeClassifier(random_state=42, ccp_alpha=ccp_alpha)
dt.fit(X_train, y_train)
dt_models.append(dt)

# Оценка точности моделей
train_scores = [dt.score(X_train, y_train) for dt in dt_models]
test_scores = [dt.score(X_test, y_test) for dt in dt_models]

# Выбор оптимального значения ccp_alpha
optimal_idx = np.argmax(test_scores)
optimal_alpha = ccp_alphas[optimal_idx]
print(f"Оптимальное значение ccp_alpha: {optimal_alpha:.6f}")
print(f"Точность на тестовых данных: {test_scores[optimal_idx]:.4f}")

Визуализация и интерпретация решающих деревьев

Одно из главных преимуществ решающих деревьев — их интерпретируемость. Scikit-learn предлагает несколько способов визуализации деревьев, что делает анализ и объяснение модели более доступными. 📊

Рассмотрим основные методы визуализации решающих деревьев:

Python
Скопировать код
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

# Создание и обучение модели на данных Iris
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X_train, y_train)

# Базовая визуализация дерева
plt.figure(figsize=(15, 10))
plot_tree(dt, 
feature_names=iris.feature_names, 
class_names=iris.target_names,
filled=True, 
rounded=True)
plt.title("Дерево решений для набора данных Iris")
plt.show()

Для создания более детальной и настраиваемой визуализации можно использовать экспорт дерева в формат DOT и библиотеку Graphviz:

Python
Скопировать код
from sklearn.tree import export_graphviz
import graphviz

# Экспорт дерева в DOT формат
dot_data = export_graphviz(
dt,
out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True,
rounded=True,
special_characters=True,
proportion=True
)

# Создание графического представления
graph = graphviz.Source(dot_data)
graph.render("iris_decision_tree", format="png") # Сохранение изображения
graph # Отображение графа

Интерпретация построенного дерева включает анализ:

  • Структуры дерева — глубина, количество узлов, сложность
  • Правил разделения — какие признаки и пороговые значения используются
  • Важности признаков — какие переменные вносят наибольший вклад
  • Путей принятия решений — последовательность проверок для конкретных предсказаний

Визуализация важности признаков:

Python
Скопировать код
# Расчет и визуализация важности признаков
importances = dt.feature_importances_
feature_names = iris.feature_names
indices = np.argsort(importances)[::-1]

plt.figure(figsize=(10, 6))
plt.title("Важность признаков в модели дерева решений")
plt.bar(range(len(indices)), importances[indices], align='center')
plt.xticks(range(len(indices)), [feature_names[i] for i in indices], rotation=90)
plt.tight_layout()
plt.show()

Михаил Ковалев, руководитель отдела анализа данных

В 2022 году наша команда работала над проектом по прогнозированию эффективности маркетинговых кампаний для крупного ритейлера. Перед нами стояла задача не просто создать модель с высокой точностью, но и объяснить руководству, какие факторы влияют на успех кампаний.

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

Тем не менее, я реализовал модель с помощью DecisionTreeClassifier из scikit-learn, тщательно настроил гиперпараметры и визуализировал результат. На презентации для топ-менеджмента произошло то, чего не случалось никогда ранее — руководители не просто кивали в знак согласия, они активно задавали вопросы и сразу выделили бюджет на оптимизацию процессов на основе выявленных закономерностей.

Оказалось, что ключевыми факторами успеха были не размер бюджета или охват, как все предполагали, а сочетание времени запуска кампании с определенными демографическими характеристиками аудитории. Эти инсайты помогли компании перераспределить маркетинговые бюджеты и повысить ROI на 34% в течение следующих двух кварталов.

Для более глубокого понимания процесса принятия решений деревом можно проследить путь конкретного примера через дерево:

Python
Скопировать код
# Функция для отслеживания пути через дерево
def trace_path(tree, feature_names, sample):
feature = tree.feature
threshold = tree.threshold
node_indicator = tree.decision_path([sample]).toarray()[0]
leaf_id = tree.apply([sample])[0]

path = []
for node_id in range(len(node_indicator)):
if node_indicator[node_id] == 1:
if leaf_id == node_id:
path.append(f"Лист {node_id}: Предсказание = {tree.value[node_id]}")
else:
feature_name = feature_names[feature[node_id]]
if sample[feature[node_id]] <= threshold[node_id]:
path.append(f"Узел {node_id}: {feature_name} <= {threshold[node_id]:.2f} -> Да")
else:
path.append(f"Узел {node_id}: {feature_name} <= {threshold[node_id]:.2f} -> Нет")
return path

# Отслеживание пути для конкретного примера
sample_idx = 10 # Индекс примера для анализа
sample = X_test[sample_idx]
tree = dt.tree_
path = trace_path(tree, iris.feature_names, sample)
print(f"Путь для примера {sample_idx}:")
for step in path:
print(step)
print(f"Фактический класс: {iris.target_names[y_test[sample_idx]]}")
print(f"Предсказанный класс: {iris.target_names[dt.predict([sample])[0]]}")

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

  • Ограничивать глубину дерева для визуализации (max_depth=3 или 4)
  • Фокусироваться на верхних уровнях дерева, где принимаются наиболее важные решения
  • Использовать методы упрощения (pruning) перед визуализацией
  • Анализировать важность признаков вместо полной структуры дерева

Практические кейсы использования метода в реальных задачах

Метод решающих деревьев находит применение в различных областях благодаря своей интерпретируемости и эффективности. Рассмотрим несколько практических кейсов с примерами реализации на Python с использованием scikit-learn. 🚀

1. Прогнозирование оттока клиентов (Customer Churn)

Одно из классических применений решающих деревьев — предсказание ухода клиентов. Компании используют эти модели для выявления потенциально уходящих клиентов и принятия превентивных мер.

Python
Скопировать код
# Пример предсказания оттока клиентов
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, roc_auc_score

# Загрузка данных (пример с телеком-данными)
df = pd.read_csv('telecom_churn.csv')

# Предобработка данных
categorical_cols = df.select_dtypes(include=['object']).columns
for col in categorical_cols:
le = LabelEncoder()
df[col] = le.fit_transform(df[col])

# Разделение на признаки и целевую переменную
X = df.drop('Churn', axis=1)
y = df['Churn']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Создание и обучение модели
dt_churn = DecisionTreeClassifier(
max_depth=5,
min_samples_leaf=50,
class_weight='balanced',
random_state=42
)
dt_churn.fit(X_train, y_train)

# Оценка модели
y_pred = dt_churn.predict(X_test)
y_prob = dt_churn.predict_proba(X_test)[:, 1]

print(classification_report(y_test, y_pred))
print(f"ROC AUC: {roc_auc_score(y_test, y_prob):.4f}")

# Анализ важности признаков
feature_importance = pd.DataFrame({
'Feature': X.columns,
'Importance': dt_churn.feature_importances_
}).sort_values(by='Importance', ascending=False).head(10)

print("Топ-10 факторов, влияющих на отток:")
print(feature_importance)

2. Медицинская диагностика

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

Python
Скопировать код
# Пример диагностики заболеваний сердца
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer

# Загрузка данных о раке молочной железы
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target

# Создание модели
dt_medical = DecisionTreeClassifier(
max_depth=4,
min_samples_split=10,
random_state=42
)

# Оценка с использованием перекрестной проверки
scores = cross_val_score(dt_medical, X, y, cv=5, scoring='accuracy')
print(f"Средняя точность при 5-кратной перекрестной проверке: {scores.mean():.4f}")

# Обучение на всем наборе данных
dt_medical.fit(X, y)

# Создание правил диагностики на основе дерева
def extract_rules(tree, feature_names, class_names):
tree_ = tree.tree_
feature_name = [
feature_names[i] if i != _tree.TREE_UNDEFINED else "undefined!"
for i in tree_.feature
]

paths = []
path = []

def recurse(node, path, paths):
if tree_.feature[node] != _tree.TREE_UNDEFINED:
name = feature_name[node]
threshold = tree_.threshold[node]

# Левый узел (признак <= порога)
path.append(f"({name} <= {threshold:.2f})")
recurse(tree_.children_left[node], path, paths)
path.pop()

# Правый узел (признак > порога)
path.append(f"({name} > {threshold:.2f})")
recurse(tree_.children_right[node], path, paths)
path.pop()
else:
class_idx = np.argmax(tree_.value[node][0])
class_name = class_names[class_idx]
paths.append((path.copy(), class_name))

recurse(0, path, paths)

# Преобразование путей в правила
rules = []
for path, outcome in paths:
rule = "Если " + " И ".join(path) + f", то {outcome}"
rules.append(rule)

return rules

# Получение правил диагностики
rules = extract_rules(dt_medical, cancer.feature_names, ['злокачественная', 'доброкачественная'])
for i, rule in enumerate(rules[:5], 1): # выводим только первые 5 правил
print(f"Правило {i}: {rule}")

3. Кредитный скоринг

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

Python
Скопировать код
# Пример кредитного скоринга
from sklearn.model_selection import KFold
from sklearn.metrics import precision_recall_fscore_support
from imblearn.over_sampling import SMOTE

# Предположим, у нас есть данные о кредитах
# X – признаки клиентов, y – метка дефолта (1 – дефолт, 0 – возврат кредита)

# Обработка несбалансированных классов с помощью SMOTE
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

# Создание модели с настройкой для несбалансированных данных
dt_credit = DecisionTreeClassifier(
max_depth=6,
min_samples_split=30,
min_samples_leaf=20,
class_weight={0: 1, 1: 5}, # штраф за ложноотрицательные результаты
random_state=42
)

# Обучение модели
dt_credit.fit(X_resampled, y_resampled)

# Оценка с акцентом на precision для класса "дефолт"
y_pred = dt_credit.predict(X_test)
precision, recall, f1, _ = precision_recall_fscore_support(y_test, y_pred)
print(f"Precision для класса 'дефолт': {precision[1]:.4f}")
print(f"Recall для класса 'дефолт': {recall[1]:.4f}")
print(f"F1-score для класса 'дефолт': {f1[1]:.4f}")

4. Рекомендательные системы

Решающие деревья могут использоваться как компонент рекомендательных систем, особенно при контекстных рекомендациях:

Python
Скопировать код
# Пример простой рекомендательной системы
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

# Предположим, у нас есть данные о пользователях, товарах и покупках
# df_interactions содержит информацию о взаимодействиях пользователей с товарами

# Подготовка признаков
categorical_features = ['user_age_group', 'user_gender', 'product_category', 'day_of_week']
numerical_features = ['user_previous_purchases', 'product_price', 'product_rating']

preprocessor = ColumnTransformer(
transformers=[
('num', 'passthrough', numerical_features),
('cat', OneHotEncoder(), categorical_features)
])

X = preprocessor.fit_transform(df_interactions[numerical_features + categorical_features])
y = df_interactions['purchased'] # 1 – купил, 0 – не купил

# Создание и обучение модели
dt_recommender = DecisionTreeClassifier(max_depth=8, random_state=42)
dt_recommender.fit(X, y)

# Функция для получения рекомендаций для пользователя
def get_recommendations(user_id, product_ids, top_n=5):
user_data = df_users[df_users['user_id'] == user_id].iloc[0]
product_data = df_products[df_products['product_id'].isin(product_ids)]

# Создание признаков для всех комбинаций пользователь-товар
interactions = []
for _, product in product_data.iterrows():
interaction = {
'user_age_group': user_data['age_group'],
'user_gender': user_data['gender'],
'user_previous_purchases': user_data['previous_purchases'],
'product_category': product['category'],
'product_price': product['price'],
'product_rating': product['rating'],
'day_of_week': datetime.now().strftime('%A')
}
interactions.append(interaction)

# Преобразование данных
X_pred = preprocessor.transform(pd.DataFrame(interactions))

# Получение вероятностей покупки
purchase_probs = dt_recommender.predict_proba(X_pred)[:, 1]

# Сортировка товаров по вероятности покупки
product_probs = list(zip(product_ids, purchase_probs))
recommendations = sorted(product_probs, key=lambda x: x[1], reverse=True)[:top_n]

return recommendations

# Пример использования
recommended_products = get_recommendations(user_id=123, product_ids=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print("Рекомендуемые товары:")
for product_id, prob in recommended_products:
print(f"Товар {product_id}: вероятность покупки {prob:.4f}")

Решающие деревья также успешно применяются в таких областях, как:

  • Прогнозирование цен на недвижимость — оценка стоимости объектов на основе их характеристик
  • Обнаружение мошенничества — выявление подозрительных транзакций или активностей
  • Сегментация клиентов — разделение клиентской базы на группы для таргетированного маркетинга
  • Прогнозирование отказов оборудования — предсказание возможных поломок на основе показателей датчиков
  • Анализ текстов — классификация документов, определение тональности отзывов

Метод решающих деревьев – один из наиболее интуитивно понятных алгоритмов машинного обучения, который остаётся востребованным даже в эпоху сложных нейронных сетей. Его сила заключается в прозрачности процесса принятия решений, что критически важно в областях, где требуется объяснимость модели. Реализация с помощью scikit-learn делает этот метод доступным для широкого круга задач – от классификации данных до регрессионного анализа. При этом важно помнить о правильной настройке гиперпараметров и применении техник, предотвращающих переобучение. Глубокое понимание решающих деревьев формирует прочную основу для изучения более сложных ансамблевых методов, таких как случайный лес и градиентный бустинг, позволяя специалистам по данным создавать действительно эффективные решения для реальных задач бизнеса и науки.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какова основная идея метода решающих деревьев?
1 / 5

Загрузка...