ในส่วนนี้ผมขอใช้ Logistic Regression เพื่อคาดการณ์ว่าพนักงานจะลาออกหรือไม่

คำอธิบายโดยย่อของการถดถอยโลจิสติก

หากคุณเคยศึกษาสถิติมาก่อน คุณจะคุ้นเคยกับ Linear Regression การถดถอยเชิงเส้นสามารถทำนายตัวแปรตาม Y โดยให้ตัวแปรอิสระ X แบบจำลองของการถดถอยเชิงเส้นสามารถแสดงได้ด้วยสมการ (1)

หรือสำหรับชุดข้อมูลที่มี X มากกว่าหนึ่งตัว โมเดลจะแสดงด้วยสมการ (2)

ทุกอย่างเป็นไปด้วยดีจนกว่าเราจะมีข้อมูลที่เป็นหมวดหมู่สำหรับ Y เช่น เป้าหมายที่เรามีคือการคาดการณ์ว่าพนักงานจะลาออกหรือไม่ สมมติว่าเราแบ่งพนักงานออกเป็น 2 ประเภท คือ 1 หรือ 0 หมายเลข 1 สำหรับพนักงานที่ออก และหมายเลข 0 สำหรับพนักงานที่อยู่ ดังนั้น ปัญหาคือการประมาณค่าความน่าจะเป็นของ Y=1 เมื่อให้ X หรือ Y=0 เมื่อให้ X เนื่องจากแบบจำลองการถดถอยเชิงเส้นสร้างจำนวนต่อเนื่อง ผลลัพธ์จึงอาจอยู่นอกช่วงปิด [0,1] เพื่อจัดการกับปัญหา เราต้องใช้ฟังก์ชันเพื่อแปลงผลลัพธ์ให้อยู่ในช่วงปิด [0,1]

มาถึงฟังก์ชันซิกมอยด์ในฐานะฮีโร่แล้ว ฟังก์ชัน Sigmoid จะเปลี่ยนผลลัพธ์ของการถดถอยเชิงเส้นของเราให้เป็นเส้นโค้งรูปตัว S โดยมีค่าในช่วงปิด [0,1] เกณฑ์คือ 0.5 เมื่อผลลัพธ์ต่ำกว่า 0.5 คลาสจะเป็น 0 มิฉะนั้นคลาสจะเป็น 1 ฟังก์ชัน Sigmoid แสดงด้วยสมการ (3)

ดังนั้นเราจึงมีแบบจำลอง Logistic Regression

โมเดลการถดถอยโลจิสติก

ก่อนที่เราจะเริ่มการฝึกอบรม เราต้องเตรียมชุดข้อมูลก่อน คุณสามารถเข้าถึงชุดข้อมูลได้จากลิงค์ด้านล่าง

การเลิกจ้างและประสิทธิภาพของพนักงาน 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

จากนั้นเราจะกำหนดชุดข้อมูลลงใน data frame โดยใช้ pandas

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

ตรวจสอบให้แน่ใจว่าคุณมีเส้นทางที่ถูกต้องในการเข้าถึงไฟล์ ในกรณีนี้ ฉันใช้ Google Drive เพื่อบันทึกชุดข้อมูล

ชุดข้อมูลมี 35 คอลัมน์ (ตัวแปรอิสระ 34 ตัวและตัวแปรตาม 1 ตัว) และการสังเกต 1470 รายการ โชคดีที่เราไม่มีค่าว่างในชุดข้อมูล

ก่อนที่เราจะฝึกโมเดล เราต้องพิจารณาตัวแปรเชิงหมวดหมู่ก่อน เรามีตัวแปรประเภท 6 ตัวที่มีมากกว่าสองประเภทและตัวแปรประเภท 3 ที่มีสองประเภท สำหรับตัวแปร 3 ตัวที่มีสองประเภท ได้แก่ Attrition, Over18 และ OverTime เราต้องการแปลง "ใช่" เป็น 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 มีเพียง 1 ค่าเท่านั้น ตัวแปรเหล่านั้นจะไม่ส่งผลกระทบต่อโมเดล ดังนั้นเราจึงต้องการที่จะทิ้งพวกเขา

# 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 คอลัมน์รวมทั้ง Attrition (ตัวแปรตาม)

หลังจากที่เราจัดการตัวแปรเชิงหมวดหมู่แล้ว เราจะต้องจัดการตัวแปรตัวเลข เราต้องการแปลงค่าตัวแปรตัวเลขทุกค่าให้อยู่ในช่วงปิด [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)

ดังนั้นเราจึงกำหนดให้ Attrition เป็นตัวแปรตามของเรา

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)

ตอนนี้เราพร้อมที่จะฝึกโมเดล Logistic Regression ของเราแล้ว

# 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] G. James, D. Witten, T. Hastie และ R. Tibshirani ความรู้เบื้องต้นเกี่ยวกับการเรียนรู้ทางสถิติ ลอนดอน: Springer New York Heidelberg Dordrecht London, 2014