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

Краткое объяснение логистической регрессии

Если вы изучали статистику, вы наверняка знакомы с линейной регрессией. Линейная регрессия может предсказать зависимую переменную Y с учетом независимой переменной X. Модель линейной регрессии может быть представлена ​​уравнением (1)

или для набора данных более одного X модель будет представлена ​​уравнением (2)

Все идет хорошо, пока у нас нет категориальных данных для Y. Например, наша цель — предсказать, уйдет сотрудник или нет. Предположим, мы разделили сотрудника на 2 категории, то есть на 1 или 0. Номер 1 для ушедшего сотрудника и номер 0 для сотрудника, который остался. Таким образом, проблема будет заключаться в оценке вероятности Y = 1 при заданном X или Y = 0 при заданном X. Поскольку модель линейной регрессии создает непрерывное число, результат может находиться за пределами близкого интервала [0,1]. Чтобы справиться с этой проблемой, нам нужно использовать функцию для преобразования результата в близкий интервал [0,1].

Здесь появляется сигмовидная функция как герой. Сигмовидная функция преобразует наш результат линейной регрессии в S-образную кривую со значениями в близком интервале [0,1]. Порог равен 0,5, если результат ниже 0,5, то класс равен 0. В противном случае класс равен 1. Сигмовидная функция представлена ​​уравнением (3)

Таким образом, у нас есть модель логистической регрессии.

Модель логистической регрессии

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

IBM HR Analytics Отток и производительность сотрудников | Каггл

Таким образом, мы будем использовать Python для выполнения нашего проекта. Во-первых, мы должны импортировать важные библиотеки, такие как pandas, numpy, seaborn и matplotlib.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

Затем мы назначим набор данных в фрейм данных с помощью панд.

employee_df = pd.read_csv('drive/MyDrive/Human_Resources.csv')

Убедитесь, что у вас правильный путь для доступа к файлу. В этом случае я использовал Google Диск для сохранения набора данных.

Набор данных состоит из 35 столбцов (34 независимых переменных и 1 зависимой переменной) и 1470 наблюдений. К счастью, в наборе данных нет нулевого значения.

Прежде чем обучать модель, мы должны рассмотреть категориальные переменные. У нас есть 6 категориальных переменных, которые имеют более двух категорий, и 3 категориальные переменные, которые имеют две категории. Для трех переменных, которые имеют две категории, то есть «Истощение», «Сверх18» и «Сверхвремя», мы хотели бы преобразовать «Да» в 1, а «Нет» в 0. Для 6 категориальных переменных мы будем использовать метод горячего кодирования. Итак, у каждой категории будет свой столбец и вот коды:

# Variables that have two categories
# transform "Yes" into 1 and "No" into 0.
# Let's replace 'Attritition' , 'overtime' , 'Over18' column with integers
employee_df['Attrition'] = employee_df['Attrition'].apply(lambda x:1 if x == "Yes" else 0)
employee_df['Over18'] = employee_df['Over18'].apply(lambda x:1 if x == "Y" else 0)
employee_df['OverTime'] = employee_df['OverTime'].apply(lambda x:1 if x == "Yes" else 0)
# Variables that have more than one two categories
X_cat = employee_df[['BusinessTravel','Department','EducationField','Gender','JobRole','MaritalStatus']]

# Transform The Category data to numeric using One Hot Encoding
from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder()
X_cat = onehotencoder.fit_transform(X_cat).toarray()

# Transform X_cat into dataframe
X_cat = pd.DataFrame(X_cat)

Хорошо, мы обработали категориальные переменные. Теперь посмотрим на рисунок 1.

На рисунке 1 показано, что атрибуты «EmployeeCount», «StandardHours» и «Over18» имеют только одно значение. Эти переменные просто не повлияют на модель. Поэтому мы хотели бы отказаться от них.

# It makes sense to drop 'EmployeeCount' , 'Standardhours' and 'Over18' since they do not change from one employee to the other
# Let's drop 'EmployeeNumber' as well
employee_df.drop(['EmployeeCount','StandardHours','Over18'], axis=1, inplace=True)

Таким образом, у нас есть 32 столбца, включая истощение (зависимая переменная).

После того как мы обработали категориальные переменные, мы должны обработать числовые переменные. Мы хотели бы преобразовать значения всех числовых переменных в замкнутый интервал [0,1] с помощью Min-Max Scaler. Нам приходится трансформировать значения, потому что некоторые переменные имеют огромный масштаб, а некоторые — малый. Мы хотим иметь одинаковый масштаб, поэтому используем Min-Max Scaler.

# Numeric Variables
X_num = employee_df[['Age','DailyRate','DistanceFromHome','Education','EnvironmentSatisfaction',
                     'HourlyRate','JobInvolvement','JobLevel','JobSatisfaction','MonthlyIncome',
                     'MonthlyRate','NumCompaniesWorked','OverTime','PercentSalaryHike','PerformanceRating',
                     'RelationshipSatisfaction','StockOptionLevel','TotalWorkingYears','TrainingTimesLastYear','WorkLifeBalance',
                     'YearsAtCompany','YearsInCurrentRole','YearsSinceLastPromotion','YearsWithCurrManager']]

# Transform numeric varibles using Min-Max Scaler
# Scale the data using MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_num = scaler.fit_transform(X_num)
X_num = pd.DataFrame(X_num)
X_num

Затем мы можем объединить категориальные переменные и числовые переменные как X (наши независимые переменные).

# Concat X_cat and X_num
X = pd.concat([X_cat,X_num], axis=1)

Таким образом, мы устанавливаем истощение в качестве нашей зависимой переменной.

y = employee_df['Attrition']

Кроме того, мы хотели бы разделить данные обучения и тестовые данные с соотношением 75:25.

# Split the data into train and test data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

Теперь мы готовы обучать нашу модель логистической регрессии.

# Train data using Logistic Regression
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)

# The prediction if we input test data
y_pred = model.predict(X_test)

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

# Testing Set Performance
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report

# Accuracy
print("Accuracy {} %".format(100 * accuracy_score(y_test, y_pred)))

# Precision
print("Precision {} %".format(100 * precision_score(y_test, y_pred)))

# Recall
print("Recall {} %".format(100 * recall_score(y_test, y_pred)))

# f1-score
print("f1-score {} %".format(100 * f1_score(y_test, y_pred)))

И мы получили результат.

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

Использованная литература:

[1] Дж. Джеймс, Д. Виттен, Т. Хасти и Р. Тибширани, Введение в статистическое обучение. Лондон: Springer New York Heidelberg Dordrecht London, 2014.