员工离职太正常不过了!但是如何用Python来预测离职率呢?叼爆了
大数据使企业能够确定变量,预测自家公司的员工离职率。”——《哈佛商业评论》2017年8月 “员工流失分析就是评估公司员工流动率的过程,目的是预测未来的员工离职状况,减少员工流失情况。”——《福布斯》2016年3月 进群:548377875 ? 即可获取数十套PDF哦! import?pandas?as?pd hr = pd.read_csv('HR.csv') col_names = hr.columns.tolist() print("Column names:") print(col_names) print(" Sample data:") hr.head() 我们的数据相当干净,没有缺失值: hr.isnull().any() 数据包含了14999名员工和10个特征: hr.shape (14999,10) “left”列为结果变量,值为1或0,1代表员工离开了公司,0代表没有离开。 我们发现数据中有3571名员工离职,有11428名员工没有离职。 然后我们进一步查看这两个类别下的数字所蕴含的意义: hr.groupby('left').mean() 几个观察结果:
数据可视化 我们将数据进行可视化,从而获取数据及重要特征的更清晰的展现。 员工的工作部分和离职频率的条形图 %matplotlib?inline import?matplotlib.pyplot?as?plt pd.crosstab(hr.department,hr.left).plot(kind='bar') plt.title('Turnover Frequency for Department') plt.xlabel('Department') plt.ylabel('Frequency of Turnover') plt.savefig('department_bar_chart') 我们可以看到,员工的薪资水平和离职频率有很大关系,因此薪资水平也可以作为预测结果的一个很好指标。 通常,直方图是我们在探索数据时用于分析数值变量的最有用的工具之一。 数值变量的直方图 为分类变量创建虚变量 数据集中有两个分类变量(department,salary),在用它们进行建模前需要将它们转换为虚变量。 cat_vars=['department','salary'] for?var?in?cat_vars: cat_list='var'+'_'+var cat_list = pd.get_dummies(hr[var],prefix=var) hr1=hr.join(cat_list) hr=hr1 等创建完虚变量后,还需要移除实际的分类变量。 为分类变量创建虚变量后的列名: hr.drop(hr.columns[[8,9]],axis=1,inplace=True) hr.columns.values 我们使用特征选择方法帮我们决定哪些变量非常重要,能够以很高的准确率预测员工的流动状况。现在X中一共有18个列,那么选为10个呢? from?sklearn.feature_selection?import?RFE from?sklearn.linear_model?import?LogisticRegression model = LogisticRegression() rfe = RFE(model,10) rfe = rfe.fit(hr[X],hr[y]) print(rfe.support_) print(rfe.ranking_) [True True False False True True True True False True True False False False False True True False] [1 1 3 9 1 1 1 1 5 1 1 6 8 7 4 1 1 2] 逻辑回归准确率:0.771 随机森林 from?sklearn.ensemble?import?RandomForestClassifier rf = RandomForestClassifier() rf.fit(X_train,y_train) RandomForestClassifier(bootstrap=True,class_weight=None,criterion=’gini’,max_depth=None,max_features=’auto’,max_leaf_nodes=None,min_impurity_split=1e-07,min_samples_leaf=1,min_samples_split=2,min_weight_fraction_leaf=0.0,n_estimators=10,n_jobs=1,oob_score=False,random_state=None,verbose=0,warm_start=False) print('Random Forest Accuracy: {:.3f}'.format(accuracy_score(y_test,rf.predict(X_test)))) 随机森林准确率:0.978 10折交叉验证平均准确率:0.977 平均准确率仍然和随机森林模型的准确率非常接近,所以我们可以总结出模型的泛化能力很好。 精确度和召回率 我们构建混淆矩阵来可视化由分类器生成的预测值,并评估分类的准确率。 随机森林 逻辑回归 print(classification_report(y_test,logreg.predict(X_test))) svc_y_pred = svc.predict(X_test) svc_cm = metrics.confusion_matrix(svc_y_pred,y_test,[1,0]) sns.heatmap(svc_cm,annot=True,fmt='.2f',xticklabels = ["Left","Stayed"],yticklabels = ["Left","Stayed"] ) plt.ylabel('True?class') plt.xlabel('Predicted?class') plt.title('Support Vector Machine') plt.savefig('support_vector_machine') 当一名员工离职时,我们的分类器能正确预测的概率是多少呢?这种衡量方法被称为“召回率”,快速看一下这些图表可以发现随机森林的效果最好。在上面所有的离职情况中,随机森林从1038种离职情况中正确地检索出998种情况。这表明离职“召回率”达到95%(991/1038),远好于逻辑回归(26%)和支持向量机(85%)。 ROC曲线是另一种用于衡量二元分类器的常用工具。它是一条点状线,表示一个完全随机分类器的受试者工作特征曲线;一个性能良好的分类器会尽可能的远离这条线(朝左上角)。 总结 文章到这里就结束了,本文我们通过一个人力资源数据集,用Python搭建了几个机器学习模型,最终确定随机森林模型的准确率最高,最适合预测员工离职。 不过我就不列出模型预测哪些员工会离职了,毕竟这并非我们的主要目的。记住一点,我们的算法不会人人适用。虽然员工离职率分析能帮我们制定更合理的人力资源管理决策,但不要过度依赖模型的预测结果。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |