Другой прогноз со случайным лесом, чем при применении значений Шепли? - PullRequest
0 голосов
/ 09 июля 2020

Я строю RF-модель для прогнозирования рака шейки матки на основе биопсии ( данные ).

Затем я пытаюсь объяснить предсказания, используя точные значения. Для этого я использую библиотеку mli в R.

Однако я сталкиваюсь с проблемами:

  1. Прогнозируемые вероятности из случайного леса и значений shapley различаются. Я предполагаю, что это можно отнести к выборке M C, но, тем не менее, это немного беспокоит.
  2. реальная проблема : когда я получаю значения shapley для данного прогноза, сумма вклады + средняя вероятность класса не составляют окончательного прогноза . Этого не должно происходить из того, что в пакете ссылка указано в качестве свойства эффективности этих значений

Я попытался преобразовать его, предполагая, что в формуле используется логарифм. шансы трансформации под капотом, но ничего толкового не выходит.

Есть идеи?

Код для воспроизведения (скачать набор данных по этой ссылке ):

library(iml)
library(randomForest)

testdf <- read.csv('./M2ER/risk_factors_cervical_cancer.csv')

table(testdf$Biopsy)

## subset variables to the ones that should be used in the book
cervical = dplyr::select(testdf, Age, Number.of.sexual.partners, First.sexual.intercourse,
                         Num.of.pregnancies, Smokes, Smokes..years., Hormonal.Contraceptives, Hormonal.Contraceptives..years.,
                         IUD, IUD..years., STDs, STDs..number., STDs..Number.of.diagnosis, STDs..Time.since.first.diagnosis,
                         STDs..Time.since.last.diagnosis, Biopsy)

# NA imputation
imputer = mlr::imputeMode()


cervical_impute = mlr::impute(cervical, classes = list(numeric = mlr::imputeMode()))
cervical = cervical_impute$data


testmod <- randomForest(as.factor(Biopsy)~., data = cervical)

predict(testmod, cervical, type='prob')[1,]

predictor <- Predictor$new(model=testmod, data = cervical %>% select(-Biopsy), 
                           y = as.factor(cervical$Biopsy), 
                           type="prob")
shapley <- Shapley$new(predictor, x.interest = (cervical %>% select(-Biopsy))[1, ], sample.size = 100)
shapley$plot()
shapley$y.hat.interest
shapley$y.hat.average
shapley$results %>% filter(class==1) %>% summarise(sum(phi)) #should be equal to the difference between y.hat.interest and y.hat.average
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...