Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум врачей-аспирантов _ Медицинская статистика _ Логистическая регрессия в R

Автор: nastushka 28.06.2017 - 01:29

Подскажите, пожалуйста, кто чем может)). Я делаю логистическую регрессию. Все предикторы биноминальные (0,1). Y-зависимая переменная(бинарная 0 - нет события(это хорошо), 1-есть событие(это плохо)). Дело в том, что нули к нулям, он мало мальски правильно соотносит, но 50% единиц(плохих) у него попадают к нулям(хорошим).Т.е. неверное определение. Как понять, почему так происходит и что сделать, чтобы улучшить классификацию, хотя бы до 85% точности?
Доп. инфо, я гуглила, и нашла метод Feature Selection и его реализацию в R Boruta. Выделила 6 предикторов, думала счастье рядом, сейчас построила модель, но не тут-то было, классификация такая же некачественная:((
Может что-то не то сделала?((
Что делать? (с)(Чернышевский Н.Г.)

 data.zip ( 5,13 килобайт ) : 281
 

Автор: p2004r 28.06.2017 - 08:07

Цитата(nastushka @ 28.06.2017 - 01:29) *
Подскажите, пожалуйста, кто чем может)). Я делаю логистическую регрессию. Все предикторы биноминальные (0,1). Y-зависимая переменная(бинарная 0 - нет события(это хорошо), 1-есть событие(это плохо)). Дело в том, что нули к нулям, он мало мальски правильно соотносит, но 50% единиц(плохих) у него попадают к нулям(хорошим).Т.е. неверное определение. Как понять, почему так происходит и что сделать, чтобы улучшить классификацию, хотя бы до 85% точности?
Доп. инфо, я гуглила, и нашла метод Feature Selection и его реализацию в R Boruta. Выделила 6 предикторов , думала счастье рядом ,сейчас построила модель, но не тут-то было, классификация такая же некачественная:((
Может что-то не то сделала?((
Что делать? (с)(Чернышевский Н.Г.)


1. Откуда "дровишки"? В смысле "датасет"?


2.
Код
df <- read.csv2("data.csv")

df <- data.frame(lapply(df, factor))

> randomForest(Y~., df)

Call:
randomForest(formula = Y ~ ., data = df)
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 4

        OOB estimate of  error rate: 38.47%
Confusion matrix:
     0   1 class.error
0 1305 232   0.1509434
1  602  29   0.9540412


Выборка несбалансирована. Если такое соотношение исходов в генсовокупности, то и пусть так будет. Но если это просто "так сложилось", необходимо получить модель для 1:1 и потом сделать трешоилд оптимальный для генсовокупности в которой модель будет применяться.

Код
> randomForest(Y~.,df, sampsize=c("0"=500, "1"=500))

Call:
randomForest(formula = Y ~ ., data = df, sampsize = c(`0` = 500,      `1` = 500))
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 4

        OOB estimate of  error rate: 31.83%
Confusion matrix:
    0   1 class.error
0 907 630  0.40988939
1  60 571  0.09508716


Если балансируем выборку, то видим "забавный" результат. Один из "исходов" зависимой переменной просто практически случаен.

Ну а Boruta честно улучшает различение неслучайного исхода зависимой переменной. На ~5 случаев.

Код
> randomForest(getConfirmedFormula(res.boruta),df,  sampsize=c("0"=500, "1"=500))

Call:
randomForest(formula = getConfirmedFormula(res.boruta), data = df,      sampsize = c(`0` = 500, `1` = 500))
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 31.78%
Confusion matrix:
    0   1 class.error
0 904 633  0.41184125
1  56 575  0.08874802

Автор: leo_biostat 28.06.2017 - 08:34

Цитата(nastushka @ 28.06.2017 - 01:29) *
Подскажите, пожалуйста, кто чем может)).


Настя, hi.gif!

Сделал несколько вариантов анализа Вашего массива.
Вот лучшее уравнение:

Analysis of Maximum Likelihood Estimates

Standard Wald Standardized
Parameter DF Estimate Error Chi-Square Pr > ChiSq Estimate Label

Intercept 1 -0.1140 0.0764 2.2259 0.1357 Intercept: Y=0
X1 1 0.5680 0.1106 26.3749 <.0001 0.2467 X1
X3 1 1.3719 0.2735 25.1699 <.0001 0.3327 X3
X5 1 2.9687 1.0229 8.4227 0.0037 0.4436 X5
X8 1 1.0929 0.4541 5.7929 0.0161 0.2349 X8
X9 1 0.8818 0.3970 4.9331 0.0263 0.1993 X9
X11 1 0.4458 0.1158 14.8159 0.0001 0.1177 X11
X14 1 0.6613 0.2686 6.0622 0.0138 0.1365 X14
X16 1 0.2207 0.1289 2.9316 0.0869 0.0606 X16


Odds Ratio Estimates

Point 95% Wald
Effect Estimate Confidence Limits

X1 1.765 1.421 2.192
X3 3.943 2.307 6.739
X5 19.467 2.622 144.544
X8 2.983 1.225 7.263
X9 2.415 1.109 5.259
X11 1.562 1.245 1.960
X14 1.937 1.144 3.280
X16 1.247 0.969 1.605


Association of Predicted Probabilities and Observed Responses

Percent Concordant 71.8 Somers' D 0.554
Percent Discordant 16.4 Gamma 0.628
Percent Tied 11.8 Tau-a 0.229
Pairs 969847 c 0.777

Прикрепляю 2 графика с ROC-кривыми, а также таблицу сопряжённости фактических и предсказанных значений Y.

Могу выслать Вам 4 больших файла (объём 8,8 Мб) с более подробными результатами. Сообщите, на какой адрес отправить эти файлы.
Анализ этих результатов говорит о том, что что нужно разобраться с содержанием самого массива.
И отобрать новый массив.
Тогда и будут получены лучшие результаты.

 

Автор: Олег Кравец 28.06.2017 - 18:32

Цитата(leo_biostat @ 28.06.2017 - 08:34) *
Сделал несколько вариантов анализа Вашего массива.


Спасибо. Прекрасный пример помощи.

Автор: p2004r 28.06.2017 - 18:40

Цитата(nastushka @ 28.06.2017 - 01:29) *
Подскажите, пожалуйста, кто чем может)). Я делаю логистическую регрессию. Все предикторы биноминальные (0,1). Y-зависимая переменная(бинарная 0 - нет события(это хорошо), 1-есть событие(это плохо)). Дело в том, что нули к нулям, он мало мальски правильно соотносит, но 50% единиц(плохих) у него попадают к нулям(хорошим).Т.е. неверное определение. Как понять, почему так происходит и что сделать, чтобы улучшить классификацию, хотя бы до 85% точности?
Доп. инфо, я гуглила, и нашла метод Feature Selection и его реализацию в R Boruta. Выделила 6 предикторов , думала счастье рядом ,сейчас построила модель, но не тут-то было, классификация такая же некачественная:((
Может что-то не то сделала?((
Что делать? (с)(Чернышевский Н.Г.)


ROC выглядит вот так как на атаче. Существуют только решения которые снабжены доверительным интервалом.

Это видно из гистограмм распределения вероятности отнесения к конкретному классу.

Ну и "пространство в котором проведены границы решения". Видно, что случаи которые действительно можно отделить "обкусывает края", можно сказать "за счет рандом эффекта".

PS

Можно только по результатам применения модели сказать что "если модель сказала 0, то весьма вероятно что действительно 0. А если модель сказала 1, то подбрось монетку и выбери случайный исход между 0 и 1". (!все это в случае одинаковой частоты исходов в генсовокупности! для конкретной частоты исходов в генсовокупности решения полезного вообще может не быть !)

PPS

Судя по всему никакого "более лучшего решения" тут не существует по принципиальным ограничениям.


 

Автор: p2004r 28.06.2017 - 19:46

Цитата(nastushka @ 28.06.2017 - 01:29) *
Подскажите, пожалуйста, кто чем может)). Я делаю логистическую регрессию. Все предикторы биноминальные (0,1). Y-зависимая переменная(бинарная 0 - нет события(это хорошо), 1-есть событие(это плохо)). Дело в том, что нули к нулям, он мало мальски правильно соотносит, но 50% единиц(плохих) у него попадают к нулям(хорошим).Т.е. неверное определение. Как понять, почему так происходит и что сделать, чтобы улучшить классификацию, хотя бы до 85% точности?
Доп. инфо, я гуглила, и нашла метод Feature Selection и его реализацию в R Boruta. Выделила 6 предикторов , думала счастье рядом ,сейчас построила модель, но не тут-то было, классификация такая же некачественная:((
Может что-то не то сделала?((
Что делать? (с)(Чернышевский Н.Г.)


И все таки "про датасет" надо бы рассказать, а то вот такое очень странно выглядит



Код
> table(df$x1, df$x11, df$Y )
, ,  = 0

  
      0   1
  0 355 684
  1  22 223
  2   8 182
  3   0  63

, ,  = 1

  
      0   1
  0 355 203
  1  22  28
  2   8  12
  3   0   3

Автор: nastushka 28.06.2017 - 20:39

p2004r, суперски
leo_biostat, а можете как и p2004r тоже дать исходный код, хочу сама получить такие ре-ты:))
p2004r, что касается дровишек ,я не могу говорить, поэтому и закодировала в иксы и игрике, но это фин скоринг .

Автор: nastushka 28.06.2017 - 21:23

Что касается данных, то такие переменные как:
x3 x4 x5 x6 x8 x10 x11 x13 x14 x15 x16 x17
изначально метрические, я просто в отчаянии, когда ничего не получалось, их перевела в дихотомическую шкалу, принцип перевода был простой, если есть значение, то 1, нет , то 0.
оригинальный датасет вот
на мой взгляд ключевая переменная x13 (количество шарашек оформленный на одно ФИО)
x11 сколько было судебных дел
х15 количество дочерних фирм
х8 сколько нарушений выявила налоговая полиция

остальные не важно:)
Если выше указанные переменные оставить метрическими, это может повлиять на ре-тат лог.регрессии?, у меня когда они были метрические, процент ошибок отнесения единиц (это событие обмана) к нулям был адский.,

 data.zip ( 22,67 килобайт ) : 229
 

Автор: nokh 28.06.2017 - 22:38

Цитата(nastushka @ 29.06.2017 - 00:23) *
Что касается данных, то такие переменные как:
x3 x4 x5 x6 x8 x10 x11 x13 x14 x15 x16 x17
изначально метрические, я просто в отчаянии, когда ничего не получалось, их перевела в дихотомическую шкалу, принцип перевода был простой, если есть значение, то 1, нет , то 0.
оригинальный датасет вот
на мой взгляд ключевая переменная x13 (количество шарашек оформленный на одно ФИО)
x11 сколько было судебных дел
х15 количество дочерних фирм
х8 сколько нарушений выявила налоговая полиция

остальные не важно:)
Если выше указанные переменные оставить метрическими, это может повлиять на ре-тат лог.регрессии?, у меня когда они были метрические, процент ошибок отнесения единиц (это событие обмана) к нулям был адский.,

Хотел высказаться по первому набору, но прочитав этот пост засомневался. Смотрите, что получается. Чисто из жизненного опыта, расшифрованные вами 4 показателя должны быть показателями риска, т.е. их наличие должно увеличивать риск Y=1 (обман). В вашем же первом наборе они являются протекторными показателями, т.е. их наличие, напротив, снижает риск 1. Вы не напутали с кодировками?

"на мой взгляд ключевая переменная x13", "остальные не важно:)"
Не верю! (с) (Станиславский К.С.) Нужно считать относительные риски: найти % события в группе Y=0 и % события в Y=1, а затем правильно разделить одно на другое.

Автор: p2004r 28.06.2017 - 23:14

Цитата(nastushka @ 28.06.2017 - 20:39) *
p2004r, суперски
leo_biostat, а можете как и p2004r тоже дать исходный код, хочу сама получить такие ре-ты:))
p2004r, что касается дровишек ,я не могу говорить, поэтому и закодировала в иксы и игрике, но это фин скоринг .



Там очень уж совпадает часть случаев, надо проверить не смешались ли каким то образом данные в процессе их подготовки. Не может быть таких совпадений по численности вариантов ответов.

Код
> nrow(unique(df[,-1]))
[1] 414
> nrow(df[,-1])
[1] 2168

> table(do.call(paste0,as.list(df[,-1])), df$Y)
                  
                     0   1
  0000000000000000  36  36
  0000000000000011   2   2
  0000000000000100   1   1
  0000000000000111   1   1
  0000000000001000  18  18
  0000000000001011   3   3
  0000000000001111   1   1
  0000000000010000 146 146
  0000000000010010   2   2
  0000000000010011  29  29
  0000000000010100   1   1
  0000000000010110   2   2
  0000000000011000  88  88
  0000000000011011  23  23
  0000000000011100   1   1
  0000000000100000  17  15
  0000000000100011   8   3
  0000000000100100   1   0
  0000000000100111   2   0
  0000000000101000  11  10
  0000000000101010   1   1
  0000000000101011   5   0
  0000000000101111   3   0
  0000000000110000  75  72
  0000000000110010   2   2
  0000000000110011  36  28
  0000000000110100   4   2
  0000000000110111   3   1
  0000000000111000  44  39
  0000000000111001   1   1
  0000000000111010   4   3
  0000000000111011  16  11
  0000000000111100   2   1
  0000000000111111   8   2
  0000000010111011   2   2
  0000000101100111   1   0
  0000000101101011   1   0
  0000000101110000   1   0
  0000000101110111   1   0
  0000000101111000   1   0
  0000000101111100   1   0
  0000000111100011   1   0
  0000000111100111   2   0
  0000000111101000   1   0
  0000000111101011   1   0
  0000000111101100   1   0
  0000000111110011   1   0
  0000000111110111   2   0
  0000000111111011   3   0
  0000000111111111   3   0
  0000110000100000   3   0
  0000110000100100   7   0
  0000110000101100   4   0
  0000110000110000   1   0
  0000110000110100   4   0
  0000110000111000   1   0
  0000110000111100   2   0
  0000110010100000   1   0
  0000110010101000   2   0
  0000110010110000   1   0
  0000110010110100   2   0
  0000110010111000   3   0
  0000110101110100   1   0
  0000110101111000   1   0
  0000110111100000   4   0
  0000110111100100   3   0
  0000110111101000   3   0
  0000110111110100   5   0
  0000110111111000   1   0
  0011000000010000   1   1
  0011000000100000   1   1
  0011000000100111   1   1
  0011000000110011   4   0
  0011000000110111   2   0
  0011000000111000   3   1
  0011000000111011   8   2
  0011000000111111   5   0
  0011000010100011   2   0
  0011000010101000   1   0
  0011000010110011   3   0
  0011000010110111   2   0
  0011000010111000   1   0
  0011000010111011   5   0
  0011000010111111   3   0
  0011000101100011   2   0
  0011000101100111   1   0
  0011000101101011   3   0
  0011000101101111   2   0
  0011000101111111   4   0
  0011000111100111   2   0
  0011000111101011   3   0
  0011000111101111   9   0
  0011000111110011   4   0
  0011000111110111   3   0
  0011000111111010   1   0
  0011000111111011   5   0
  0011000111111111   3   0
  0011001000110011   1   0
  0011001111100111   1   0
  0011110000100000   1   0
  0011110000100100   9   0
  0011110000101000   1   0
  0011110000101100   1   0
  0011110000110100   5   0
  0011110000111000   1   0
  0011110000111100   2   0
  0011110010100000   2   0
  0011110010100011   1   0
  0011110010101000   1   0
  0011110010110000   1   0
  0011110010110011   2   0
  0011110010111000   1   0
  0011110010111111   1   0
  0011110101100100   1   0
  0011110101101000   1   0
  0011110101101011   1   0
  0011110101101100   1   0
  0011110101111100   2   0
  0011110111100000   2   0
  0011110111100011   1   0
  0011110111100100   3   0
  0011110111101011   2   0
  0011110111101100   1   0
  0011110111101111   1   0
  0011110111110011   2   0
  0011110111110100   3   0
  0011110111111011   1   0
  0011110111111100   1   0
  0011111101110000   1   0
  0011111111101100   1   0
  0100000000101000   1   0
  0100000000101011   1   0
  0100000000110011   1   1
  0100000000110100   1   0
  0100000010101111   1   0
  0100000010110011   1   0
  0100000010111011   2   0
  0100000101100011   1   0
  0100000101111011   1   0
  0100000111100000   1   0
  0100000111100011   2   0
  0100000111100100   1   0
  0100000111100111   2   0
  0100000111101011   2   0
  0100000111101111   3   1
  0100000111110011   2   0
  0100000111110100   2   0
  0100000111110111   4   0
  0100000111111011   3   0
  0100000111111111   6   0
  0100001111110111   1   0
  0100001111111111   3   0
  0100110000110100   1   0
  0100110010100000   1   0
  0100110111100000   1   0
  0100110111100111   1   0
  0100110111101000   1   0
  0100110111111000   2   0
  0100110111111111   1   0
  0111000000110000   1   0
  0111000000110011   1   0
  0111000000110101   1   0
  0111000000110111   1   0
  0111000000111011   1   0
  0111000000111111   1   0
  0111000010100111   2   0
  0111000010101011   1   0
  0111000010101111   1   0
  0111000010110000   1   0
  0111000010110011   2   0
  0111000010110111   2   0
  0111000010111111   1   0
  0111000101100100   1   0
  0111000101100111   1   0
  0111000101111011   2   1
  0111000111100000   1   0
  0111000111100011   7   0
  0111000111100100   4   0
  0111000111100111   4   0
  0111000111101000   1   0
  0111000111101011   7   0
  0111000111101111  10   1
  0111000111110011   8   0
  0111000111110100   3   0
  0111000111110111  14   0
  0111000111111000   1   0
  0111000111111011  14   0
  0111000111111100   3   0
  0111000111111111  16   0
  0111001010101100   1   0
  0111001111100111   2   0
  0111001111101111   1   0
  0111001111110111   1   0
  0111001111111111   1   0
  0111110000100111   1   0
  0111110000101111   1   0
  0111110010100000   1   0
  0111110010100111   1   0
  0111110010110000   2   0
  0111110010110100   1   0
  0111110010110111   1   0
  0111110101101000   1   0
  0111110101110000   1   0
  0111110101111111   1   0
  0111110111100000   1   0
  0111110111100011   1   0
  0111110111100111   4   0
  0111110111101000   5   0
  0111110111101011   3   0
  0111110111101100   3   0
  0111110111101111   5   0
  0111110111110000   2   0
  0111110111110011   2   0
  0111110111110100   4   0
  0111110111110111   3   0
  0111110111111000   3   0
  0111110111111011   5   0
  0111110111111100   1   0
  0111110111111111   7   1
  0111111111110000   1   0
  1000000000000011   2   2
  1000000000010000   6   6
  1000000000010001   2   2
  1000000000010010   2   2
  1000000000010011   5   5
  1000000000011000   1   1
  1000000000011011   3   3
  1000000000100000   5   0
  1000000000100011   9   0
  1000000000101000   1   0
  1000000000101011   6   0
  1000000000101111   1   0
  1000000000110000  25   4
  1000000000110001   1   1
  1000000000110010   4   1
  1000000000110011  25   5
  1000000000110100   1   1
  1000000000110111   2   0
  1000000000111000   9   3
  1000000000111010   1   1
  1000000000111011  25   2
  1000000000111100   1   1
  1000000000111111   1   0
  1000000010100011   1   1
  1000000010110011   5   1
  1000000010111000   1   1
  1000000010111011   1   0
  1000000010111111   1   0
  1000000101110011   1   0
  1000000111110000   1   0
  1000000111110011   1   1
  1011000000100000   3   0
  1011000000100011   5   0
  1011000000101000   3   0
  1011000000101011   4   0
  1011000000110000   2   0
  1011000000110011  18   2
  1011000000111000   4   1
  1011000000111011  17   1
  1011000000111110   1   0
  1011000000111111   1   0
  1011000010101011   1   0
  1011000010110011   4   0
  1011000010111011   1   0
  1011000010111111   1   0
  1011000101101011   1   0
  1011000101111000   1   0
  1011000101111011   1   0
  1011000111110011   1   0
  1100000000011000   1   1
  1100000000110011   1   0
  1100000000110111   1   0
  1100000000111011   3   1
  1100000010110111   1   0
  1100000111110011   1   0
  1111000000100000   1   0
  1111000000100011   1   0
  1111000000101011   1   0
  1111000000110011   3   0
  1111000000110100   1   0
  1111000000111000   1   0
  1111000000111011   3   0
  1111000000111111   1   0
  1111000010110011   1   0
  1111000010111011   1   0
  1111000101110011   1   0
  1111000111101011   1   0
  1111000111110011   1   0
  1111000111111011   1   0
  2000000000000000   1   1
  2000000000010000   2   2
  2000000000010001   1   1
  2000000000010011   1   1
  2000000000011000   1   1
  2000000000100011   1   0
  2000000000101011   2   1
  2000000000110000   1   0
  2000000000110010   1   1
  2000000000110011  15   4
  2000000000110110   1   0
  2000000000110111   3   0
  2000000000111000   3   0
  2000000000111011  19   2
  2000000000111111   3   0
  2000000010101011   1   0
  2000000010110011   1   0
  2000000010110111   1   0
  2000000010111011   1   0
  2000000101101011   1   0
  2000000101110111   1   0
  2000000101111011   3   2
  2000000101111111   1   0
  2000000111110011   1   0
  2000000111111011   2   0
  2000000111111110   1   0
  2011000000000011   1   1
  2011000000100011   4   0
  2011000000101011   7   0
  2011000000101111   1   0
  2011000000110000   1   0
  2011000000110011   6   1
  2011000000110111   3   0
  2011000000111011  14   0
  2011000000111111   1   0
  2011000010100011   1   0
  2011000010101011   1   0
  2011000010110011   3   0
  2011000010111011   7   0
  2011000010111111   1   0
  2011000101101011   3   0
  2011000101101111   1   0
  2011000101110000   1   0
  2011000101110011   2   0
  2011000101110111   1   0
  2011000111100111   1   0
  2011000111101011   3   0
  2011000111110000   1   0
  2011000111110011   2   0
  2011000111110111   1   0
  2011000111111011   2   0
  2011000111111111   6   0
  2100000000100000   2   0
  2100000000110011   2   1
  2100000000111011   2   0
  2100000000111111   1   0
  2100000010111011   1   0
  2100000101111011   1   0
  2100000101111100   1   0
  2100000111101011   1   0
  2100000111111011   1   0
  2100000111111111   1   0
  2111000000010011   1   1
  2111000000100011   1   0
  2111000000110111   1   0
  2111000000111011   2   0
  2111000000111111   3   0
  2111000010100111   1   0
  2111000010101011   1   0
  2111000010101111   1   0
  2111000010110011   2   0
  2111000010110111   1   0
  2111000010111011   5   0
  2111000111100011   2   0
  2111000111101011   2   0
  2111000111110011   2   0
  2111000111110111   2   0
  2111000111111011   6   0
  3000000000100011   2   0
  3000000000100111   1   0
  3000000000110000   1   0
  3000000000110011   1   0
  3000000000111011   4   0
  3000000000111111   1   0
  3000000010100011   1   0
  3000000010101011   2   1
  3000000101111011   1   0
  3000000111110011   2   0
  3000000111111111   2   0
  3011000000101011   1   0
  3011000000110011   1   0
  3011000000110111   1   1
  3011000000111011   4   0
  3011000000111111   1   0
  3011000010101011   1   0
  3011000010101111   1   0
  3011000010111111   1   0
  3011000101100011   1   0
  3011000111100011   1   1
  3011000111101011   1   0
  3011000111101111   1   0
  3011000111111011   4   0
  3011000111111111   2   0
  3011001010111011   1   0
  3100000000101111   1   0
  3100000000110111   1   0
  3100000000111111   1   0
  3100000010111011   1   0
  3100000101110011   1   0
  3100000111100011   1   0
  3100000111101111   2   0
  3100000111111111   2   0
  3111000000100011   1   0
  3111000000101011   1   0
  3111000000111011   1   0
  3111000010101011   1   0
  3111000101111011   1   0
  3111000111100011   1   0
  3111000111100111   1   0
  3111000111101011   1   0
  3111000111101111   1   0
  3111000111110011   1   0
  3111000111111011   1   0
  3111000111111111   1   0
  3111001111111111   1   0

Автор: nastushka 29.06.2017 - 11:46

nokh, а как это сделать?)) Имеете ввиду регрессию Кокса?
p2004r, в принципе такое может быть, но проблема в том, что проверить это нельзя, данные не я собираю, я бы была более внимательной, их дает манагер.
А можно совпадающие кейсы просто удалить, чтобы они не путали мне модель и манагеру честно признаться, что я это удалила.

