Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Машинное обучение. Отбор признаков при построении модели

#python #машинное_обучение #scikit_learn


Построил 2 модели кредитного скоринга (задача бинарной классификации) на XGBoost
и RandomForest. Накидал из БД различных фичей, около 60, загрузил. Построил график
значимости признаков.

1) Стоит ли усекать количество фичей, если по графику видно, что значимости они не
несут, если да, то по какой линии? (график прикреплен снизу)

2) Стоит ли оставлять бинарные фичи, в которых соотношение категорий например 90
на 10% и они не входят, скажем, в первую 10ку самых значимых признаков?

3) Каким образом может повлиять на модель и конкретно на эффективность модели бустинга
и случайного леса, если оставить все эти "маловлиятельные" признаки?

Или же нужно ориентироваться чисто на какие-либо метрики вроде auc-roc, gini, accuracy?
Грубо говоря - убрал\добавил, посмотрел на значение метрики увеличилась\нет и опять
заного..

Подскажите.



Функция отрисовки графика:

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer as Imputer
from sklearn import ensemble
from xgboost import XGBClassifier
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, StratifiedKFold, GridSearchCV
from scipy.interpolate import interp1d
from scipy.integrate import quad
from sklearn.metrics import roc_auc_score, roc_curve, confusion_matrix, mean_squared_error,
classification_report
import itertools
# (присутствуют лишние импорты)

def MY_plotting_feature_priority(X, model, n=3):
    importances = model.feature_importances_
    indices = np.argsort(importances)[::-1]
    feature_names = X.columns
    d_first = X.shape[1]
    plt.figure(figsize=(8, 8))
    plt.title("Значимость признаков")
    plt.bar(range(d_first), importances[indices[:d_first]], align='center')
    plt.xticks(range(d_first), np.array(feature_names)[indices[:d_first]], rotation=90)
    plt.xlim([-1, d_first])
    best_features = indices[:n]
    best_features_names = feature_names[best_features]
    print(f'Первые {n} значимых признаков {list(best_features_names)} из {d_first} ')
    plt.show() 

    


Ответы

Ответ 1



Общий ответ на ваш вопрос - все зависит от поставленных целей и стоимости ошибки. Если вы видите, что добавдение-удаление определенного признака на тестовой выборке не приводит к значимому для вас изменению точности прогноза - данные убираем, если приводят- оставляют. Даже если вы будете основываться на формальных метриках, в каждой из них есть порог, который вы сами вольны задать и по которому потом будете принимать решение. Я не знаю, насколько значимо, например, для вашего банка уменьшение ложнонегативных прогнозов на 0.0001%. Может это всего несколько тысяч рублей, что для вашего банка ничто. А вот такое же изменение в медицине - это жизнь конкретных людей. А в психологии - вообще точность порядка 10% считается отличной. Так что как ни крути, но окончательное решение - всегда за вами и оно вне области формального анализа.

Ответ 2



Не знаю, насколько еще актуален вопрос, но вот одно из возможных решений задачи выбора признаков именно для задач кредитного скоринга. http://ai-news.ru/2018/12/open_source_instrument_na_python_dlya_vybora_priznakov_nejroseti.html

Комментариев нет:

Отправить комментарий