Share |

суббота, 31 марта 2018 г.

Индивидуальные факторы успешности: применение пакета LIME для задач регрессии в R



Напомню, что пакет LIME появился в ответ на проблему "черного ящика" машинного обучения: предиктивная модель показывает прогноз (сколько кандидат будет продавать, будет он успешным или нет, насколько у него серьезные риски увольнения или нет), но модель не отвечает на вопрос о том, какое именно качество кандидата "западает". Речь идет о непараметрических моделях, в параметрических есть коэффициенты, поэтому если мы стандартизуем признаки, то можем понимать вес переменных, см. подробнее Интерпретабельность HR-аналитики, пост не про это.
См. также с тему Про деструкторы в отношениях с руководителем. И о том, как правильно их измерять
Итого, LIME позволяет ответить на вопрос про конкретного кандидата, какие качестве его "вытаскивают", какие "западают".
Цель поста - показать, как LIME работает на задачах классификации, а нам бы хотелось использовать LIME для задач регрессии, дожития, кластеризации.....

Ну и так. 

Я показываю решение на основе датасета case1 первого пакета по HR аналитике в R. Как установить, см. Пакет R HR analytics для HR аналитиков. Используем датасет "case1". Понятно, что кейс игрушечный, но достаточный для того, чтобы вы умели применять его на своих данных.

Описание данных

У нас есть информация о 81 сотруднике компании: информация при приеме - уровень IQ, измеряемый с помощью теста, наличие аналогичного опыта на предыдущем месте работы, образование. И спустя время после начала работы мы измеряем уровень продаж.
Задача - на основе данных о кандидате на входе в компанию спрогнозировать продажи.
Поскольку у нас цель поста показать пакет LIME для задачи регрессии, я не буду вникать в особенности задачи прогноза, просто скажу, что у нас есть две значимые переменные для прогноза - IQ и E (наличие релевантного опыта работы).

Решение

Необходимые пакеты

library(lime)
library(HRanalytics)
data("case1")

и отбираем необходимые переменные
df = case1[, c('Продажи', 'IQ', 'E')]
Далее я переменную E - опыт - делаю факторной только для того, чтобы показать, что факторные переменные также работают в модели.
df$E = as.factor(df$E)
И модель. Напоминаю, что я делаю совсем простую модель, поскольку цель в другом.
model = lm(Продажи ~ IQ + E, df)
Переходим к пакету LIME. Первое, что нам нужно, определить тип модели, выясняем его так.
class(model)
[1] "lm"
И создаем тип модели
model_type.lm = function(x, ...) {
    return("regression")
}

Т.е. мы говорим LIME, что мы в типе модели 'lm' будем использовать регрессию.
Следующая формула нужна, чтобы показать, какой тип переменной прогноза желаем используем (числовая в отличие от вероятности для классификации).
predict_model.lm = function(x, newdata, type, ...) {
   pred = predict(x, newdata, type ='response')
    return(as.data.frame(pred))
  }
Собственно ради двух вышеуказанных форму и нужен был пост:). Но поскольку я в интернете не встретил полного описания, то сделал сам.
Далее мы тренируем эхплейнер - то, что в LIME отвечает за индивидуальные прогнозы
explainer = lime(df[, c( 'IQ', 'E')], model)
Обратите внимание, я указываю эксплейнеру конкретные переменные датасета. Задаем новые данные - я показываю двух новых кандидатов.
newd = data.frame(IQ=c(99, 37),  E=c('1', '0'))
Как видите, у одного высокий интеллект и наличие опыта работы, у другого низкий интеллект и отсутствие опыта работы. И запускаем эхплейнер на новых данных.
explanation = explain(newd, explainer, n_features = 2 )
Думаю, что с помощью ?explain вы сможете прочитать, что здесь что обозначает. Получаем вот такой вывод
head(explanation)
model_type case model_r2 model_intercept model_prediction feature feature_value feature_weight   feature_desc
1 regression    1 0.276435        79.85067         93.79742      IQ            99       5.499671 97 < IQ <= 102
2 regression    1 0.276435        79.85067         93.79742       E             2       8.447084          E = 1
3 regression    2 0.726847        92.15528         70.59510      IQ            37     -13.919076       IQ <= 91
4 regression    2 0.726847        92.15528         70.59510       E             1      -7.641104          E = 0
   data prediction
1 99, 2   93.56856
2 99, 2   93.56856
3 37, 1   30.02060
4 37, 1   30.02060
И самое вкусное, что надо показывать Заказчику
plot_features(explanation, ncol = 1)

Картинка

Здесь интуитивно понятная картинка:

  • каждая диаграмма для каждого кандидата;
  • переменные по каждому кандидату (попутно замечу, что высота столбика говорит о весе фактора);
  • зеленый цвет означает, что качество кандидата позволяет ему показывать более высокие результаты, красное - это наоборот - "западение".




__________________________________________________________
На этом все, читайте нас в фейсбуке, телеграмме и вконтакте

Комментариев нет:

Отправить комментарий

Популярные сообщения

п