Автор: nastushka 29.06.2017 - 18:01

манагер одобрил удалять совпадающие наблюдения
Подскажите, как это сделать?
table(do.call(paste0,as.list(df[,-1])), df$Y)
Т.е. нашла наблюдение, как их удалять?

Автор: p2004r 29.06.2017 - 19:49

Цитата(nastushka @ 29.06.2017 - 18:01) *
манагер одобрил удалять совпадающие наблюдения
Подскажите, как это сделать?
table(do.call(paste0,as.list(df[,-1])), df$Y)
Т.е. нашла наблюдение, как их удалять?


Вот эти "склеенные" которые имеют _точно_ одинаковое число в 0 и 1 исходах надо попробовать (каждое по очереди) удалить сначала из 0 и смотреть на то как реагирует статистика модели.

Выделить достаточно просто, вот номера первой строчки из таблицы, которые по Y равны "0":

Код
> which(do.call(paste0,as.list(df[,-1]))=="0000000000000000" & df$Y == "0")
[1]  778  852 1149 1150 1219 1231 1259 1307 1373 1375 1382 1413 1611 1643 1652
[16] 1683 1720 1743 1746 1770 1776 1784 1785 1814 1854 1889 1893 1914 1933 1947
[31] 1960 1962 1978 2000 2011 2018


