Оглавление

  1. Мотивация автора

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

Наилучшая производительность сотрудников является иллюстрацией качества человеческих ресурсов. Этот спектакль представляет собой успех человека. Человеческие ресурсы — это критическое мышление, любознательность, статус, организованность и образование.

Машинное обучение — это изучение компьютерных алгоритмов, которые могут автоматически улучшаться благодаря опыту и использованию данных (Т. Митчелл, 1997). Это рассматривается как часть искусственного интеллекта. Алгоритмы машинного обучения строят модель на основе выборочных данных, известных как «данные для обучения», чтобы делать прогнозы или принимать решения без явного программирования для этого.

В статистике и машинном обучении метод ансамбля - это метод объединения различных наборов учащихся (индивидуальное моделирование) вместе для повышения эффективности прогнозирования. Как правило, метод ансамбля состоит из бэггинга, бустинга и укладки.

  • Бэггинг (агрегация начальной загрузки) предполагает, что каждая модель в ансамбле голосует с равным весом.
  • Повышение — это метод последовательного ансамблевого обучения для преобразования слабых базовых учеников в сильных учеников, которые работают лучше и менее предвзяты.
  • Стекирование — это метод ансамбля, который объединяет все алгоритмы машинного обучения посредством метаобучения.

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

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

Для построения модели и визуализации мы будем использовать Rверсию 4.1.1. Для построения модели, которая применяет XGBoost (Extreme Gradient Boosting) с пакетом xgboost в R, а для визуализации мы будем отображать данные с помощью ggplot2, ggpubr, и ggcorpplot.

Алгоритмы BLSMOTE (Borderline-SMOTE) пытаются определить границу каждого класса, где эти пограничные экземпляры и близлежащие экземпляры с большей вероятностью будут неправильно классифицированы, чем те, которые находятся далеко от границы (H.Han et al., 2005). При поиске оптимального значения k мы будем использовать factoextra и NbClust.

3. Метаданные

Каждое из данных обучения и тестирования составляет 8153 и 3000. Существует 21 предикторная переменная, а остальные являются предиктивными переменными. Вот список переменных-предикторов:

  1. job_level : Тип категории
  2. job_duration_in_current_job_level : числовой тип
  3. person_level : Тип категории
  4. job_duration_in_current_person_level :Числовой тип
  5. job_duration_in_current_branch : числовой тип
  6. Employee_type : Тип категории
  7. пол : Тип категории
  8. возраст : числовой тип
  9. marital_status_maried.Y.N : Двоичный тип
  10. number_of_dependeces : числовой тип
  11. Education_level : Тип категории
  12. Средний балл: Числовой тип
  13. year_градуированный : числовой тип
  14. job_duration_from_training: Числовой тип
  15. branch_rotation: числовой тип
  16. job_rotation: числовой тип
  17. assign_of_otherposition: числовой тип
  18. годовой.листья: числовой тип
  19. больной_листья: числовой тип
  20. Последнее_достижение_.: Числовой тип
  21. Achievemnet_above_100._during3quartal: Числовой тип

4. Опишите тип данных

glimpse(data_training)
glimpse(data_testing)

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

df_na_train<-data_training%>%
  select_all()%>%
  summarise_all(funs(sum(is.na(.))))
df_na_test<-data_testing%>%
  select_all()%>%
  summarise_all(funs(sum(is.na(.))))
t(df_na_train)
t(df_na_test)

И Последнее достижение, и Достижение выше 100 за 3 квартала состоят только из одного NaN. Для простых способов они будут объединены, и они будут приписывать NaN по мере центра.

Целевой класс из обучающих данных получает дисбаланс. Это требует передискретизации класса меньшинства.

5. Изучение данных

Из этих графиков плотности вот что мы получили:

  • Продолжительность работы на текущем уровне работы и продолжительность работы на текущем уровне человека кажутся похожими.
  • GPA, назначение на другую должность и больничные листы, скорее всего, будут иметь много данных с нулевым значением. Эти переменные могут иметь несколько выбросов.
  • год выпуска и возраст кажутся смещенными влево.

Нуждается в разъяснении высказывания по второму пункту.

По данным коробчатой ​​диаграммы многие предикторы имеют выброс.

Из этой визуализации я предполагаю, что некоторое максимальное значение предиктора из 0-класса больше, чем максимальное значение предиктора из 1-класса. Кроме того, мы объясним для данных категории.

Благодаря визуализации данных категории, к счастью, мы не видим никакой посторонней категории из данных тестирования. Давайте посмотрим для каждой цели класса.

Мы можем сказать, что:

  • Доля JG04 класса 0 больше, чем доля JG04 класса 1.
  • Для уровня человека PG03 класса 0 больше, чем PG03 класса 1.
  • СО типа А 0-го класса больше, чем СО типа А 1-го класса.
  • Работница-женщина не самая лучшая производительность относительно
  • Каждый сотрудник, который был женат, не лучший результат
  • Человек с образованием 4 уровня не лучший показатель

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

Эти данные нуждаются в проверке мультиколинеарности. Прежде чем данные отобразят визуализацию, нам нужно, чтобы данные категории были преобразованы с данными горячего кодирования.

