.

Сделать репост в соц сети!

понедельник, 11 декабря 2017 г.

Прогнозирование пола по результатам тестирования



Идея поста принадлежит Эдуарду Бабушкину. Для меня пост носит обучающий характер в работе с непонятым до конца mlr, именно поэтому намеренно работал при решении с ним. От коллег ожидаю обратной связи и ответы на вопросы в конце поста.

В данном посте решается вопрос прогнозирования пола на основе данных тестирования. Датасет взят из многолетнего исследования Ключевые факторы эффективности и текучести персонала Эдуарда Бабушкина. 

Гипотеза: интеллект и профиль черт связан с полом респондента.

Очищенный набор данных содержит 1206 наблюдений с результатами тестов КТО и Big5.
Для дальнейшей работы переменные перекодированы, в скобках курсивом даны оригинальные наименования:

'data.frame':  1206 obs. of  11 variables:
 $ gender (Ваш пол) : Factor w/ 2 levels "Ж","М"
 $ iq (Ш1. Общий балл)    : num 
 $ verb (Ш2. Вербальный IQ)   : num 
 $ erud (Ш3. Эрудиция)  : num 
 $ num  (Ш4. Числовой IQ)  : num
 $ info (Ш5.Обработка информации)  : num
 $ extr (Ш6. Экстраверсия-интроверсия) : num
 $ auto (Ш7. Независимость-согласие) : num
 $ impuls (Ш8. Импульсивность-самоконтроль) : num
 $ stab   (Ш9. Тревожность-стабильность) : num
 $ conserv (Ш10. Консерватизм-новаторство): num

Данные подвержены препроцессингу (преобразование Бокса-Кокса, z-нормирование), распределение по полу не сбалансированно, количество женщин в наборе данных больше в 2.8 раз:

  Ж   М 
888 318 

Представляется возможным предварительно оценить наличие связей с помощью диаграммы боксплот. Наибольшая разница в медианных значениях в зависимости от пола наблюдается по шкале «Тревожность-стабильность», на меньшем уровне по шкалам «Экстраверсия-интроверсия» и «Общий балл IQ».


Кросс-валидация со следующими параметрами: folds = 5L, reps = 10L, maxit = 50L.
Площадь под кривой для построенной модели в зависимости от натренированных параметров:
 
Параметры модели
auc
0.7799367

Верхние параметры
auc
0.7604274

Нижние параметры
auc
0.7732489

ROC-кривая

График Precision-Recall

В соответствии с полученными графиками вероятность наступления события установлена на уровне 0.3, тогда

  FALSE TRUE
  Ж   220   46
  М    36   59

Точность модели: 56%.

Наиболее важным фактором оказывается фактор «Тревожность-стабильность», на втором месте IQ.



Данные проверяются на новом респонденте:

newdudesclass=data.frame(stab=9.5, iq=9, impuls=4.1, extr=3.2, auto=4.7, erud=2, num=3, conserv=4, verb=2, info=3)

Prediction: 1 observations
predict.type: prob
threshold: Ж=0.50,М=0.50
time: 0.01
     prob.Ж    prob.М response
1 0.5934066 0.4065934        Ж

Вывод: в половине случаев, построенная модель позволяет спрогнозировать пол респондента по результатам тестов КТО и Big5.

Вопросы:

1. Как узнать коэффициенты статистической значимости для предикторов в mlr?
2. Нужно ли строить модель только для того варианта параметров (over, under), в котором наблюдается наибольший баланс?
3. Прогноз на новом кандидате даёт response= «Ж» при prob=0.4, но при расчётах вероятность наступления события была установлена на 0.3, можем ли мы считать в таком случае истинным для нас response= «М»?