как видим их и есть 36


Автор: nastushka 30.06.2017 - 18:23

фух) я запарилась в ручную это перебирать)) p2004r, а нельзя ли R заставить это ужасную монотонную работу автоматизировать, пока у меня голова не взорвалась?

Автор: p2004r 30.06.2017 - 23:53

Цитата(nastushka @ 30.06.2017 - 18:23) *
фух) я запарилась в ручную это перебирать)) p2004r, а нельзя ли R заставить это ужасную монотонную работу автоматизировать, пока у меня голова не взорвалась?


зачем вручную?

Вот номера первых десяти уникальных + условие Y == 0

Код
> unique(do.call(paste0,as.list(df[,-1])))[1:10]
[1] "0000000000010000" "0000000000001000" "1000000000110000" "0000000000110000"
[5] "0000000000100000" "0000000000011000" "0000000000111000" "0000000000000000"
[9] "0000000000011011" "0000000000101000"


> do.call(c, lapply(unique(do.call(paste0,as.list(df[,-1])))[1:10], function(m) which(do.call(paste0,as.list(df[,-1]))== m & df$Y == "0")))
  [1]  660  665  698  701  711  712  762  785  800  817  827  848  855  857  858
[16]  860  862  863  892  974 1018 1026 1051 1055 1069 1070 1151 1152 1194 1198
[31] 1199 1228 1237 1266 1269 1278 1279 1280 1281 1286 1305 1341 1356 1357 1374
[46] 1377 1378 1379 1386 1392 1399 1436 1444 1446 1459 1478 1479 1482 1485 1486
[61] 1489 1490 1530 1534 1565 1619 1636 1647 1654 1656 1667 1669 1670 1684 1685
[76] 1687 1691 1696 1703 1719 1724 1731 1732 1736 1745 1752 1769 1774 1786 1790
[91] 1794 1800 1806 1809 1822 1824 1828 1834 1835 1836 1837 1838 1843 1846 1869
[106] 1871 1874 1875 1877 1881 1890 1891 1894 1897 1898 1899 1902 1907 1918 1920
[121] 1922 1923 1928 1929 1936 1942 1945 1946 1948 1949 1953 1955 1958 1961 1979
[136] 1980 1989 1992 1994 1999 2004 2009 2032 2033 2037 2052  685  795  868 1004
[151] 1206 1481 1509 1535 1564 1646 1649 1658 1668 1728 1744 1865 1896 1993  690
[166]  713  715  738  833  870  900  960  972 1079 1111 1162 1250 1447 1524 1604
[181] 1622 1813 1903 1969 2024 2085 2107 2125 2129  702  761  773  851  859  871
[196]  872  884  937  957  977  979  997 1031 1035 1050 1109 1144 1182 1196 1221
[211] 1262 1263 1267 1271 1273 1275 1276 1277 1328 1334 1351 1362 1365 1380 1393
[226] 1395 1406 1407 1410 1425 1426 1437 1457 1472 1543 1567 1612 1613 1639 1682
[241] 1697 1709 1766 1777 1783 1787 1791 1808 1819 1839 1857 1860 1880 1887 1895
[256] 1912 1930 1963 2005 2030 2036 2043 2051 2105  704  844  924  951 1121 1232
[271] 1236 1385 1453 1458 1474 1560 1598 1742 1882 2022 2050  705  772  846  847
[286]  889  987  989 1023 1034 1089 1090 1127 1128 1129 1130 1153 1180 1202 1220
[301] 1230 1264 1265 1270 1401 1433 1445 1483 1585 1587 1595 1597 1638 1650 1653
[316] 1657 1666 1676 1681 1698 1701 1705 1706 1708 1722 1723 1733 1735 1749 1750
[331] 1751 1763 1764 1772 1773 1782 1789 1793 1798 1801 1807 1818 1847 1855 1861
[346] 1864 1867 1868 1872 1884 1886 1900 1908 1909 1917 1934 1951 1967 1977 1981
[361] 1988 1991 2001 2007 2008 2012 2031 2057 2120  706  777  874  890 1036 1056
[376] 1117 1133 1168 1197 1213 1332 1396 1397 1443 1521 1527 1586 1629 1641 1642
[391] 1675 1692 1707 1710 1716 1762 1815 1820 1823 1842 1859 1873 1910 1916 1919
[406] 1943 1959 1982 1996 2093 2103 2110 2163  778  852 1149 1150 1219 1231 1259
[421] 1307 1373 1375 1382 1413 1611 1643 1652 1683 1720 1743 1746 1770 1776 1784
[436] 1785 1814 1854 1889 1893 1914 1933 1947 1960 1962 1978 2000 2011 2018  780
[451]  796  895  897 1158 1249 1451 1466 1491 1635 1702 1721 1737 1797 1802 1821
[466] 1888 1913 1964 1990 2002 2014 2035  744  792  941  943 1126 1268 1317 1686
[481] 1844 1940 1957


