2015-04-29 5 views
0

В настоящее время я работаю над калибровкой вероятности. Я использую метод калибровки, называемый rescaling algorithm - источник http://lem.cnrs.fr/Portals/2/actus/DP_201106.pdf (стр. 7).Калибровка задних вероятностей

алгоритм я написал это:

rescaling_fun = function(x, y, z) { 

    P_korg = z # yhat_test_prob$BAD 

    P_k_C1 = sum(as.numeric(y) - 1)/length(y) # testset$BAD 
    P_kt_C1 = sum(as.numeric(x) - 1)/length(x) # trainset$BAD 
    P_k_C0 = sum(abs(as.numeric(y) - 2))/length(y) 
    P_kt_C0 = sum(abs(as.numeric(x) - 2))/length(x) 

    P_new <- ((P_k_C1/P_kt_C1) * P_korg)/((P_k_C0/P_k_C0) * (1 - P_korg) + (P_k_C0/P_k_C1) * (P_korg)) 

    return(P_new) 
} 

входные значения являются:

1. x - train_set$BAD (actuals of `train set`) 
2. y - test_set$BAD (actuals of `test set`) 
3. z - yhat_test_prob$BAD (prediction on `test set`) 

проблема - значения результата не в пределах диапазона 0 и 1. Не могли бы вы помочь решить проблему?

ответ

1

Ваши формулы для получения проб (P_k_C1 ...) необходимо изменить. Например, согласно документу y представляет собой двоичную переменную (0, 1), а формула равна sum(y - 1)/length(y), которая, скорее всего, будет отрицательной, она преобразует значения y в -1 или 0, а затем добавляет их. Я считаю, что это должно быть (sum(y)-1)/length(y). Ниже приведен пример.

set.seed(1237) 
y <- sample(0:1, 10, replace = T) 
y 
[1] 0 1 0 0 0 1 1 0 1 1 
# it must be negative as it is sum(y - 1) - y is 0 or 1 
sum(as.numeric(y) - 1)/length(y) 
[1] -0.5 
# modification 
(sum(as.numeric(y)) - 1)/length(y) 
[1] 0.4 
+0

Jaehyeon, благодарю вас за быстрый ответ. Я нашел ошибку, P_new, должен быть ((P_k_C1/P_kt_C1) * P_korg)/((P_k_C0/P_kt_C0) * (1 - P_korg) + (P_k_C1/P_kt_C1) * (P_korg)), это была первая ошибка. то я использовал модификацию ur для P_k_c1, P_kt_c1, P_k_c0 и P_kt_c0, и действительно, почти все выходные значения находятся в диапазоне 0 и 1, но не все из них, возможно, мне нужно изменить только y? – user4847048

+0

Я пробовал все возможные комбинации, и кажется, что с/без этой модификации результаты находятся в пределах 0 и 1. но есть модель (WEKAModelAdditiveRegression), и ее предсказания могут быть отрицательными (т. Е. -0,765) или выше 1 (т. Е. 1,235), может быть, сначала нужно стандартизировать? чтобы получить его прогноз до диапазона 0 и 1? – user4847048

+0

Я не знаю WEKAModelAdditiveRegression и поэтому не могу ответить конкретно. В общем случае, когда двоичный ответ входит в регрессионную модель (включая обобщенную аддитивную модель (GAM)), она может быть ниже 0 или больше 1. Логистическая регрессия является исключением, поскольку ее функция связи предотвращает это. В R пакет гаммы подходит для GAM, а функция 'gam()', похоже, имеет аргумент для выбора функции связи, такой как 'glm()' –