32 комментария:

  1. давайте с базы начнем)
    какой алгоритм использовали?

    ОтветитьУдалить
    Ответы
    1. Базовые (Ваши) настройки гиперпараметров mlr. Случайны лес "classif.randomForest".

      Удалить
    2. Как узнать коэффициенты статистической значимости для предикторов в mlr?

      а в чем тогда вопрос? Есть вывод модели, есть фиче импортанс - по графику даже видно, что все значимы

      причем значимость в модели Рандом форест не обязательно должна сопровождаться значимыми различиями например по Т тесту или Манн Уитни)
      или я неправильно понял вопрос

      Удалить
    3. и как вы мульти плот сделали? через какую функцию?

      Удалить
    4. Я просто не был уверен, достаточно ли importance, вероятно, сила привычки. Спасибо!
      Долго ломал голову как это сделать, в итоге это 10 диаграмм, соединенных в Inkspace.
      Ситуация с response для меня все ещё не понятна, причём это не только в случае с mlr , а при любой логит. регрессии - мы на новых данных принимаем решение на том же уровне вероятности, что и для тестовых данных выбрали?

      Удалить
    5. я же вам давал на семинаре про мульти плот. Ну ок
      И в mlr есть про порог принятия решения - на новом датасете, я вам это тоже давал, ишите

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

      Удалить
    6. Я с мультиплота с семинара начал, но для варианта 10 диаграмм оказалось менее смотрибельно. Да, техническую установку threshold я в скрипте увидел, просто это больше вопрос ориентиров был (либо точность, либо объём :)

      Удалить
    7. на самом деле можно попробовать функцию pairs - я вам ее тоже давал
      получается матрица интеркорреляций, о чем коллега попросил

      https://edwvb.blogspot.ru/2017/05/interkorrelyacii-kratkogo-otborochnogo-testa-i-bolshoj-pyaterki-big5.html

      но вы посмотрите pairs под ggplot - и у вас должна матрица боксплотов появиться
      получается вот так

      https://edwvb.blogspot.ru/2016/12/v-kakoe-vremya-sutok-luchshe-prohodit-psihologicheskie-testy.html

      этот пост как вы заметили в Питоне сделан, но в R можно тож самое - в любом случае подобные посты требуют таких визуализаций для понимания различий

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

      Удалить
    9. Олег, позвольте с вами не согласиться. На новых данных мы принимаем решение так, как нам выгодней, при чем здесь тестовая выборка?
      Представьте, Вам Евгений Бондаренко двух кандидатов в кадровый резерв прислал? Чтобы кого то одного включить.
      Вы на какой уровень будете ориентироваться? Вы будете ориентироваться на то, у кого вероятность попадания в кадровый резерв выше.
      Вот и все.

      Удалить
    10. С вами не соглашусь, у вас задача классификации все-таки, а не регрессии, вы на выходе получаете не число - вероятность, а класс. И настраиваете свой уровень отсечения опять же ориентируясь, что вы прогоняете всех людей через классификатор. И утверждать, что при вероятности по одному сотрудника в 90%, а по другому в 80%, нужно выбирать того, у которого выше - в корне неверно, нужно ориентироваться на присвоенный класс.

      Удалить
    11. Поясните еще раз: у вас два кандидата, у одного 0, 9 вероятность, у другого 0, 8. Вам нужно выбрать одного
      вы будете ориентироваться на присвоенный класс.
      И как вы будете принимать решение в данной ситуации?

      * то, что я в корне не прав, это я понял. Но я бы хотел услышать от вас конструктив

      Удалить
    12. Если они принадлежат к одному классу, то принимать решение нужно по другому индикатору значит.
      То что у одного вероятность 0.9, а у другого 0.8, в данном случае, лишь означает что 90% деревьев в случайном лесе проголосовало, что первый кандидат принадлежит к классу 1, и 80% деревьев проголосовало, что второй кандидат принадлежит к классу 1. Если вы перестроите модель и поставите количество деревьев, больше или меньше - эти числа могут запросто измениться на другие. И при этом, в отличии от классической классификации, вы не можете даже теоретически подсчитать вероятность вашей ошибки, т.е. что на самом деле вероятность второго сотрудника выше чем у первого. Нельзя даже утверждать, что в среднем кандидат с большей вероятностью более привлекателен чем второй, у которого вероятность меньше.
      Если вы считаете иначе, прошу также конструктивно это доказать.

      Удалить
    13. Начнем с того, что я уже второй раз ловлю на том, что вы просто не читаете чужие тексты. Это не очень здорово.
      По теме.
      В любом другом алгоритме показатель вероятности точно также будет зависеть от трейн тест сплит и выбранных параметров модели. Если вы перестроите модель в любом алгоритме (просто зададите новый set.seed), то у кандидатов обязательно поменяются вероятности. И вполне допускаю, что у того, кого было 0, 9 станет меньше, чем 0, 8

      Отсюда вопрос: так на основе чего мы все таки будем принимать решение? у нас есть порог классификации и вероятность.
      У вас, правда, в запасе какой то индикатор оказался, у меня его нет

      Удалить
    14. Окей, сокращу ту логику, которую я тщетно пытался донести - если классификатор присваивает обоим сотрудникам одинаковый класс (класс присваивается, конечно, исходя из найденного порога классификации на тестовых данных) - то они для нас равнозначны, точка. Есть у вас другой какой-то индикатор, помимо результата классификатора - отлично, если нет, тогда обоснованное решение в пользу любого из кандидатов не принять. И интересно, если я повторно пишу, почти один и тот же текст, кто из нас не читаете чужие тексты?

      Удалить
    15. Вы меня просили привести конструктивно доказать вам? Не знаю, насколько конструктивно, но я вам привел свою логику.
      Если вы хотели бы обсуждать со мной конструктивно, вы бы нашли в моей логике изьян. И показали бы мне его.
      Вы в место этого ограничились констатацией своей позиции. Ну ок, но мне все таки хотелось бы услышать аргументы.

      Удалить
  2. Хотелось бы посмотреть на корреляционную матрицу. Также, учитывая специфику предикторов и датасета в целом, скорее всего randomforest не будет здесь хорошо себя показывать. Рекомендую попробовать алгоритмы glm, gam и xgb, и сравнить результаты.
    И не забывать за балансировку данных.

    ОтветитьУдалить
    Ответы
    1. готов поспорить, что случайный лес даст лучшие результаты, чем просто лог регрессия:)
      хотя я, как мне кажется, понимаю вашу логику: результаты тестов нормально распределены, для них по идее должны хорошо работать параметрические модели. Но тут есть еще одна фишка - не гарантирую, что сработает, но думаю, что да

      Удалить
    2. Спорить не вижу смысла, это ж просто "пальцем в небо") но предпосылки о том, что лог регрессия покажет хороший результат есть. Надеюсь автор сможет проверить и сообщить AUC по каждой из модели, очень интересно. Благо mlr пакет позволяет это довольно быстро сделать

      Удалить
    3. тут не о чем спорить, надо просто матчасть знать

      Удалить
    4. Олег, но если вы знаете матчасть, то чего даете общие советы?
      вот вы пишите
      "И не забывать за балансировку данных." - вообще то для справки вам сообщаю: автор поста сделал up и under samling - поэтому с вашей стороны стоило бы прокомментировать результаты.
      И если уж вы знаете матчасть, то тогда читайте внимательно посты.

      И если вы знаете про предпосылки лог регрессии - расскажите нам про эти предпосылки
      Желательно со ссылкой на источник - мне самому это интересно

      Удалить
    5. Интересно, где в посте написано, что была сделана балансировка данных?

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

      Вы уверены, что корректно проводить переписку в таком тоне с незнакомым человеком, который из чистого "преподавательского" желания комментирует здесь и хоть немного разбавляет затишье в комментариях?
      По возможности, я хотел бы общаться больше с автором поста, чтобы он решал о пользе моих советов, спасибо.

      Удалить
    6. мне совершенно неважно, кто вы и откуда.
      Особенно, если вы не умеете читать чужие тексты. Да, про балансировку было написано через жопу, но и это надо заметить, тем более, что вы как бы советуете автору поста, то должны подмечать такие особенности.

      И я уверен в одном: если коммент не несет никакой ценности, то нахрен он здесь нужен. Вы, конечно, не согласитесь с этим, ага. Можете учить в академии ДТЭК, в чем вопрос?

      Про лог регрессию опять же я вам скажу, что есть вполне обоснованное мнение, я могу привести источники


      Удалить
    7. Совет же был не вам дан, так не надо решать несет он ценность или нет. Не ваши же "ляпы" обсуждают.

      К тому же, как я уже говорил выше, с вами нет никакого желания общаться. Мало того, что вы абсолютно не интересны для меня как "эксперт", так еще и адекватно общаться не умеете. Поэтому или просто не отвечайте на мои сообщения или не публикуйте мои комментарии, как делали раньше с комментариями с критикой в других постах, где вы от кого-то требовали нормального распределения на большой выборке данных для использования теста Стъюдента или когда говорите за BigData, когда ее и в помине нет.

      Удалить
    8. Я не знаю, про что вы говорите, но я не публикую комментарий часто в случае, если он откровенную хрень несет.
      Если я вам абсолютно не интересен как "эксперт", то че сюда ходите? тем более уже давно я вам не интересен как "эксперт".
      Реализуйте себя на своей площадке.
      Создайте свой блог, в котором напишите с цитатой, что вот Бабушкин никакой не эксперт, а мудак. И докажите это.
      В чем проблема?
      Я лично так и делаю.

      Давайте про ваш коммент.
      Цитирую лословно
      "Хотелось бы посмотреть на корреляционную матрицу. Также, учитывая специфику предикторов и датасета в целом, скорее всего randomforest не будет здесь хорошо себя показывать. Рекомендую попробовать алгоритмы glm, gam и xgb, и сравнить результаты.
      И не забывать за балансировку данных."
      Если вы хотите донести мысль до автора, то надо как минимум пояснить, что вы имеете ввиду.
      Вы же изобразили из себя этакого эксперта, который предлагает делать, потому что так нужно.
      А написать надо было одну фразу с пояснением.

      И давайте уже на этом закончим: конструктива в нашем общении точно больше не будет

      Удалить
    9. "И давайте уже на этом закончим: конструктива в нашем общении точно больше не будет"

      Согласен

      Удалить
    10. Олег, т.е. я жду от вас поста в своем блоге, где вы покажете всем, какой я "эксперт", верно?
      Вы там ссылались на какой то мой пост, где я там что то неверно писал. У Вас есть прекрасная возможность показать рынку, какой я "эксперт".

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

      Удалить
    11. ну и спасибо за дискуссию) и за "эксперта")))

      Удалить
  3. Александр, а у вас up и under sampling посчитан для train или test set?

    ОтветитьУдалить
    Ответы
    1. Получается на train. Думаю, что стоит всё-таки спросить на коде, в mlr мы же это делаем через эти команды: rforest.over, rforest.under. И видим результаты и для up, и для down. У меня стали сомнения появляться.

      Удалить
    2. в чем вопрос?
      rforest.over - это просто название модели для up sampling
      rforest.under - для under sampling

      на коде лучше в группе тогда

      Удалить
  4. Коллеги вообще всем спасибо за обратную связь.

    ОтветитьУдалить