Разработка функций, избыточная выборка, прогнозирующее машинное обучение, контролируемое обучение, прогнозирование истощения

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

Какие ключевые факторы приводят к выбытию сотрудников?

Этот проект основан на гипотетическом наборе данных, загруженном из IBM HR Analytics Employee Attrition & Performance. Он содержит 1470 точек данных (строк) и 35 характеристик (столбцов), описывающих происхождение и характеристики каждого сотрудника; и помечены (контролируемое обучение), продолжают ли они работать в компании или ушли работать в другое место. Модели машинного обучения могут помочь понять и определить, как эти факторы связаны с оттоком рабочей силы.

Исследовательский анализ данных (EDA)

Давайте импортируем соответствующие библиотеки Python и прочитаем файл данных. Блокнот Jupyter с кодами Python здесь.

df = pd.read_csv(‘WA_Fn-UseC_-HR-Employee-Attrition.csv’)
df.head()

Набор данных хорошо организован, без пропущенных значений. Целевой класс - дисбаланс с истощением 16%.

Уходят ли сотрудники из-за того, что им плохо платят? Сотрудникам выплачивается почасовая оплата в размере от 30 до 100 долларов, и, похоже, сокращение происходит на всех уровнях, независимо от почасовой оплаты труда сотрудников. Это может быть подтверждено позже при важности функции.

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

В этот анализ включены только 3 отдела.

for dpmt in df['Department'].unique():
    print('\n', dpmt, ':')
    print(df[df['Department']==dpmt]['JobRole'].value_counts())

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

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

for col in df.select_dtypes(['object']).columns:
    print(col, ':', sorted(df[col].unique()))

Базовая модель производительности

Затем я разделил данные на соотношение 80:20. Укажите в коде параметр «stratify = y», чтобы пропорция классов в выходном наборе данных была такой же, как в предоставленном столбце стратификации.

Совет: поскольку цель y имеет двоичные категориальные классы с 84% «0» и 16% «1», «stratify = y» гарантирует, что разделение 80:20 будет иметь 84% «0» и 16% «1» в обоих выходных наборах данных.

Поскольку набор данных несбалансирован, используйте «StratifiedKFold» в перекрестной проверке при обучении моделей, и производительность каждой базовой модели может быть сведена в таблицу.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=SEED, stratify=y)

kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=SEED)

Результаты производительности базовой модели ужасны: для большинства моделей значения F1 варьируются от 20% до 40%. После настройки гиперпараметров и порога логистическая регрессия достигла показателя F1 50,5% и отзыва 48,9%.

Совет: НЕ используйте точность в качестве показателя производительности для этого сценария класса дисбаланса. Если модель наивно классифицирует все точки данных до класса «0», то эта бесполезная модель получит 84% точности!

Выбор функции

Нижеуказанные функции отбрасываются, поскольку они не содержат никакой полезной информации:
«Over18», «EmployeeCount», «EmployeeNumber», «StandardHours».

Кроме того, если объекты тесно связаны друг с другом (мультиколлинеарность), один из них должен быть удален, чтобы не вводить в заблуждение линейные модели, такие как логистическая регрессия. Хотя древовидные модели не подвергаются прямому воздействию, они также могут привести к чрезмерной подгонке. Выполните приведенный ниже код, чтобы найти наиболее коррелированные функции, и отбросьте ту, которая имеет более низкую важность.

df_top10 = df.loc[:,top10_features.index].join(df['Attrition'])
sns.set(style="white")
mask = np.zeros_like(df_top10.corr(), dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
fig, ax = plt.subplots(figsize=(9,8))
cmap = sns.diverging_palette(255, 10, as_cmap=True)
sns.heatmap(df_top10.corr().round(2), mask=mask, annot=True,
            cmap=cmap , vmin=-1, vmax=1, ax=ax)

Функциональная инженерия

Создана новая функция «EduField_Dept», которая определяет, связана ли «JobRole» с «EducationField» с метками «0» = не связано, «1» = связано, «2» = в некоторой степени связано. Однако HR, похоже, отлично справился с подбором должностей, поскольку эта функция оказалась бесполезной.

Другой набор новых функций также создан на основе моих собственных наблюдений и интуиции:
· Job_Coy = JobLevel / (YearsAtCompany + 1)
· Edu_Age_TotalWorking = Education / (Age + TotalWorkingYears)
· CurrMgr_Coy = YearsWithCurrManager / (YearsAtCompany + 1)
· CurrRole_CurrMgr = YearsInCurrentRole / (YearsWithCurrManager + 1)

Совет: добавьте +1 к знаменателю, чтобы избежать деления на ноль

С этими новыми функциями давайте снова запустим коды производительности модели, включая настройку гиперпараметров (ищите длинный набор кода). На этот раз классификатор случайного леса показал результат F1 49,6% и отзыв 61,7%.

Обработка данных о дисбалансе

Этот двухклассовый набор данных несбалансирован (84% против 16%). В результате существует вероятность того, что построенная модель может быть смещена в сторону большинства и чрезмерно представленного класса. После применения синтетической техники передискретизации меньшинства (SMOTE) для избыточной выборки класса меньшинства можно наблюдать некоторое улучшение как в F1-оценке, так и в отзыве.

Случайный лесной классификатор стал последней победившей моделью с оценкой F1 55,7% и самым высоким отзывом 68,1%. Это может быть наивысший возможный результат, достигнутый с учетом ограничений, присущих набору данных.

Ключевые выводы (на основе гипотетического набора данных)

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

Путь вперед

Модели машинного обучения так же хороши, как и данные, которые вы им вводите, и большее количество данных укрепит модель. Например, в этом наборе данных функция «Рейтинг производительности» ограничена только оценками 3 и 4. Если включить полный спектр оценок производительности, можно получить больше информации. В реальной жизни получить правильные данные зачастую сложнее, чем сама аналитика.

Заключение

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

Коды Python со встроенными комментариями доступны на моем GitHub, не стесняйтесь ссылаться на них. И файл презентации находится здесь.



Спасибо за чтение!
Надеюсь, вам понравились мои рассказы. Чтобы получить неограниченный доступ к качественному контенту на Medium, станьте участником Medium!