Можно просто вектор нужных значений подставить и получить номера.

удалить их просто "данные[-номера, ]"

Автор: nastushka 2.07.2017 - 15:21

p2004r
смотрите, у меня родилась мысль
вот результаты классификации random forest
Confusion matrix:
0 1 class.error
0 831 3 0.003597122302
1 103 528 0.163232963550
Как мне найти номера наблюдений единиц, которые попали в нули, 103 штучки?))

Автор: p2004r 2.07.2017 - 15:42

Цитата(nastushka @ 2.07.2017 - 15:21) *
p2004r
смотрите, у меня родилась мысль
вот результаты классификации random forest
Confusion matrix:
0 1 class.error
0 831 3 0.003597122302
1 103 528 0.163232963550
Как мне найти номера наблюдений единиц, которые попали в нули, 103 штучки?))


Два вектора v1 и v2 (обучение df$Y и решение_RF res.rf$predicted)

which(v1==1&v2==0)

Автор: nastushka 2.07.2017 - 20:54

p2004r, у меня все получилось:)
Но возник такой вопрос.
Как можно по каждой КАТЕГОРИАЛЬНОЙ переменной сосчитать процент определенных значений для нуля и единицы?
На выходе это выглядит так:

df$X1 (посчитать нули для категорий "0 " и "1")
0 1
68% 89%
т.е. по переменной Х1 у нас 68% значений 0 и 32% соответственно единиц для выходной категории "0"
и по переменной Х1 у нас 89% значений 0 и 11% соответственно единиц для выходной категории "1"



Автор: nastushka 3.07.2017 - 17:25

Терпение и труд, все перетрут) Сделала, но вот гугль не помог по такому вопросу:
df=read.csv(mydata)
df=na.omit(df)
library("randomForest")

model=randomForest(y ~.

,df, sampsize=c("0"=300, "1"=300))





newdata=х.csv
newdata=data.frame(lapply(newdata, factor))

str(df)
xq=rbind(newdata,df)
str(xq)
xqtest=xq[1:17,]
str(xqtest)
View(xqtest)



pred <- predict(model, newdata = xqtest,type="class")

str(df)
str(newdata)
ошибка
Error in predict.randomForest(model, newdata = xqtest, type = "class") :
Type of predictors in new data do not match that of the training data.

подскажите ,как победить эту ошибку[attachment=1521:x.zip]

 mydata.zip ( 7,25 килобайт ) : 206
 x.zip ( 263 байт ) : 205
 

Автор: p2004r 3.07.2017 - 22:10

Цитата(nastushka @ 3.07.2017 - 17:25) *
Терпение и труд, все перетрут) Сделала, но вот гугль не помог по такому вопросу:
df=read.csv(mydata)
df=na.omit(df)
library("randomForest")

model=randomForest(y ~.

,df, sampsize=c("0"=300, "1"=300))





newdata=х.csv
newdata=data.frame(lapply(newdata, factor))

str(df)
xq=rbind(newdata,df)
str(xq)
xqtest=xq[1:17,]
str(xqtest)
View(xqtest)



pred <- predict(model, newdata = xqtest,type="class")

str(df)
str(newdata)
ошибка
Error in predict.randomForest(model, newdata = xqtest, type = "class") :
Type of predictors in new data do not match that of the training data.

подскажите ,как победить эту ошибку[attachment=1521:x.zip]



сравните str(df) и str(xqtest) и вопросов не будет

Автор: p2004r 3.07.2017 - 22:13

Цитата(nastushka @ 2.07.2017 - 20:54) *
p2004r, у меня все получилось:)
Но возник такой вопрос.
Как можно по каждой КАТЕГОРИАЛЬНОЙ переменной сосчитать процент определенных значений для нуля и единицы?
На выходе это выглядит так:

df$X1 (посчитать нули для категорий "0 " и "1")
0 1
68% 89%
т.е. по переменной Х1 у нас 68% значений 0 и 32% соответственно единиц для выходной категории "0"
и по переменной Х1 у нас 89% значений 0 и 11% соответственно единиц для выходной категории "1"



Код
> table(df$Y)

   0    1
1537  631
> table(df$Y)/nrow(df)

        0         1
0.7089483 0.2910517
> (table(df$Y)/nrow(df))*100

       0        1
70.89483 29.10517
>

Автор: nastushka 4.07.2017 - 13:23

К сожалению вопросы есть sad.gif

Код
str(df)
'data.frame':    823 obs. of  17 variables:
$ isOneDay                         : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ sizeList                         : Factor w/ 4 levels "0","1","2","3": 1 1 1 2 1 1 1 1 1 1 ...
$ licensesList                     : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ gosWinnerNumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ gosWinnerSumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ gosPlacerNumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ gosPlacerSumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ inspectionsInFutureNumList       : Factor w/ 4 levels "0","1","2","8": 2 1 1 1 1 1 1 1 1 1 ...
$ inspectionsHasViolationsNumList  : Factor w/ 11 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsNoViolationsNumList   : Factor w/ 11 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsHasViolationsFailsList: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ courtPracticeList                : Factor w/ 2 levels "0","1": 2 2 2 1 2 2 2 1 2 1 ...
$ digestGreenList                  : Factor w/ 9 levels "1","2","3","4",..: 4 3 4 1 4 3 2 2 3 3 ...
$ linkedEntitiesByCeoNumList       : Factor w/ 2 levels "0","1": 2 2 1 2 1 2 2 1 2 2 ...
$ linkedEntitiesByFounderNumList   : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 1 1 1 1 ...
$ linkedEntitiesChildrenNumList    : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ digestGreyList                   : Factor w/ 8 levels "0","1","2","3",..: 2 3 3 5 2 2 3 5 3 4 ...
- attr(*, "na.action")=Class 'omit'  Named int [1:1345] 12 14 17 26 29 42 43 49 50 57 ...
  .. ..- attr(*, "names")=8322456 [1:1345] "12" "14" "17" "26" ...



вот реальные данные
newdata=read.csv("x.csv") удалите из наборе x.csv переменную Y, я хочу ее предсказать
newdata=data.frame(lapply(newdata, factor))
там не должно быть Y

Код
'data.frame':    11 obs. of  16 variables:
$ sizeList                         : Factor w/ 4 levels "0","1","2","3": 2 1 2 4 2 4 1 1 4 3 ...
$ licensesList                     : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 1 1 1 ...
$ gosWinnerNumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 1 1 1 2 1 2 ...
$ gosWinnerSumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 1 1 1 2 1 2 ...
$ gosPlacerNumList                 : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ gosPlacerSumList                 : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsInFutureNumList       : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsHasViolationsNumList  : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsNoViolationsNumList   : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsHasViolationsFailsList: Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ courtPracticeList                : Factor w/ 2 levels "0","1": 2 2 2 2 1 2 1 2 1 2 ...
$ digestGreenList                  : Factor w/ 5 levels "4","5","6","7",..: 1 1 1 3 2 5 4 3 3 3 ...
$ linkedEntitiesByCeoNumList       : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ linkedEntitiesByFounderNumList   : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 1 1 ...
$ linkedEntitiesChildrenNumList    : Factor w/ 2 levels "0","1": 2 2 1 2 2 2 2 2 2 2 ...
$ digestGreyList                   : Factor w/ 3 levels "0","1","2": 1 3 2 2 2 2 3 3 2 2 ...


все переменные одинаковые у тип у них фактор!

Error in predict.randomForest(model, newdata = newdata, type = "class") :
Type of predictors in new data do not match that of the training data.

Кстати если в наборе х.csv есть переменная Y он дает предсказания.
Но смысл, мне нужно на новых данных это сделать, а на них заведомо нет игрика

Автор: nastushka 4.07.2017 - 14:54

Y это isOneDay
поскольку мне сдавать нужно ,я переименовала обратно с иксов

Автор: p2004r 4.07.2017 - 20:18

Цитата(nastushka @ 4.07.2017 - 13:23) *
К сожалению вопросы есть sad.gif

Код
str(df)
'data.frame':    823 obs. of  17 variables:
$ isOneDay                         : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ sizeList                         : Factor w/ 4 levels "0","1","2","3": 1 1 1 2 1 1 1 1 1 1 ...
$ licensesList                     : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ gosWinnerNumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ gosWinnerSumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ gosPlacerNumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ gosPlacerSumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ inspectionsInFutureNumList       : Factor w/ 4 levels "0","1","2","8": 2 1 1 1 1 1 1 1 1 1 ...
$ inspectionsHasViolationsNumList  : Factor w/ 11 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsNoViolationsNumList   : Factor w/ 11 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsHasViolationsFailsList: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ courtPracticeList                : Factor w/ 2 levels "0","1": 2 2 2 1 2 2 2 1 2 1 ...
$ digestGreenList                  : Factor w/ 9 levels "1","2","3","4",..: 4 3 4 1 4 3 2 2 3 3 ...
$ linkedEntitiesByCeoNumList       : Factor w/ 2 levels "0","1": 2 2 1 2 1 2 2 1 2 2 ...
$ linkedEntitiesByFounderNumList   : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 1 1 1 1 ...
$ linkedEntitiesChildrenNumList    : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
$ digestGreyList                   : Factor w/ 8 levels "0","1","2","3",..: 2 3 3 5 2 2 3 5 3 4 ...
- attr(*, "na.action")=Class 'omit'  Named int [1:1345] 12 14 17 26 29 42 43 49 50 57 ...
  .. ..- attr(*, "names")=8322456 [1:1345] "12" "14" "17" "26" ...



вот реальные данные
newdata=read.csv("x.csv") удалите из наборе x.csv переменную Y, я хочу ее предсказать
newdata=data.frame(lapply(newdata, factor))
там не должно быть Y

Код
'data.frame':    11 obs. of  16 variables:
$ sizeList                         : Factor w/ 4 levels "0","1","2","3": 2 1 2 4 2 4 1 1 4 3 ...
$ licensesList                     : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 1 1 1 ...
$ gosWinnerNumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 1 1 1 2 1 2 ...
$ gosWinnerSumList                 : Factor w/ 2 levels "0","1": 2 2 2 2 1 1 1 2 1 2 ...
$ gosPlacerNumList                 : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ gosPlacerSumList                 : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsInFutureNumList       : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsHasViolationsNumList  : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsNoViolationsNumList   : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ inspectionsHasViolationsFailsList: Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ courtPracticeList                : Factor w/ 2 levels "0","1": 2 2 2 2 1 2 1 2 1 2 ...
$ digestGreenList                  : Factor w/ 5 levels "4","5","6","7",..: 1 1 1 3 2 5 4 3 3 3 ...
$ linkedEntitiesByCeoNumList       : Factor w/ 1 level "0": 1 1 1 1 1 1 1 1 1 1 ...
$ linkedEntitiesByFounderNumList   : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 1 1 ...
$ linkedEntitiesChildrenNumList    : Factor w/ 2 levels "0","1": 2 2 1 2 2 2 2 2 2 2 ...
$ digestGreyList                   : Factor w/ 3 levels "0","1","2": 1 3 2 2 2 2 3 3 2 2 ...


все переменные одинаковые у тип у них фактор!

Error in predict.randomForest(model, newdata = newdata, type = "class") :
Type of predictors in new data do not match that of the training data.

Кстати если в наборе х.csv есть переменная Y он дает предсказания.
Но смысл, мне нужно на новых данных это сделать, а на них заведомо нет игрика



ну так уровни факторов улетели, они могут быть только подмножеством от обучающего датасета

Код
levels(newdata$digestGreyList) <- levels(df$digestGreyList)


или автоматом для совпадающих

Код
for(n in intersect(names(df), names(newdata))) levels(newdata[,n]) <- levels(df[,n])



ЗЫ а вообще не надо этих групп плодить, все данные вместе должны быть и просто признак принадлежности (тогда и геморроя такого меньше)

Автор: nastushka 5.07.2017 - 17:51

Да, Вы правы! p2004r, последний вопрос, интерпретационного плана. Имею ли я право вероятности до 0.7 не принимать в расчет?
Например, у меня наблюдение класса "0", но предсказал вероятность 0,62(арифметически округлим - это единица будет). Есть и 0,76(тут я считаю за неверную классификацию). Я считаю, что меньше 0,7 вообще не стоит рассматривать вероятность. Скажите, права я или нет?

Автор: p2004r 5.07.2017 - 21:33

Цитата(nastushka @ 5.07.2017 - 17:51) *
Да, Вы правы! p2004r, последний вопрос, интерпретационного плана. Имею ли я право вероятности до 0.7 не принимать в расчет?
Например, у меня наблюдение класса "0", но предсказал вероятность 0,62(арифметически округлим - это единица будет). Есть и 0,76(тут я считаю за неверную классификацию). Я считаю, что меньше 0,7 вообще не стоит рассматривать вероятность. Скажите, права я или нет?



Это называется "точка принятия решения" -- thresholds. Вся ROC состоит по сути из этих точек. Выбрать наилучшую точку принятия решения можно зная частоты исходов в популяции и соотношение стоимости ошибок первого и второго рода.


