Все древовидные модели могут решить проблему регрессии — спрогнозировать число. В Scikit-learn, DecisionTreeRegressor и RandomForestRegressor реализуют регрессионную вариацию моделей. В XGBoost нам потребуется изменить цель на reg:squarederror
В XGBoost параметр colsample_bytree управляет количеством признаков, которые мы выбираем для каждого дерева, — это похоже на max_features для случайного леса. Поэкспериментируйте с этим параметром и посмотрите, улучшает ли он производительность: попробуйте значения от 0,1 до 1,0 с шагом 0,1. Обычно оптимальные значения находятся в диапазоне от 0,6 до 0,8, но иногда 1,0 дает наилучший результат.
Прежде чем мы сможем обучить модель XGBoost, нам придется обернуть наши данные в DMatrix — специальную структуру данных для эффективного поиска разбиений. Так и сделаем:
dtrain = xgb.DMatrix(X_train, label=y_train, feature_names=dv.feature_names_)
Чтобы использовать случайный лес в Scikit-learn, нам нужно импортировать RandomForestClassifier из пакета ensemble:
from sklearn.ensemble import RandomForestClassifier
Наиболее распространенными критериями остановки являются следующие:
• группа уже чиста;
• дерево достигло предела глубины (контролируется max_depth);
• группа слишком мала, чтобы продолжать разделение (контролируется параметром min_samples_leaf).
Визуализировать полученное дерево можно с помощью функции export_text из пакета tree:
from sklearn.tree import export_text
tree_text = export_text(dt, feature_names=dv.feature_names_)
print(tree_text)
У нас есть несколько способов, позволяющих контролировать сложность дерева. Одним из вариантов является ограничение размера: мы можем указать параметр max_depth, который управляет максимальным количеством уровней. Чем больше уровней имеет дерево, тем более сложные правила оно может усвоить (рис. 6.9).
Удаляем с помощью оператора del:
del df_train['status']
del df_val['status']
Сначала мы оставим 20 % данных для тестирования, а затем разделим оставшиеся 80 % на обучающие и проверочные:
from sklearn.model_selection import train_test_split
df_train_full, df_test = train_test_split(df, test_size=0.2, random_state=11)
df_train, df_val = train_test_split(df_train_full, test_size=0.25,