Требуется ли для деревьев решений масштабирование функций?
Требуется ли масштабирование функций для методов дерева решений и ансамбля?
Алгоритмы машинного обучения всегда были на пути к эволюции с момента своего появления. Сегодня эта область прошла долгий путь от математического моделирования до ансамблевого моделирования и многого другого. Эта эволюция привела к появлению более надежных моделей 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