Во время расчета значения формы произошла ошибка ядра.Python

Программы на Python
Ответить
Anonymous
 Во время расчета значения формы произошла ошибка ядра.

Сообщение Anonymous »

Я пытаюсь предсказать возникновение определенного явления, используя данные около 9500 человек с 36-37 элементами-предикторами, используя sklearn. Это проблема бинарной классификации (происходит или не возникает). В конечном итоге я хочу предсказать, произойдет ли это с этим человеком, используя эти 36-37 предикторов.
Данные были разделены на 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»