Sklearn - Важность перестановки приводит к ненулевым значениям для нулевых коэффициентов в модели

Меня смущает функция sklearn permutation_importance. Я установил конвейер с регуляризованной логистической регрессией, что привело к несколько коэффициентов признаков равны 0. Однако, когда я хочу рассчитать важность перестановки функций в наборе тестовых данных, некоторые из этих функций получают ненулевые значения важности. Как это может быть, если они не вносят вклад в классификатор?

Вот пример кода и данных:

import numpy as np    
from sklearn.datasets import make_classification
from sklearn.model_selection import RepeatedStratifiedKFold
import scipy.stats as stats
from sklearn.utils.fixes import loguniform
from sklearn.preprocessing import StandardScaler
from sklearn.impute import KNNImputer
from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.inspection import permutation_importance


# create example data with missings
X, y = make_classification(n_samples = 500,
                           n_features = 100,
                           n_informative = 25,
                           n_redundant = 75,
                           random_state = 0)
c = 10000 # number of missings
X.ravel()[np.random.choice(X.size, c, replace = False)] = np.nan # introduce random missings
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size = 0.2, random_state = 0)

folds = 5
repeats = 5
n_iter = 25
rskfold = RepeatedStratifiedKFold(n_splits = folds, n_repeats = repeats, random_state = 1897)

scl = StandardScaler()
imp = KNNImputer(n_neighbors = 5, weights = 'uniform')
sgdc = SGDClassifier(loss = 'log', penalty = 'elasticnet', class_weight = 'balanced', random_state = 0)

pipe = Pipeline([('scaler', scl),
                 ('imputer', imp),
                 ('clf', sgdc)])
param_rand = {'clf__l1_ratio': stats.uniform(0, 1),
              'clf__alpha': loguniform(0.001, 1)}

m = RandomizedSearchCV(pipe, param_rand, n_iter = n_iter, cv = rskfold, scoring = 'accuracy', random_state = 0, verbose = 1, n_jobs = -1)
m.fit(Xtrain, ytrain)

coefs = m.best_estimator_.steps[2][1].coef_
print('Number of non-zero feature coefficients in classifier:')
print(np.sum(coefs != 0))

imps = permutation_importance(m, Xtest, ytest, n_repeats = 25, random_state = 0, n_jobs = -1)

print('Number of non-zero feature importances after permutations:')
print(np.sum(imps['importances_mean'] != 0))

Вы увидите, что второе напечатанное число не совпадает с первым...

Любая помощь высоко ценится!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому что у тебя есть KNNImputer. Признак с нулевым коэффициентом в модели по-прежнему влияет на импутацию других столбцов и, таким образом, может изменить прогнозы всего конвейера при перестановке и, следовательно, может иметь ненулевую важность перестановки.

спасибо, в этом есть смысл. хотя такая «косвенная» важность не совсем то, что я ищу. Знаете ли вы, есть ли обходной путь, т. Е. Могу ли я заставить перестановки происходить после вменения?

RamsesII 16.05.2022 10:51

Конечно: преобразуйте данные, используя остальную часть конвейера (m.best_estimator_[:-1].transform(X_test)) и вызовите permutation_importance только модель m.best_estimator_[-1]) и преобразованные данные.

Ben Reiniger 16.05.2022 14:38

Другие вопросы по теме