作业要求:
根据给定的影响员工离职的因素和员工是否离职的记录,分别建立多个分类预测模型:基于信息增益的决策树模型、基于基尼指数的决策树模型、朴素贝叶斯模型、支持向量机模型,还有逻辑回归模型,预测有可能离职的员工;并对各模型进行模型评估。
#本文中的训练集为dataset1,测试集为dataset2
dataset1=pd.read_csv('pfm_train.csv')
dataset2=pd.read_csv('pfm_test.csv')
先导入可能需要的库:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
一.数据清洗
1.缺失值处理
检查数据集中是否有缺失值,并决定如何处理(如填充、删除或插值)
# 统计缺失值
print(dataset1.isnull().sum())#训练集
print(dataset2.isnull().sum())#测试集
2.检查重复值
# 检查重复值
dataset1.duplicated().sum()
3.查看数据信息
# 查看数据信息
dataset1.info()
4.类别变量编码
对于类别变量(如Gender, BusinessTravel, Department等),我们需要进行编码(如独热编码或标签编码)。,根据上个步骤可知,attr数组中的特征则为object类型的。
# 对Dtype为object类型的字段进行编码
from sklearn.preprocessing import LabelEncoder
attr = ['BusinessTravel', 'Department', 'EducationField', 'Gender', 'JobRole', 'MaritalStatus', 'Over18', 'OverTime']
lbe = LabelEncoder()
for feature in attr:
data_train[feature] = lbe.fit_transform(data_train[feature])
data_test[feature] = lbe.transform(data_test[feature])
data_train.info()
5.查看列
# 查看统计信息
pd.set_option('display.max_columns',None) # 显示所有的列
dataset1.describe()
6.删除无用信息
通过上一步的运行结果可以观察到StandardHours
和Over18
这两个字段标准差为0,说明所有人的该项数据值相同,也就是说该字段对结果预测不起作用,可以删除。
此外,通过常识可以判断EmployeeNumber
这个字段对离职率的预测也是不起作用的,故可以删除
# 将EmployeeNumber、StandardHours、Over18三列删除
dataset1.drop(columns=['EmployeeNumber', 'StandardHours', 'Over18'], inplace=True)
dataset2.drop(columns=['EmployeeNumber', 'StandardHours', 'Over18'], inplace=True)
二.数据集划分
1.选择目标变量
这里预测员工离职与否,目标变量为Attrition,通常是一个二元变量,用0表示未离职,1表示离职。
dataset1['Attrition']=dataset1['Attrition'].map(lambda x:1 if x=='Yes' else 0)
dataset2['Attrition']=dataset2['Attrition'].map(lambda x:1 if x=='Yes' else 0)
# 选择特征和目标变量
X = dataset1.drop(columns=['Attrition'])
y = dataset1['Attrition']
2.划分数据集
将dataset1划分为训练集和测试集(通常按70:30或80:20的比例)。训练集用于训练模型,而测试集用于评估模型的性能。
# 将数据集拆分为训练集和验证集
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=700)
三.建立模型
1.基于信息增益的决策树模型
使用训练集和决策树算法(如scikit-learn中的DecisionTreeClassifier,设置criterion为'entropy')建立模型。
# 创建DecisionTreeClassifier实例,设置criterion为'entropy'
clf = DecisionTreeClassifier(criterion='entropy', random_state=42)
# 使用训练数据拟合模型
clf.fit(X_train, y_train)
2.基于基尼指数的决策树模型
使用训练集和决策树算法(同样使用DecisionTreeClassifier,但设置criterion为'gini')建立模型。
# 初始化DecisionTreeClassifier模型,设置criterion为'gini'
dt_clf = DecisionTreeClassifier(criterion='gini', random_state=42)
# 使用训练数据拟合模型
dt_clf.fit(X_train, y_train)
3.朴素贝叶斯模型
使用训练集和朴素贝叶斯算法(如scikit-learn中的GaussianNB或MultinomialNB)建立模型。
# 初始化GaussianNB模型
gnb = GaussianNB()
# 使用训练数据拟合模型
gnb.fit(X_train, y_train)
4.支持向量机模型
使用训练集和支持向量机算法(如scikit-learn中的SVC)建立模型。根据数据特征,可能需要调整核函数(如'linear', 'rbf', 'poly')和其他参数。
# 初始化SVC模型,这里选择'rbf'作为核函数
svm_clf = SVC(kernel='rbf', C=1.0, gamma='scale', random_state=42)
# 使用训练数据拟合模型
svm_clf.fit(X_train, y_train)
四.模型评估
1.在验证集上预测
# 在验证集上进行预测
y_predict = dt_clf.predict(X_valid)
y_predict = dt_clf.predict(X_valid)
y_predict = gnb.predict(X_valid)
y_predict = gnb.predict(X_valid)
2.计算准确率
# 计算准确率
correct_predictions = (y_predict == y_valid).sum()
total_predictions = len(y_valid)
accuracy = correct_predictions / total_predictions * 100
print("在验证集上的准确率:%f%%" % accuracy)
3.使用训练好的模型对测试集进行预测
# 使用训练好的模型对测试集进行预测
y_predict = clf.predict(dataset2)
print("预测结果:")
print(y_predict)