xgboost.plot_tree: интерпретация двоичной функции - PullRequest
0 голосов
/ 13 сентября 2018

Я построил модель XGBoost и хочу изучить отдельные оценки. Для справки, это была задача двоичной классификации с дискретными и непрерывными входными характеристиками. Матрица входных объектов: scipy.sparse.csr_matrix.

Однако, когда я пошел исследовать отдельную оценку, я столкнулся с трудностями при интерпретации функций двоичного ввода, таких как f60150 ниже. Реальное значение f60150 на самом нижнем графике легко интерпретировать - его критерий находится в ожидаемом диапазоне этой функции. Тем не менее, сравнение, сделанное для бинарных функций, <X> < -9.53674e-07 не имеет смысла. Каждая из этих функций - либо 1, либо 0. -9.53674e-07 - это очень маленькое отрицательное число, и я представляю, что это просто некоторая идиосинкразия с плавающей запятой внутри XGBoost или его базовых библиотек построения графиков, но использовать это сравнение не имеет смысла. когда функция всегда положительная. Может ли кто-нибудь помочь мне понять, какое направление (т. Е. yes, missing против no соответствует какой истинной / ложной стороне этих узлов двоичных объектов?

Вот воспроизводимый пример:

import numpy as np
import scipy.sparse
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from xgboost import plot_tree, XGBClassifier
import matplotlib.pyplot as plt

def booleanize_csr_matrix(mat):
    ''' Convert sparse matrix with positive integer elements to 1s '''
    nnz_inds = mat.nonzero()
    keep = np.where(mat.data > 0)[0]
    n_keep = len(keep)
    result = scipy.sparse.csr_matrix(
        (np.ones(n_keep), (nnz_inds[0][keep], nnz_inds[1][keep])),
        shape=mat.shape
    )
    return result

### Setup dataset
res = fetch_20newsgroups()

text = res.data
outcome = res.target

### Use default params from CountVectorizer to create initial count matrix
vec = CountVectorizer()
X = vec.fit_transform(text)

# Whether to "booleanize" the input matrix
booleanize = True

# Whether to, after "booleanizing", convert the data type to match what's returned by `vec.fit_transform(text)`
to_int = True

if booleanize and to_int:
    X = booleanize_csr_matrix(X)
    X = X.astype(np.int64)

# Make it a binary classification problem
y = np.where(outcome == 1, 1, 0)

# Random state ensures we will be able to compare trees and their features consistently
model = XGBClassifier(random_state=100)
model.fit(X, y)

plot_tree(model, rankdir='LR'); plt.show()

Выполнение вышеуказанного с booleanize и to_int, установленными на True, приводит к следующей диаграмме:

enter image description here

Выполнение вышеуказанного с booleanize и to_int, установленными на False, приводит к следующей диаграмме:

enter image description here

Черт, даже если я приведу действительно простой пример, я получу «правильные» результаты, независимо от того, являются ли X или y целочисленными или плавающими типами.

X = np.matrix(
    [
        [1,0],
        [1,0],
        [0,1],
        [0,1],
        [1,1],
        [1,0],
        [0,0],
        [0,0],
        [1,1],
        [0,1]
    ]
)

y = np.array([1,0,0,0,1,1,1,0,1,1])

model = XGBClassifier(random_state=100)
model.fit(X, y)

plot_tree(model, rankdir='LR'); plt.show()

enter image description here

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