Код
     In addition, weights can be supplied if false positive and false
     negative predictions are not equivalent: a numeric vector of
     length 2 to the ?best.weights? argument. The indices define

       1. the cost of of a false negative classification

       2. the prevalence, or the proportion of cases in the total
          population (n.cases/(n.controls+n.cases)).

     The optimality criteria are modified as proposed by Perkins and
     Schisterman:

     ?youden?

                   max(sensitivities + r \times specificities)          
          
     ?closest.topleft?

            min((1 - sensitivities)^2 + r \times (1- specificities)^2)  
          
     with

                 r = (1 - prevalence) / (cost * prevalence)            
    
     By default, prevalence is 0.5 and cost is 1 so that no weight is
     applied in effect.

     Note that several thresholds might be equally optimal.

References:

     Neil J. Perkins, Enrique F. Schisterman (2006) ``The Inconsistency
     of "Optimal" Cutpoints Obtained using Two Criteria based on the
     Receiver Operating Characteristic Curve''. _American Journal of
     Epidemiology_ *163*(7), 670-675. DOI: 10.1093/aje/kwj063.

Автор: nastushka 6.07.2017 - 17:15

с RoC получилось разобраться. А как мне в отчете правильно писать.?
Например, предсказанное значение вероятности 0,86. А точность классификации модели 90%.
Я могу сказать, что с 90% точностью вероятность наступления события 0,86? Или как это корректно будет по-русски?

Автор: p2004r 8.07.2017 - 23:06

Цитата(nastushka @ 6.07.2017 - 17:15) *
с RoC получилось разобраться. А как мне в отчете правильно писать.?
Например, предсказанное значение вероятности 0,86. А точность классификации модели 90%.
Я могу сказать, что с 90% точностью вероятность наступления события 0,86? Или как это корректно будет по-русски?


Если в терминах ReOpCu, то для выбранной (оптимальной для условий применения модели) точки принятия решения указывается соответствующая "чувствительность" и "специфичность". В целом модель оценивается безотносительно конкретной точки принятия решения по величине ArUnCu

Автор: nastushka 12.07.2017 - 15:08

p2004r, подскажите
я рассчитала spec and sens
как на базе этих значений мне вручную высчитать AUC?

Автор: nastushka 12.07.2017 - 15:12

spec=0,06,sens=0.94

Автор: nastushka 12.07.2017 - 18:34

И такой вопросик
data(ROCR.simple)
threshold1 <- function(predict, response) {
perf <- ROCR::performance(ROCR::prediction(predict, response), "sens", "spec")
df <- data.frame(cut = perf@alpha.values[[1]], sens = perf@x.values[[1]], spec = perf@y.values[[1]])
df[which.max(df$sens + df$spec), "cut"]
}

threshold1(ROCR.simple$predictions, ROCR.simple$labels)
[1] 0.5014893
я правильно поняла, выше 0.5014893 мы принимаем решение, что наступит событие?

Автор: nokh 12.07.2017 - 18:35

Похоже мой ответ на письмо в личку не дошёл, дублирую его здесь.

Здравствуйте, nastushka.
Вы не ответили на мой уточняющий вопрос, а когда мне не понятно - то и не интересно. Я перестал отслеживать вашу тему.

Если в общем, то ROC-анализ более полезен для одного количественного показателя, а не для набора, т.к. позволяет выбрать пороговое значение диагностического показателя с наивысшими чувствительностью и специфичностью.
В случае множественной логистической регрессии, когда показателей много, анализ и описание его результатов логично проводить в два этапа.
1) Сокращение набора предикторов. Можно сделать полную модель, и отобрать значимые. Можно сделать полную полную с пошаговым отбором (stepwise). Можно отобрать наиболее сильные предикторы случайным лесом - как вы. Можно как-то ещё.
2) В окончательную модель дать только отобранные предикторы. Привести в результатах:
2.1. константу и коэффициенты регрессии - чтобы по формуле с этими показателями можно было считать риск (прогноз) для каждого конкретного случая в области применения результатов
2.2. соответствующие этим коэффициентам отношения шансов (т.е. пересчитать логиты в OR, пакеты это делают, хотя можно и вручную)
2.3. статистическую значимость для каждого члена модели.
2.1-2.3. удобно дать таблицей.
2.4. показатели диагностической эффективности: чувствительность (с 95% доверительным интервалом), специфичность (с 95% ДИ)
2.4. можно диагностическую эффективность дополнить интегральными мерами: и долей верно классифицированных случаев, и площадью под ROC-кривой. Т.е. последняя не несёт в случае множ. логистической регресии какой-то конкретики: это просто интегральная мера качества диагностики.

Автор: nastushka 12.07.2017 - 18:36

не-не он дошел, только что прочла:)))

Автор: p2004r 12.07.2017 - 18:41

Цитата(nokh @ 12.07.2017 - 18:35) *
Похоже мой ответ на письмо в личку не дошёл, дублирую его здесь.

Здравствуйте, nastushka.
Вы не ответили на мой уточняющий вопрос, а когда мне не понятно - то и не интересно. Я перестал отслеживать вашу тему.

Если в общем, то ROC-анализ более полезен для одного количественного показателя, а не для набора, т.к. позволяет выбрать пороговое значение диагностического показателя с наивысшими чувствительностью и специфичностью.
В случае множественной логистической регрессии, когда показателей много, анализ и описание его результатов логично проводить в два этапа.
1) Сокращение набора предикторов. Можно сделать полную модель, и отобрать значимые. Можно сделать полную полную с пошаговым отбором (stepwise). Можно отобрать наиболее сильные предикторы случайным лесом - как вы. Можно как-то ещё.
2) В окончательную модель дать только отобранные предикторы. Привести в результатах:
2.1. константу и коэффициенты регрессии - чтобы по формуле с этими показателями можно было считать риск (прогноз) для каждого конкретного случая в области применения результатов
2.2. соответствующие этим коэффициентам отношения шансов (т.е. пересчитать логиты в OR, пакеты это делают, хотя можно и вручную)
2.3. статистическую значимость для каждого члена модели.
2.1-2.3. удобно дать таблицей.
2.4. показатели диагностической эффективности: чувствительность (с 95% доверительным интервалом), специфичность (с 95% ДИ)
2.4. можно диагностическую эффективность дополнить интегральными мерами: и долей верно классифицированных случаев, и площадью под ROC-кривой. Т.е. последняя не несёт в случае множ. логистической регресии какой-то конкретики: это просто интегральная мера качества диагностики.


ROC для оценки модели в целом вполне себе пригоден (в том числе и для оценки модели с переменным числом предикторов). Есть методы поиска моделей основанные именно на таком критери качества. Не очень удобен он если исходов детектируемых моделью больше двух.

Автор: p2004r 12.07.2017 - 18:43

Цитата(nastushka @ 12.07.2017 - 18:34) *
И такой вопросик
data(ROCR.simple)
threshold1 <- function(predict, response) {
perf <- ROCR::performance(ROCR::prediction(predict, response), "sens", "spec")
df <- data.frame(cut = perf@alpha.values[[1]], sens = perf@x.values[[1]], spec = perf@y.values[[1]])
df[which.max(df$sens + df$spec), "cut"]
}

threshold1(ROCR.simple$predictions, ROCR.simple$labels)
[1] 0.5014893
я правильно поняла, выше 0.5014893 мы принимаем решение, что наступит событие?


Смотря что мы считаем событием. В любом разе выше границы один класс, ниже второй.

Что по коду, то ч использую library(pROC)

Автор: p2004r 12.07.2017 - 18:49

Цитата(nastushka @ 12.07.2017 - 15:12) *
spec=0,06,sens=0.94


Такая модель имеет нулевую ценность. Она "срабатывает" во всех нужных случаях, но среди "срабатываний" практически все ложные.

ЗЫ Если этот трешоилд отобрал критерий по весам и частотам, то наверное всё.

можно конечно еще их попробовать свернуть PCA и пройтись по компонентам в поисках значимой, но это уже от безысходности sad.gif.


Автор: nastushka 12.07.2017 - 18:56

поняла

Автор: nastushka 12.07.2017 - 18:59

я просто так считала

Автор: nastushka 12.07.2017 - 19:00

sensetivity=tp/(tp+fn) доля верных предсказаний плохих прибавить хороших попавшим к плохим
Специфичность
specifity (доля верных хороших+ плохие попавших в хорошие)
tn/(tn+fp)

может я неверно посчитала?

Автор: DrgLena 12.07.2017 - 19:24

spe=1-0,06=0,94

Автор: nastushka 12.07.2017 - 19:46

вы имеете ввиду, что 0,06 это чувствительность?

Автор: 100$ 12.07.2017 - 20:35

Цитата(nastushka @ 12.07.2017 - 19:46) *
вы имеете ввиду, что 0,06 это чувствительность?


Имеется виду то, что вы неправильно считаете специфичность. 1-специфичность - это значение, откладываемое на оси абсцисс исключительно для удобства.

Автор: DrgLena 12.07.2017 - 20:37

