Требуется ли для деревьев решений масштабирование функций?

Требуется ли масштабирование функций для методов дерева решений и ансамбля?

Алгоритмы машинного обучения всегда были на пути к эволюции с момента своего появления. Сегодня эта область прошла долгий путь от математического моделирования до ансамблевого моделирования и многого другого. Эта эволюция привела к появлению более надежных моделей SOTA, которые почти ликвидируют разрыв между потенциальными возможностями человека и искусственного интеллекта. Моделирование ансамбля дало нам одну из тех моделей SOTA XGBoost.

Проблема найма

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

Мои обычные процедуры начинались с загрязнения рук на очистке данных, предварительной обработке данных, EDA и повышении дискретизации класса (поскольку набор обучающих данных был несбалансированным). В рамках EDA я обнаружил, что функции набора данных сильно различаются. Поэтому я планировал масштабировать функции с помощью MinMax Scaler.

#Feature Preprocessing and Feature Transformation:

def feature_preprocess_transformation(data):
    global train,test
#   data['X_12']=data['X_12'].fillna(value=1.0).astype(int)                                                    
#   scaler=MinMaxScaler(feature_range=(0,4))
#   for j in to_normalize:
#        data[j]=scaler.fit_transform(data[j].values.reshape(-1,1)).astype(int)



#Calling the preprocessing function for Train and Test Data

feature_preprocess_transformation(train)
feature_preprocess_transformation(test)

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

xgb=XGBClassifier()
xgb.fit(X_train,y_train)
y_pred=xgb.predict(X_test)

tn,fp,fn,tp=confusion_matrix(y_test,y_pred).ravel()
recall=recall_score(y_test,y_pred)
precision=precision_score(y_test,y_pred)
print('\n','Recall : '+str(recall))
print('\n','TN : '+str(tn),'\n','FP : '+str(fp),'\n','FN : '+str(fn),'\n','TP : '+str(tp))

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

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

def feature_preprocess_transformation(data):
    global train,test
    data['X_12']=data['X_12'].fillna(value=1.0).astype(int)                                                   
#   scaler=MinMaxScaler(feature_range=(0,4))
#   for j in to_normalize:
# data[j]=scaler.fit_transform(data[j].values.reshape(-1,1)).astype(int)
xgb=XGBClassifier()
xgb.fit(X_train,y_train)
y_pred=xgb.predict(X_test)

tn,fp,fn,tp=confusion_matrix(y_test,y_pred).ravel()
recall=recall_score(y_test,y_pred)
precision=precision_score(y_test,y_pred)
print('\n','Recall : '+str(recall))
print('\n','TN : '+str(tn),'\n','FP : '+str(fp),'\n','FN : '+str(fn),'\n','TP : '+str(tp))

Как видно ниже, показатель отзыва был улучшен до 1,0, и модель смогла более эффективно классифицировать отрицательный класс с меньшим количеством ложноположительных результатов.

Интуиция

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

Забрать

  • Деревья решений и методы ансамбля не требуют масштабирования функций, поскольку они не чувствительны к дисперсии данных.

использованная литература

Https://paperswithcode.com/paper/xgboost-a-scalable-tree-boosting-system