В этом разделе я хотел бы использовать логистическую регрессию, чтобы предсказать, уйдет сотрудник или нет.
Краткое объяснение логистической регрессии
Если вы изучали статистику, вы наверняка знакомы с линейной регрессией. Линейная регрессия может предсказать зависимую переменную 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.