Нет, вы привели таблицу из которой можно посчитать чувствительность 134/(134+8), а также специфичность 74/(74+5). По оси Х в ROC кривой не специфичность, а 1-спец, а вы написали спец=1-74/(74+5)
100$ уже пояснил smile.gif

Автор: nastushka 12.07.2017 - 20:45

все поняла ошибку.smile.gif

Автор: nastushka 5.08.2017 - 17:10

p2004r, здравствуйте, решила написать в своем же топике, но теперь тут другой скоринг (Раньше плохой, хороший), а сейчас купит-не купит услугу(id is dep var) smile.gif

Логистическая регрессия здесь, показала ужасные результаты, почти все нули(те, кто не купили) были правильно к своему классу отнесены, а единицы(те кто купили) также к нулям.
Все что смогла сама сделать, это Дискриминантный анализ в SPSS, вроде показал точность 60%, но это ни о чем. Сильная перемешка кейсов. Можете подсказать, как мне модель выровнять?
С регрессией что спсс, что статистика также ,как и R показывали такой результат. Тут нужно только через ДА.

acc=read.csv("C:/Users/Admin/Desktop/buyning.csv", sep=";",dec=",")

getwd()

> acc$profitValueList=as.numeric(acc$profitValueList)
> acc$revenueValueList=as.numeric(acc$revenueValueList)
> acc$courtPracticeList=as.numeric(acc$courtPracticeList)
> acc$digestRedList=as.numeric(acc$digestRedList)
> acc$digestGreyList=as.numeric(acc$digestGreyList)
> acc$digestGreenList=as.numeric(acc$digestGreenList)
> acc$linkedEntitiesByCeoNumList=as.numeric(acc$linkedEntitiesByCeoNumList)
> acc$linkedEntitiesByFounderNumList=as.numeric(acc$linkedEntitiesByFounderNumList)
> acc$linkedEntitiesChildrenNumList=as.numeric(acc$linkedEntitiesChildrenNumList)
> acc$capitalList=as.numeric(acc$capitalList)
> acc$gosWinnerNumList=as.numeric(acc$gosWinnerNumList)
> acc$gosWinnerSumList=as.numeric(acc$gosWinnerSumList)
> acc$gosPlacerNumList=as.numeric(acc$gosPlacerNumList)
> acc$gosPlacerSumList=as.numeric(acc$gosPlacerSumList)
> acc$inspectionsInFutureNumList=as.numeric(acc$inspectionsInFutureNumList)
> acc$inspectionsHasViolationsNumList=as.numeric(acc$inspectionsHasViolationsNumList)
> acc$inspectionsNoViolationsNumList=as.numeric(acc$inspectionsNoViolationsNumList)
> acc$inspectionsHasViolationsFailsList=as.numeric(acc$inspectionsHasViolationsFailsList)
> acc$Выручка=as.numeric(acc$Выручка)
> acc$Прибыль=as.numeric(acc$Прибыль)
> acc$Убыток=as.numeric(acc$Убыток)
> acc$Баланс=as.numeric(acc$Баланс)
> acc$Директор.Учредитель=as.numeric(acc$Директор.Учредитель)
> acc$Директор.отдельно=as.numeric(acc$Директор.отдельно)
> acc$Учредитель.отдельно=as.numeric(acc$Учредитель.отдельно)


> index <- sample(1:nrow(acc),round(0.75*nrow(acc)))
> train <- acc[index,]
> test <- acc[-index,]

> library("MASS")


> fitTrn =lda(id~.,data=train)
Error in lda.default(x, grouping, ...) :

ошибка была
variables 15 16 appear to be constant within groups


Как мне хотя бы маломальски точную классификацию получить?

 buyning.zip ( 221,87 килобайт ) : 224
 

Автор: p2004r 6.08.2017 - 14:29

Цитата(nastushka @ 5.08.2017 - 17:10) *
p2004r, здравствуйте, решила написать в своем же топике, но теперь тут другой скоринг (Раньше плохой, хороший), а сейчас купит-не купит услугу(id is dep var) smile.gif

Логистическая регрессия здесь, показала ужасные результаты, почти все нули(те, кто не купили) были правильно к своему классу отнесены, а единицы(те кто купили) также к нулям.
Все что смогла сама сделать, это Дискриминантный анализ в SPSS, вроде показал точность 60%, но это ни о чем. Сильная перемешка кейсов. Можете подсказать, как мне модель выровнять?
С регрессией что спсс, что статистика также ,как и R показывали такой результат. Тут нужно только через ДА.

acc=read.csv("C:/Users/Admin/Desktop/buyning.csv", sep=";",dec=",")

getwd()

> acc$profitValueList=as.numeric(acc$profitValueList)
> acc$revenueValueList=as.numeric(acc$revenueValueList)
> acc$courtPracticeList=as.numeric(acc$courtPracticeList)
> acc$digestRedList=as.numeric(acc$digestRedList)
> acc$digestGreyList=as.numeric(acc$digestGreyList)
> acc$digestGreenList=as.numeric(acc$digestGreenList)
> acc$linkedEntitiesByCeoNumList=as.numeric(acc$linkedEntitiesByCeoNumList)
> acc$linkedEntitiesByFounderNumList=as.numeric(acc$linkedEntitiesByFounderNumList)
> acc$linkedEntitiesChildrenNumList=as.numeric(acc$linkedEntitiesChildrenNumList)
> acc$capitalList=as.numeric(acc$capitalList)
> acc$gosWinnerNumList=as.numeric(acc$gosWinnerNumList)
> acc$gosWinnerSumList=as.numeric(acc$gosWinnerSumList)
> acc$gosPlacerNumList=as.numeric(acc$gosPlacerNumList)
> acc$gosPlacerSumList=as.numeric(acc$gosPlacerSumList)
> acc$inspectionsInFutureNumList=as.numeric(acc$inspectionsInFutureNumList)
> acc$inspectionsHasViolationsNumList=as.numeric(acc$inspectionsHasViolationsNumList)
> acc$inspectionsNoViolationsNumList=as.numeric(acc$inspectionsNoViolationsNumList)
> acc$inspectionsHasViolationsFailsList=as.numeric(acc$inspectionsHasViolationsFailsList)
> acc$Выручка=as.numeric(acc$Выручка)
> acc$Прибыль=as.numeric(acc$Прибыль)
> acc$Убыток=as.numeric(acc$Убыток)
> acc$Баланс=as.numeric(acc$Баланс)
> acc$Директор.Учредитель=as.numeric(acc$Директор.Учредитель)
> acc$Директор.отдельно=as.numeric(acc$Директор.отдельно)
> acc$Учредитель.отдельно=as.numeric(acc$Учредитель.отдельно)


> index <- sample(1:nrow(acc),round(0.75*nrow(acc)))
> train <- acc[index,]
> test <- acc[-index,]

> library("MASS")


> fitTrn =lda(id~.,data=train)
Error in lda.default(x, grouping, ...) :

ошибка была
variables 15 16 appear to be constant within groups


Как мне хотя бы маломальски точную классификацию получить?


Поздравляю, на этот раз "генерация данных" прошла лучше smile.gif

 

Автор: nastushka 6.08.2017 - 14:57

у меня AUc=0.55, в R считала, неужели мне никак модель не улучшить?

Автор: p2004r 6.08.2017 - 16:39

Цитата(nastushka @ 6.08.2017 - 14:57) *
у меня AUc=0.55, в R считала, неужели мне никак модель не улучшить?


Ну вот knn чуть получше себя ведет, может если фичи придумать некие "что то там дифференцирующие вокруг разрешаемого кейза" в данных и станет получше.

(это складным ножом верифицировано)
Код
> table(factor(na.omit(df)$id), FNN::knn.cv(train=prcomp(na.omit(df[, -c(1, 11)]))$x[, 1:9], cl=factor(na.omit(df)$id), k=1))
  
       0    1
  0 3906  469
  1  370  106

> table(factor(na.omit(df)$id), FNN::knn.cv(train=prcomp(na.omit(df[, -c(1, 11)]))$x[, 1], cl=factor(na.omit(df)$id), k=1))
  
       0    1
  0 3959  416
  1  344  132


"Извлечение фич" это декларируют глубокие сетки, но тут маловато случаев будет. Хотя можно library(keras) (или library(mxnet)) поставить и попробовать.

PS можно еще и логарифмировать всё количественное перед pca (оно все "кривое" в плане распределения), может получше тогда свернется размерность

Автор: nastushka 6.08.2017 - 17:53

Кстати точно, попробую, прологарифмировать.
Подскажите, p2004r, как мне составить уравнение потом. Мне ведь надо не просто принести модель и сказать вот в R есть функция predict, так и предсказывайте
программисту нужно сообщить уравнение, чтобы он в CRM для автоматизации запрограммировал.

что-то ("mxnet") нет в репозитории. Видимо уже убрали sad.gif

