Данные были разделены на 80% обучающих данных и 20% тестовых данных и обучены с использованием случайной выборки. модель леса, затем оценивалась с использованием тестовых данных, а гиперпараметры были скорректированы с помощью Gridsearch CV.
Наконец, когда я попытался построить график влияния каждой переменной признака на прогноз с использованием значений Шепли, программа внезапно остановилась во время расчета «shap-value» с сообщением об ошибке «Ядро остановлено». Перезагрузка.... Мы использовали TreeSHAP.
Я пробовал писать код и добавлять обработку исключений, а также исследовал режим отладки с помощью Spyder, но не смог найти никаких подробностей об остановке ядра, кроме того, что она остановилась в библиотека shap_value. Такая же остановка ядра произошла и в JupyterLab.
Изначально при запуске программы с 37 предикторами расчет shap-значения и последующий график значений shap выполнялся без проблем . Мы могли бы построить сводку SHAP, графики пчелиного рая, силы, водопада и зависимости. Это похоже не на глюк программы или нехватку памяти. Когда я сократил один элемент до 36 элементов (независимо от любого предсказателя, который я уменьшаю), начала возникать описанная выше ошибка остановки ядра.
Как устранить эту ошибку?
[*]Только один предиктор является количественной (числовой) переменной, а все остальные являются категориальными (номинальными/порядковыми) переменными.
[*]Python (3.11) .11), Scikit-learn (1.5.1) и shap (0.46.0) были установлены вместе с Anaconda 3.
[*]В качестве ОС используется Windows 11
Код: Выделить всё
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
Length of X_train: 7516
Length of X_test: 1880
#Preprocessing Pipeline
num_tuple = (scaler, num_clms) #number items
cat_tuple = (onehot, cat_clms) #category items
# Preprocessor object
preprocessor = make_column_transformer(num_tuple,
cat_tuple,
sparse_threshold=0,
verbose_feature_names_out=False)
#Baseline Models
#Random Forest
## Instantiate and fit random forest model
rf = RandomForestClassifier()
rf_pipe = make_pipeline(preprocessor, rf)
rf_pipe.fit(X_train, y_train)
#evaluate classification of RandomForestClassifier
#Hyperparameter Tuning with GridSearch CV
#Random Forest
## Get model parameters
rf_pipe.get_params()
## Parameters to be tested
param_grid = {'randomforestclassifier__class_weight': ['balanced'],
'randomforestclassifier__max_depth': [10, 100, 1000],
'randomforestclassifier__max_leaf_nodes': [10, 100, 1000],
'randomforestclassifier__n_estimators': [10, 100]}
## Fit and evaluate
rf_gs = GridSearchCV(rf_pipe, param_grid, verbose=2)
rf_gs.fit(X_train, y_train)
rf_gs.best_params_
## Fit best estimator
best_rf_gs = rf_gs.best_estimator_
best_rf_gs.fit(X_train, y_train)
## Evaluate tuned model
#evaluate classification of "RandomForest best estimator"
best_rf_gs
## Instantiate and fit random forest model
rf = RandomForestClassifier(class_weight='balanced', max_depth=1000,
n_estimators=10, max_leaf_nodes=10
)
rf_pipe = make_pipeline(preprocessor, rf)
rf_pipe.fit(X_train, y_train)
## Evaluate tuned model
#evaluate classification of "RandomForest Evaluate tuned model"
# Define models
models = {
'Random Forest': RandomForestClassifier(class_weight='balanced',
max_depth=1000,
n_estimators=10, max_leaf_nodes=10
)
}
# Assess models
#Assess models with preprocessor and display the report
#Final Model Explanation
# Access the RandomForestClassifier from the pipeline
rf_classifier = best_rf_gs.named_steps['randomforestclassifier']
# Create a SHAP explainer
explainer = shap.TreeExplainer(rf_classifier)
try:
shap_values = explainer(X_test, check_additivity=False) #Kernel stop error here
except:
traceback.print_exc()
print(explainer)
type(shap_values)
print(np.shape(shap_values))
#shap bar plot
clustering = shap.utils.hclust(X_test, y_test) shap.plots.bar(shap_values[:,:,0], max_display=40, clustering=clustering, clustering_cutoff= 0.5 )
Я поискал в Интернете и попробовал следующие меры, но ни одна из них не привела к какому-либо улучшению.
- Я ввел обработку исключений, но нам не удалось получить никакой информации, когда и где возникла проблема.
- Я попробовал обновить версии shap, scikit-learn и Python последней версии, но ошибки все равно были.
- Я пробовал уменьшить размер данных (до половины количества людей), но улучшения не было.
Кроме того, изменение количества предикторов с 36 на 30 или 20 не улучшило ситуацию. - Я учел возможность нехватки памяти, поэтому проверил использование в диспетчере задач. Я попробовал запустить программу с проверкой отладчиком, но никакой полезной информации получить не удалось. Так как с 37 элементами программа работает хорошо, то вряд ли просто не хватает памяти или это единственная причина последующих ошибок.
- Я также проверял ошибки в кодировании с помощью отладчика , операторы печати и т. д. Как и в случае с приведенными выше элементами, были случаи, когда программа работала хорошо, поэтому это не похоже на простую ошибку кода.
Подробнее здесь: https://stackoverflow.com/questions/793 ... alculation
Мобильная версия