Прогнозирование ухода ценных сотрудников… ..

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

В то время как некоторые следуют неэгоистичной (демократичной) структуре, где все инженеры находятся на одном уровне и предназначены для разных должностей, таких как Front-End Design, Back-End Coding, Software Тестирование и т. Д. Но эта архитектура не используется очень крупными или многонациональными гигантами программного обеспечения. Но в целом это очень удачная и экологически чистая архитектура.

3-й тип архитектуры - это смешанная структура, которая представляет собой комбинацию двух вышеуказанных типов. Это наиболее распространенная архитектура среди софтверных гигантов.

Аналогичным образом, International Business Machine Corporation (IBM), вероятно, следует либо беспристрастной, либо смешанной структуре. Таким образом, для отдела кадров важной задачей является измерение убыли сотрудников в определенные промежутки времени. Факторы, от которых зависит отток сотрудников:

  1. Возраст сотрудника
  2. Ежемесячный доход
  3. Сверхурочные
  4. Ежемесячная ставка
  5. Расстояние от дома
  6. Годы в компании

и так далее…

IBM также сделала свою Информацию о сотрудниках общедоступной с формулировкой проблемы:

«Прогнозировать убыль сотрудников, то есть будет ли убытие сотрудников, с учетом данных о сотрудниках, то есть факторов, ответственных за сокращение»

Набор данных о сотрудниках доступен на Kaggle:



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

Ниже приводится пошаговая процедура разработки модели машинного обучения с использованием Python и Scikit-Learn Machine Learning Toolbox:

  1. Разработка модели:
#importing all the libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import pylab as pl
from sklearn.metrics import roc_curve, auc
#loading the dataset using Pandas
df = pd.read_csv('WA_Fn-UseC_-HR-Employee-Attrition.csv')
df.head()# Output shown below

#checking whether the dataset contains any missing values...
df.shape == df.dropna().shape # Output shown below

Следовательно, в наборе данных нет пропущенных значений.

Это проблема двоичной классификации, поэтому распределение экземпляров между двумя классами показано ниже:

y_bar = np.array([df[df['Attrition']=='No'].shape[0]
                 ,df[df['Attrition']=='Yes'].shape[0]])
x_bar = ['No (0)', 'Yes (1)'
#Bar Visualization 
plt.bar(x, y)
plt.xlabel('Labels/Classes')
plt.ylabel('Number of Instances')
plt.title('Distribution of Labels/Classes in the Dataset')
# Output shown below

#Label Encoding for Categorical/Non-Numeric Data
X = df.iloc[:,[0] + list(range(2,35))].values
y = df.iloc[:,1].values
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_1 = LabelEncoder()
X[:,1] = labelencoder_X_1.fit_transform(X[:,1])
X[:,3] = labelencoder_X_1.fit_transform(X[:,3])
X[:,6] = labelencoder_X_1.fit_transform(X[:,6])
X[:,10] = labelencoder_X_1.fit_transform(X[:,10])
X[:,14] = labelencoder_X_1.fit_transform(X[:,14])
X[:,16] = labelencoder_X_1.fit_transform(X[:,16])
X[:,20] = labelencoder_X_1.fit_transform(X[:,20])
X[:,21] = labelencoder_X_1.fit_transform(X[:,21])
y = labelencoder_X_1.fit_transform(y)
#Feature Selection using Random Forest Classifier's Feature
#Importance Scores
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X,y) # Output shown below

list_importances=list(model.feature_importances_)
indices=sorted(range(len(list_importances)), key=lambda k
               :list_importances[k])
feature_selected=[None]*34
k=0
for i in reversed(indices):
    if k<=33:
        feature_selected[k]=i
        k=k+1
X_selected = X[:,feature_selected[:17]]
l_features=feature_selected
i=0
for x in feature_selected:
    l_features[i] = df.columns[x]
    i=i+1
l_features = np.array(l_features)
#Extracting 17 most important features among 34 features
l_features[:17] #Output shown below

#Selecting the 17 most important features
df_features = pd.DataFrame(X_selected, columns=['Age',
                           'MonthlyIncome', 'OverTime',
                           'EmployeeNumber', 'MonthlyRate',
   ,                       'DistanceFromHome', 'YearsAtCompany',
                           'TotalWorkingYears', 'DailyRate', 
                           'HourlyRate', 'NumCompaniesWorked',
                           'JobInvolvement', 'PercentSalaryHike',
                           'StockOptionLevel', 
                           'YearsWithCurrManager',
                           'EnvironmentSatisfaction',
                           'EducationField', 'Attrition']]
df_selected.head() # Output shown below

Итак, снова необходимо выполнить кодирование меток для выбранных категориальных характеристик:

#Label Encoding for selected Non-Numeric Features:
X = df_selected.iloc[:,list(range(0,17))].values
y = df_selected.iloc[:,17].values
X[:,2] = labelencoder_X_1.fit_transform(X[:,2])
X[:,16] = labelencoder_X_1.fit_transform(X[:,16])
y = labelencoder_X_1.fit_transform(y)

Теперь этапы предварительной обработки данных завершены. Перейдем к обучению моделей: -

#80-20 splitting where 80% Data is for Training the Model
#and 20% Data is for Validation and Performance Analysis
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                   test_size=0.2, random_state=1753)
#Using Logistic Regression Algorithm for Model Training
from sklearn.linear_model import LogisticRegression
clf= LogisticRegression(verbose = 3)
#Training the Model
clf_trained = clf.fit(X_train, y_train) #Output shown below

2. Анализ эффективности модели:

= ›Точность тренировки

clf_trained.score(X_train,y_train) # Output shown below

= ›Точность проверки

clf_trained.score(X_test,y_test) # Output shown below

= ›Точность, Отзыв и F1-Score

#getting the predictions...
predictions=clf_trained.predict(X_test)
print(classification_report(y_test,predictions))

= ›Матрица неточностей

#MODULE FOR CONFUSION MATRIX
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import itertools
def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    """
    This function prints and plots the confusion matrix.
    Normalization can be applied by setting `normalize=True`.
    """
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')
print(cm)
plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)
fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0])
                                  , range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")
    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
#Generating the Confusion Matrix
plt.figure()
cm = np.array([[252, 1], [31, 10]])
plot_confusion_matrix(confusion_matrix(y_test,predictions), 
                      classes=[0,1], normalize=True
                      , title='Normalized Confusion Matrix')
# Output shown below

= ›Характеристическая кривая оператора-получателя:

#Plotting the ROC Curve
y_roc = np.array(y_test)
fpr, tpr, thresholds = roc_curve(y_roc, clf_trained.decision_function(X_test))
roc_auc = auc(fpr, tpr)
pl.clf()
pl.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
pl.plot([0, 1], [0, 1], 'k--')
pl.xlim([0.0, 1.0])
pl.ylim([0.0, 1.0])
pl.xlabel('False Positive Rate')
pl.ylabel('True Positive Rate')
pl.legend(loc="lower right")
pl.show() # Output shown below

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

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

Эта модель была развернута мной в веб-приложении с использованием php (PHP: препроцессор гипертекста) в качестве серверной части с помощью PHP-ML. Ссылка на веб-приложение приведена ниже:



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