Я построил модель 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](https://i.stack.imgur.com/Inycy.png)
Выполнение вышеуказанного с booleanize
и to_int
, установленными на False
, приводит к следующей диаграмме:
![enter image description here](https://i.stack.imgur.com/T72xr.png)
Черт, даже если я приведу действительно простой пример, я получу «правильные» результаты, независимо от того, являются ли 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](https://i.stack.imgur.com/zInTO.png)