> install.packages("mxnet")
Installing package into ?C:/Users/Admin/Documents/R/win-library/3.3?
(as ?lib? is unspecified)
Warning in install.packages :
package ?mxnet? is not available (for R version 3.3.2)

Автор: p2004r 6.08.2017 - 20:19

Цитата(nastushka @ 6.08.2017 - 17:53) *
Кстати точно, попробую, прологарифмировать.
Подскажите, p2004r, как мне составить уравнение потом. Мне ведь надо не просто принести модель и сказать вот в R есть функция predict, так и предсказывайте
программисту нужно сообщить уравнение, чтобы он в CRM для автоматизации запрограммировал.

что-то ("mxnet") нет в репозитории. Видимо уже убрали sad.gif

> install.packages("mxnet")
Installing package into ?C:/Users/Admin/Documents/R/win-library/3.3?
(as ?lib? is unspecified)
Warning in install.packages :
package ?mxnet? is not available (for R version 3.3.2)


Для knn "никак", это алгоритм ближайшего соседа и "решение" просто сами данные smile.gif

mxnet

https://github.com/apache/incubator-mxnet/tree/master/R-package

keras

https://rstudio.github.io/keras/

PS если один покупатель делал несколько заказов последовательно и это не отражено в структуре данных, то knn ошибается.

Автор: nastushka 8.08.2017 - 11:45

p2004r, подскажите, пожалуйста, а как мне нарисовать графически красиво для программиста, чтобы он уже на базе данных программировал решение. Я проявила сама инициативу хотела через дерево решений нарисовать, но пока не очень хорошо получается.
И вопрос для моего повышения знаний. Если accuracy 90%
значит ли это что на других выборках точность правильности определения будет не менее 90% т.е. из 100 наблюдений 90 будут правильно отнесены к своим классам. Или как понять эту цифру.

 

Автор: p2004r 8.08.2017 - 19:08

Цитата(nastushka @ 8.08.2017 - 11:45) *
p2004r, подскажите, пожалуйста, а как мне нарисовать графически красиво для программиста, чтобы он уже на базе данных программировал решение. Я проявила сама инициативу хотела через дерево решений нарисовать, но пока не очень хорошо получается.
И вопрос для моего повышения знаний. Если accuracy 90%
значит ли это что на других выборках точность правильности определения будет не менее 90% т.е. из 100 наблюдений 90 будут правильно отнесены к своим классам. Или как понять эту цифру.


почитайте вики сами, там все вполне понятно изложено https://en.wikipedia.org/wiki/Receiver_operating_characteristic

(ну не читать же мне вам это вслух?)

а картинку дерева решений рисовать прямо в вигнете есть у library(party) https://cran.r-project.org/web/packages/party/vignettes/party.pdf

Автор: nastushka 9.08.2017 - 15:43

p2004r, Ваше мнение, как Вы считаете имеет ли место комбинирование моделей? Т.е.! КNN-очень хорошо отделяет нули от единиц, а вот дискриминантный анализ, после того,как я его дожала, стал отделять единицы от нулей.
Есть ли смысл, сначала использовать КNN, а затем дискриминантный анализ?
Т.е. на вход предикторы, на выходе КНН получаем 1, если при этом ДА=1, то итог 1, если ДА =0, то итог=0
Когда на вход предикторы, на выходе КНН получаем 0, если ДА=1, то итог 1, если ДА =0, то итог=0
Корректно ли так будет делать?

Автор: p2004r 10.08.2017 - 00:16

Цитата(nastushka @ 9.08.2017 - 15:43) *
p2004r, Ваше мнение, как Вы считаете имеет ли место комбинирование моделей? Т.е.! КNN-очень хорошо отделяет нули от единиц, а вот дискриминантный анализ, после того,как я его дожала, стал отделять единицы от нулей.
Есть ли смысл, сначала использовать КNN, а затем дискриминантный анализ?
Т.е. на вход предикторы, на выходе КНН получаем 1, если при этом ДА=1, то итог 1, если ДА =0, то итог=0
Когда на вход предикторы, на выходе КНН получаем 0, если ДА=1, то итог 1, если ДА =0, то итог=0
Корректно ли так будет делать?


Что то посмотрю скрипач knn совсем не нужен smile.gif

Автор: nastushka 10.08.2017 - 11:16

Т.е. вы считаете, что такую верификацию из двух методов лучше не делать?

Автор: p2004r 10.08.2017 - 16:50

Цитата(nastushka @ 10.08.2017 - 11:16) *
Т.е. вы считаете, что такую верификацию из двух методов лучше не делать?


Вы условия которые написали перечитайте (ну или таблицу исходов какую нарисуйте и сократите "лишнее").

"Складывают" две модели операцией сложения. Например (раз у нас knn при k=1) -1 и 1 это исходы метода1 и -1 и 1 исходы метода2, на выходе имеем с(-2, 0, 2). То есть появилось ещё и "неизвестно". Если есть ещё и "вес" у модели, то "0" удастся избежать.

Но есть и нормальный способ обучить ансамбль методов, это взять один из пакетов заточенных именно на такой подход.

ensembleR: Ensemble Models in R
caretEnsemble: Ensembles of Caret Models
classyfire: Robust multivariate classification using highly optimised SVM ensembles

Автор: nastushka 12.08.2017 - 13:35

p2004r, я пробовала работать с тремя этими пакетами, но или у меня руки кривые безнадежно sad.gif, или ансамбливое обучение тут не помощник.

library("ensembleR")

acc1=read.xlsx("C:/Users/Admin/Desktop/buyning.xlsx")
index <- sample(1:nrow(acc1),round(0.75*nrow(acc1)))
train <- acc1[index,]
test <- acc1[-index,]
preds <- ensemble(train,test,'id',c('treebag','rpart'),'rpart')

Error in train.default(training[, predictors], training[, outcomeName], :
Stopping

Something is wrong; all the RMSE metric values are missing:
RMSE Rsquared
Min. : NA Min. : NA
1st Qu.: NA 1st Qu.: NA
Median : NA Median : NA
Mean :NaN Mean :NaN
3rd Qu.: NA 3rd Qu.: NA
Max. : NA Max. : NA
NA's :1 NA's :1


======

library("caretEnsemble")
models <- caretList(train,test, methodList=c("glm", "lm"))

Error: nrow(x) == n is not TRUE
In addition: Warning messages:
1: In trControlCheck(x = trControl, y = target) :
trControl$savePredictions not 'all' or 'final'. Setting to 'final' so we can ensemble the models

==============
library("classyfire")

acco=read.xlsx("C:/Users/admin/Desktop/buyning.xlsx")
iClass <- acco[,1]
idata <- acco[,-1]

ens <- cfBuild(inputData = idata, inputClass = iClass, bootNum = 100,
ensNum = 100, parallel = TRUE, cpus = 4, type = "SOCK")

а тут такая ошибка

Error in .initCheck(inputData, inputClass, bootNum, ensNum, parallel, :
Argument "inputData" must contain numeric values.


Шах и мат.
На что он жалуется то?

Автор: p2004r 14.08.2017 - 16:27

Цитата(nastushka @ 12.08.2017 - 13:35) *
p2004r, я пробовала работать с тремя этими пакетами, но или у меня руки кривые безнадежно sad.gif, или ансамбливое обучение тут не помощник.

library("ensembleR")

acc1=read.xlsx("C:/Users/Admin/Desktop/buyning.xlsx")
index <- sample(1:nrow(acc1),round(0.75*nrow(acc1)))
train <- acc1[index,]
test <- acc1[-index,]
preds <- ensemble(train,test,'id',c('treebag','rpart'),'rpart')

Error in train.default(training[, predictors], training[, outcomeName], :
Stopping

Something is wrong; all the RMSE metric values are missing:
RMSE Rsquared
Min. : NA Min. : NA
1st Qu.: NA 1st Qu.: NA
Median : NA Median : NA
Mean :NaN Mean :NaN
3rd Qu.: NA 3rd Qu.: NA
Max. : NA Max. : NA
NA's :1 NA's :1


======

library("caretEnsemble")
models <- caretList(train,test, methodList=c("glm", "lm"))

Error: nrow(x) == n is not TRUE
In addition: Warning messages:
1: In trControlCheck(x = trControl, y = target) :
trControl$savePredictions not 'all' or 'final'. Setting to 'final' so we can ensemble the models

==============
library("classyfire")

acco=read.xlsx("C:/Users/admin/Desktop/buyning.xlsx")
iClass <- acco[,1]
idata <- acco[,-1]

ens <- cfBuild(inputData = idata, inputClass = iClass, bootNum = 100,
ensNum = 100, parallel = TRUE, cpus = 4, type = "SOCK")

а тут такая ошибка

Error in .initCheck(inputData, inputClass, bootNum, ensNum, parallel, :
Argument "inputData" must contain numeric values.


Шах и мат.
На что он жалуется то?


Он же пишет явно на что жалуется cool.gif. С таким подходом можно "всю жизнь наверху простоять"ТМ biggrin.gif

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)