Keyerror: вес. Реализуйте XGBoost только для функций, выбранных feature_importance - PullRequest
1 голос
/ 04 апреля 2020

Использование XGBoost Важность функций Я получаю значения функций для моего фрейма данных X_train. Мой X_train изначально имел 49 функций. Важность функции XGBoost говорит мне, что из этих 49 функций, какова оценка важности каждой функции. Теперь я хочу узнать, сколько функций использовать в моей модели машинного обучения. Различные пороговые значения, как указано в массиве пороговых значений, соответствуют каждому признаку. Я хочу знать, какой минимальный порог я должен принять, чтобы включить функции. Должен ли я включить все функции выше 0,3 или 0,4 балла et c. Однако я получаю сообщение об ошибке:

from numpy import sort
from sklearn.feature_selection import SelectFromModel
xgb_model = xgb.XGBClassifier(max_depth=5, learning_rate=0.08, n_jobs=-1).fit(X_train, y_train)

thresholds = sort(xgb_model.feature_importances_)

Пороговые значения для всех функций указаны ниже:

[IN]thresholds
[OUT] array([0.        , 0.        , 0.        , 0.        , 0.        ,
   0.        , 0.        , 0.        , 0.        , 0.        ,
   0.        , 0.        , 0.        , 0.        , 0.        ,
   0.00201289, 0.00362736, 0.0036676 , 0.00467797, 0.00532952,
   0.00591741, 0.00630169, 0.00661084, 0.00737418, 0.00741502,
   0.00748773, 0.00753344, 0.00773079, 0.00852909, 0.00859741,
   0.00906814, 0.00929257, 0.00980796, 0.00986394, 0.01056027,
   0.01154695, 0.01190695, 0.01203871, 0.01258377, 0.01301482,
   0.01383268, 0.01390096, 0.02001457, 0.02699436, 0.03168892,
   0.03543754, 0.03578222, 0.13946259, 0.48038903], dtype=float32)

Функция для выбора только наиболее важных функций и создания фрейма данных select_X_train, содержащего то же самое.

for thresh in thresholds:
    # select features using threshold
    selection = SelectFromModel(xgb_model, threshold=thresh, prefit=True)
    select_X_train = selection.transform(X_train)
# train model
    selection_model = XGBClassifier()
    selection_model.fit(select_X_train, y_train)
    # eval model
    select_X_test = selection.transform(X_test)
    y_pred = selection_model.predict(select_X_test)
    predictions = [round(value) for value in y_pred]
    accuracy = accuracy_score(y_test, predictions)
    print("Thresh=%.3f, n=%d, Accuracy: %.2f%%" % (thresh, select_X_train.shape[1], accuracy*100.0))

Я получаю сообщение об ошибке ниже:

----> 4     select_X_train = selection.transform(X_train)
KeyError: 'weight'

Нет столбца по имени веса. Как устранить эту ошибку.

Ожидаемый результат

Thresh=0.00201289, n=33, Accuracy: 77.95% 
#33 features with threshold above 0.002

Thresh=0.00362736, n=34, Accuracy: 76.38%
#34 features with threshold above 0.003

Thresh=0.0036676 , n=35, Accuracy: 77.56%
#35 features with threshold above 0.003 and so on

Поэтому, в основном, возьмите каждый порог и запустите XGBoost и вычислите точность для всех функций с минимальным значением порогового значения, как указано. Например, в первом случае все функции с оценкой не менее 0,00201289 будут учитываться для XGBoost, и будет рассчитана точность. Будут рассмотрены следующие функции с порогом не менее 0,003 и выше и т. Д.

1 Ответ

0 голосов
/ 07 апреля 2020

Я следовал аналогичному руководству и успешно выполнил этот выбор функций на основе порога, опустив его до xgboost == 0,90 .

Также, чтобы избежать нежелательных предупреждений, используйте XGClassifier (цель = 'рег: squarederror')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...