kaggel竞赛之员工离职分析 | 您所在的位置:网站首页 › 离职率对比图 › kaggel竞赛之员工离职分析 |
问题背景
本文是kaggle中的案例,员工离职分析,数据集中包括可能影响员工离职的各种因素(包括绩效水平,岗位, 薪资水平等九个变量) 以及员工是否离职标签。 数据来源于kaggle官网kaggle/hr-analytics ,(下载不方面的同学可以留言) 数据挖掘目标: 找出影响员工离职的因素,并建立员工是否离职预测模型 变量说明下面是变量说明表,对数据集中的所有变量进一步解释说明 1 读取数据 # 员工离职分析 import pandas as pd import matplotlib.pyplot as plt # 1读取数据 data=pd.read_csv('HR_comma_sep.csv')2 数据初探 使用data.info()查看总体信息,共有10个变量,样本量为14999,且数据质量很高, 没有空值, 为了区别, 将原数据‘sales’列名改为’jobs’ ,并将因变量放在第一列。 # 为了区别, 将原数据‘sales'列名改为’jobs' data.columns=['satisfaction_level', 'last_evaluation', 'number_project', 'average_montly_hours', 'time_spend_company', 'Work_accident', 'left','promotion_last_5years', 'jobs', 'salary'] # 为了方便处理,将相应变量'left',放在第一列 data = data.reindex(columns = [ 'left','satisfaction_level', 'last_evaluation','number_project','average_montly_hours', 'time_spend_company', 'Work_accident','promotion_last_5years', 'salary','jobs']) # 3.1 数值型变量分布 plt.rcParams['font.sans-serif'] = ['simsun'] # 指定默认字体 plt.rcParams['axes.unicode_minus'] = True # 解决保存图像是负号'-'显示为方块的问题 plt.rcParams['boxplodianprops.color'] = 'red' columns_number = ['satisfaction_level', 'last_evaluation', 'number_project', 'average_montly_hours', 'time_spend_company'] # 数值型标签 title_Chinse = ['满意程度', '绩效', '项目数', '月均工作时长','工作年限'] fig = plt.figure(figsize=(10,5),num=1) subplot_num = len(columns_number) for i,col in enumerate(columns_number): plt.subplot(1, 9, 2*i+1) plt.boxplot(data[col], widths=0.5) plt.title(title_Chinse[i]) plt.xlabel(col) plt.xticks([]) del i, col, subplot_num
经过数据的描述性统计探究,总体上对各个变量以及各个变量对员工离职的影响有一定的了解, 下面开始建模。建模之前的数据预处理分为以下几个步骤。 之前的分析结果表明,该数据不需要做离群点,缺失值处理。将分类学变量数字化,多类别无序变量转为one_hot编码归一化处理,消除数据量纲的影响。数据随机分为训练集和测试集两部分 # 数据转化 (分类型变量数字化) from sklearn import preprocessing, model_selection,tree,naive_bayes,svm,metrics # 分类型也分两种,无序和有序。 有序可以直接数字化,无序数字化会产生错误,转为one_hot编码 # salary 有序 salary = list(data['salary'].value_counts().index ) enc = preprocessing.OrdinalEncoder(categories = [salary]) enc.fit([['low']]) salary = enc.transform([[i] for i in data['salary']]) data['salary'] = salary # jobs无序 jobs = list(data['jobs'].value_counts().index ) enc = preprocessing.OneHotEncoder(categories=[jobs]) enc.fit([['sales']]) jobs = enc.transform([[i] for i in data['jobs']]).toarray() data.drop('jobs', inplace=True, axis=1) # 可以原地操作, 删除不需要的行或列 data = pd.merge(data, pd.DataFrame(jobs), left_index=True, right_index=True ) # 数据归一化处理 mmscaler = preprocessing.MinMaxScaler() # 实例化一个归一化对象 data.loc[:,['number_project', 'average_montly_hours', 'time_spend_company']] = mmscaler.fit_transform(data.loc[:,['number_project', 'average_montly_hours', 'time_spend_company']]) # 数据分割 X = data.iloc[:,1::] ; y= data['left'] #from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = model_selection.train_test_split( X, y, test_size=0.3, random_state=0) 模型建立这里分别用分类问题常用的几个模型建模, 决策树,朴素贝叶斯,支撑向量机。 # 训练模型 # 决策树 dt = tree.DecisionTreeClassifier() dt = dt.fit(X_train,y_train)#[n_samples, n_features] #dt.predict(data.iloc[1998:2010,1::]) # 预测数据的结构与X相同 ,返回结构与y相同 # 朴素贝叶斯 gnb = naive_bayes.GaussianNB() gnb.fit(X_train,y_train) gnb.predict(data.iloc[:,1::]) # 支持向量机 parameters=[{'kernel':['rbf'],'gamma':[1e-3,1e-4], 'C':[1,10,100,1000]}] clf = model_selection.GridSearchCV(svm.SVC(), parameters) 模型评估 分类算法常用指标评估 # 模型评估 # 1 常用分类指标的计算 data_pre = pd.DataFrame({'dt':dt_pre, 'gnb':gnb_pre, 'svc':svc_pre}) # acuuracy Scores = np.empty((3,4)) for i in range(3): print(i) y_pred = data_pre.iloc[:,i] #accuracy Scores[i,0]=metrics.accuracy_score(y_test, y_pred) # precisoin Scores[i,1]=metrics.precision_score(y_test, y_pred) # recall Scores[i,2]=metrics.recall_score(y_test, y_pred) # f1_score Scores[i,3]=metrics.f1_score(y_test, y_pred) # 混淆矩阵 print(metrics.confusion_matrix( y_pred,y_test)) 模型accuracyprecisionrecallf1_score决策树0.976444440.929097610.972061660.95009416贝叶斯0.740.46250.784200390.58184417支撑向量机0.801555560.691292880.252408480.36979534 roc曲线 # 2 分类模型roc曲线 fig = plt.figure(dpi =300) dtcurve = metrics.plot_roc_curve(dt, X_test, y_test) gnbcurve = metrics.plot_roc_curve(gnb, X_test, y_test,ax=dtcurve.ax_) svccurve = metrics.plot_roc_curve(svc, X_test, y_test,ax=dtcurve.ax_) plt.title('各模型ROC曲线') plt.show()
1 变量分布没有检验,可能不满足高斯分布,使用基于高斯的朴素贝叶斯模型的效果有限 . 2 在数据处理时,对多分类变量做了one_hot编码处理, 使得维度增大,数据稀疏,支持向量机模型受到了限制。 |
CopyRight 2018-2019 实验室设备网 版权所有 |