df=rbind(data_training[,!(colnames(data_training)=="Best.Performance")],data_testing)
##imputation NA value
df$Last_achievement_.[is.na(df$Last_achievement_.)]=mean(df$Last_achievement_.,na.rm=T)
df$Achievement_above_100._during3quartal[is.na(df$Achievement_above_100._during3quartal)]=mean(df$Achievement_above_100._during3quartal,na.rm=T)
list_col=colnames(cat_train[,!(colnames(cat_train)=="target")])
#make dummy
df_temp=df
for (i in list_col){
  df_temp<-dummy_cols(df_temp,select_columns = i,remove_selected_columns = TRUE)
}
df_train<-cbind(df_temp[1:len_train,],Best.Performance=data_training$Best.Performance)
df_test<-df_temp[(len_train+1):(len_test+len_train),]
##Turn to data frame
df_train=data.frame(df_train)
df_test=data.frame(df_test)

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

6. Предварительная обработка данных

В зависимости от доли целевого класса необходимо генерировать данные с помощью BLSMOTE. Перед созданием данных с помощью BLSMOTE необходимо найти значение k .

fviz_nbclust(df_train[,!(colnames(df_train)=="Best.Performance")],kmeans,method='silhouette')+theme_black()

Согласно графику оптимального k, оптимальное значение достигает значения (2,0,45). Тогда мы получили оптимальное k равное2. Теперь мы можем сгенерировать целевой класс данных.

prop.table(table(df_train$Best.Performance))
data_training_new<-BLSMOTE(df_train[,(!colnames(df_train)=="Best.Performance")],df_train$Best.Performance,K=2)
data_training_new<-data_training_new$data
prop.table(table(data_training_new$class))

7. Создайте модель

Перед построением модели он убеждается, что данные должны быть преобразованы в xgb.DMatrix. XGBoost принимает только данные xgb.DMatrix.

##make x_train,y_train,x_tesst,y_test
x_train<-data_training_new[,(!colnames(data_training_new)=="class")]
y_train<-as.numeric(data_training_new$class)
x_test<-df_test
y_test<-reference_data
##Modelling
#xgboost
x_train_xgb<-xgb.DMatrix(as.matrix(x_train),label=y_train)
x_test_xgb<-xgb.DMatrix(as.matrix(x_test),label=y_test)

После получения x_train_xgb и x_test_xgb модель должна определить гиперпараметр из XGBoost и найти лучший гиперпараметр.

#xgboost
x_train_xgb<-xgb.DMatrix(as.matrix(x_train),label=y_train)
x_test_xgb<-xgb.DMatrix(as.matrix(x_test),label=y_test)
params_xgb<-list(booster = "dart", 
                 objective = "binary:logistic",eta=0.3,gamma=1,max_depth=5,
                 min_child_weight=2,subsample=1,colsample_bytree=1,lambda=1.25,alpha=0.75)
xgb_cv<-xgb.cv(params=params_xgb,
               data=x_train_xgb,nrounds=600,nfold=5,showsd = T, 
               early.stop.round = 35, maximize = F,metrics=c('auc'))
gb_dt <- xgb.train(params = params_xgb,
                   data = x_train_xgb,
                   nrounds = xgb_cv$best_iteration,
                   print_every_n = 2,
                   eval_metric=c('auc'),
                 watchlist=list(train=x_train_xgb,eval=x_test_xgb))

8. Оценка модели

Через нашу модель была построена, то мы должны увидеть, как далеко ее производительность. Мы будем использовать производительность с confusion_matrix.

Из этого изображения, вот оно для интерпретации:

  • Точность и чувствительность кажутся относительно хорошими и сбалансированными
  • С другой стороны, специфика звучит не очень хорошо. Это всего 19,26%, что означает, что доля истинно отрицательных результатов меньше, чем сумма истинно отрицательных и ложноположительных результатов.
  • Значение Каппы равно 0,0324. Это указывает на точность модели, в которой данные просто назначаются случайным образом.
  • Распространенность указывает на то, что 83,73% часто кажутся худшими показателями из наших данных тестирования.

В модели gb_dt мы можем найти важную переменную. Из важной переменной мы знаем, какой вклад в модель вносят переменные-предикторы.

  • Есть 12 переменных, которые не дают вклада в нашу модель.
  • Последняя переменная job_level_JG05 не вносит никакого вклада в нашу модель.
  • Первая переменная, job_duration_in_current_branch, оказывает наибольшее влияние на нашу модель. Кроме того, для переменной job_duration_in_current_branch мы смотрим на точки. Как мы видим, это влияние на нашу модель кажется относительно высоким. Это означает, что job_duration_in_current_branch играет важную роль, когда для данных указано низкое и высокое значение.

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

9. Заключение

Основываясь на приведенном выше объяснении, процент точности нашей модели составляет 73,47%, но специфичность слишком низкая. Также мы видим, что из 39 предикторов, которые были обработаны инженерной функцией, есть 10 важных переменных:

  • job_duration_in_current_branch
  • количество_зависимостей
  • job_rotation
  • пол_F
  • последнее_достижение
  • ежегодный отпуск
  • образование_уровень_уровень_3
  • branch_rotation
  • employee_type_RM_type_B
  • job_duration_in_current_job_level

Справочник

  1. Митчелл, Том (1997). Машинное обучение. Нью-Йорк: Макгроу Хилл.
  2. Хан, Х., Ван, В.Ю. и Мао, Б.Х. Borderline-SMOTE: новый метод избыточной выборки в обучении несбалансированных наборов данных. В материалах международной конференции по достижениям в области интеллектуальных вычислений 2005 г.