精华内容
下载资源
问答
  • 本文针对企业员工的一些特征来判断员工是否离职,利用RapidMiner软件构建员工离职预测模型,分析影响员工离职的重要因素,比如员工月收入,是否加班,是否出差等,预测企业员工是否具有离职倾向,为企业提前做出判断...
  • 员工离职预测数据集 https://dongfangyou.blog.csdn.net/article/details/109398904
  • 员工离职预测训练赛:利用pandas和sklearn包,分析哪些因素会影响员工的离职情况,并对测试集进行相关预测。 本次项目主要用到pandas和sklearn这两个工具。用pandas进行数据清洗,数据转换,以及特征提取。用sklearn...
  • 员工离职预测-数据集

    2021-03-30 20:18:41
    员工离职预测-数据集
  • 员工离职预测

    2020-06-17 14:24:00
    所以通过模型预测员工离职的价值就日益凸显出来了,该模型可以大大地提高HR部门的工作效率,同时也可以降低因人员变动而需要额外支出的人力成本。当然员工离职的原因都是多方面的,并非一个简单的数学模型所能预测的...

    1.项目目标

    在任何一家企业里,员工队伍的稳定性对于企业的发展都非常的重要。所以通过模型预测员工离职的价值就日益凸显出来了,该模型可以大大地提高HR部门的工作效率,同时也可以降低因人员变动而需要额外支出的人力成本。当然员工离职的原因都是多方面的,并非一个简单的数学模型所能预测的。在此,我们只是通过这个案例来掌握机器学习建模的完整里程。完成的问题解决流程请参考附件中的Notebook文档。

    2.数据集简介

    该数据集共收集了14999条员工数据,每位员工都记录了12个指标,其中11个为特征指标,1个为标签指标。该数据集非常的干净,没有任何异常值和缺失值,可以直接来进行建模。

    3.数据集中各列特征说明

    KeywordsMeanningtypevalue range
    satisfaction_level员工满意度数值型0~1
    last_evalution员工绩效数值型0~1
    number_probject参与的项目数量数值型2~1
    average_monthly_hours每月平均工作时间数值型96~310
    time_spend_company工作年限数值型2~10
    work_accident工作中是否出现差错数值型0和1
    left是否离职数值型0和1
    promotion_last_5years过去五年是否得到提升数值型0和1
    department部门object类别值
    salary薪资object类别值

    4.流程简介

    • 读取员工离职数据集
    • 数据探索性分析
    • 建立决策树模型和支持向量机模型
    • 评估两个模型的效果
    • 项目总结

    数据集和源代码
    员工离职预测

    展开全文
  • 数据分析——员工离职预测

    千次阅读 2021-04-05 11:39:13
    员工离职预测一. 题目描述二. 数据说明三. 步骤实现1.导入并查看2.数据探索性分析3.数据处理4.模型分析5.结果分析(1) 可视化的结果分析(2)特征选择结果分析(3)多模型交叉验证结果分析 一. 题目描述 员工是否准备...

    一. 题目描述

    员工是否准备离职是困扰用人单位的问题,其关系到单位业务的开展及新人员的招聘,及时的分析出有离职倾向的员工成为关键的因素。数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资提升比例等)以及员工是否已经离职的对应记录。

    二. 数据说明

    数据分为训练数据和测试数据,分别保存在pfm_train.csv和pfm_test.csv两个文件中。 其中训练数据主要包括1100条记录,31个字段,主要字段说明如下:
    在这里插入图片描述

    三. 步骤实现

    1.导入并查看

    首先进行观察使用的数据是csv文件格式,其中自变量30个,因变量为1个(是否离职)。数据集字符型字段有7个(BusinessTravel/Department/EducationField/Gender/JobRole/MaritalStatus/Over18/OverTime)数值型字段有24个。
    导入需要的库

    import pandas as pd
    import numpy as np
    import seaborn as sns
    from sklearn.model_selection import train_test_split,cross_val_score
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn import svm
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import accuracy_score
    from sklearn import metrics 
    

    导入数据

    pd.set_option('display.max_columns',None)
    pd.set_option('display.max_rows',None)
    data_train = pd.read_csv('pfm_train.csv')
    # 训练集总共1100条数据
    data_test = pd.read_csv('pfm_test.csv')
    # 测试集总共350条数据
    data = pd.concat([data_train,data_test],axis = 0)
    

    查看基本信息

    data.head()
    data.info()
    data.describe()
    

    在这里插入图片描述
    删除常量

    data.drop('EmployeeNumber',axis=1)
    data.drop('Over18',axis=1)
    data.drop('StandardHours',axis=1)
    

    2.数据探索性分析

    #-*- coding: utf-8 -*-
    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif']=['SimHei'] 
    plt.title('人力资源总体情况')
    labels = [u'离职',u'在职'] 
    sizes = [data['Attrition'].value_counts()[1], data['Attrition'].value_counts()[0]] 
    colors = ['c','pink'] 
    patches,text1,text2 = plt.pie(sizes,labels=labels,colors=colors,autopct = '%3.2f%%', 
                                  shadow = False, 
                                  startangle =90, 
                                  pctdistance = 0.6) 
    plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=(1.1,1.05),borderaxespad=0.3)
    plt.axis('equal')
    plt.show()
    print('离职人员:',data['Attrition'].value_counts()[1])
    print('在职人员:',data['Attrition'].value_counts()[0])
    #离职人员178人,占比16.18%;在职人员922人,占比83.82%
    

    在这里插入图片描述
    #各个职位中离职和未离职人数占比——柱状图

    data_JobRole=pd.crosstab(data.JobRole,data.Attrition)
    data_JobRole.div(data_JobRole.sum(1).astype(float), axis=0).plot(kind='bar', stacked=True)
    

    在这里插入图片描述

    plt.figure(figsize=(10, 10))
    data_Attrition_JobRole =data.groupby('JobRole').Attrition.count()
    plt.pie(data_Attrition_JobRole, labels=data_Attrition_JobRole.index, autopct="%1.2f%%",
                 startangle=90)
    plt.legend()
    

    在这里插入图片描述

    3.数据处理

    def resetAge(name):
        if (name < 24) & (name > 18) & (name == 58):
            return 1
        elif (name == 18) & (name == 48) & (name == 54) & (name == 57) & (name > 58) :
            return 0
        else:
            return 2
    
    
    def resetSalary(s):
        if s>0 & s<3725:
            return 0
        elif s>=3725 & s<11250:
            return 1
        else:
            return 2
    
    
    def resetPerHike(s):
        if s >= 22 & s < 25:
            return 0
        elif (s >= 11 & s < 14) | (s > 14 & s < 22):
            return 1
        else:
            return 2
    
    
    data['PercentSalaryHike'] = data['PercentSalaryHike'].apply(resetPerHike)
    data['MonthlyIncome'] = data['MonthlyIncome'].apply(resetSalary)
    data['Age'] = data['Age'].apply(resetAge)
    
    numerical_cols = data.select_dtypes(exclude = 'object').columns
    categorical_cols = data.select_dtypes(include = 'object').columns
    feature_cols=[col for col in numerical_cols if col not in ['EmployeeNumber','Over18','StandardHours']]
    x_data=pd.concat([data[feature_cols],data[categorical_cols]],axis=1)
    y_data=data['Attrition']
    x_data=pd.get_dummies(x_data)
    

    查看数据之间相关性

    corr=x_data.corr()
    corr
    

    热力图进行表示

    plt.figure(figsize=(16, 16))
    sns.heatmap(corr,xticklabels=corr.columns.values,yticklabels=corr.columns.values)
    plt.show()
    

    在这里插入图片描述
    也可以直接根据皮尔逊相关系数选择与要预测的属性列Attrition相关性最高的10个属性

    features = data.corr()['Attrition'].abs().sort_values(ascending=False)[:11]
    features.drop('Attrition', axis=0, inplace=True)
    features = features.index
    features
    
    

    在这里插入图片描述

    4.模型分析

    进行编码并删除无用变量

    cata_result = pd.DataFrame()
    for i in data.columns:
        if data[i].dtype == 'O':
            cata = pd.DataFrame()
            cata = pd.get_dummies(data[i], prefix=i)
            cata_result = pd.concat([cata_result, cata], axis=1)
    
    for i in data.columns:
        if data[i].dtype == 'O':
            data = data.drop(i, axis=1)
    
    data = pd.concat([data, cata_result], axis=1)
    

    代入模型

    sep = 1100
    X = data.iloc[0:sep,:].drop('Attrition',axis = 1)
    y = data.iloc[0:sep,:]['Attrition']
    data_test_use = data.iloc[sep:,:]
    data_test_use1 = data_test_use.drop('Attrition',axis=1)
    
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=2)
    
    model = {'LR': LogisticRegression(), 'svm': svm.SVC(), 'RMF': RandomForestClassifier(random_state=10, warm_start=True,
                                                                                         n_estimators=26,
                                                                                         max_depth=6,
                                                                                         max_features='sqrt'),
             'CART': DecisionTreeClassifier(), 'KNN': KNeighborsClassifier()}
             
    for i in model:
        model[i].fit(X,y)
        score = cross_val_score(model[i],X,y,cv=5,scoring='accuracy')
        print("%s:%.3f(%.3f)"%(i,score.mean(),score.std()))
    
    

    逻辑回归效果最好
    在这里插入图片描述
    训练集准确度能达到90%,测试集能达到86.9%

    5.结果分析

    (1) 可视化的结果分析

    从三个满意度进行分析
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    由图分析得,离职的员工对工作环境和关系的满意度出现了较低的评分,但中位数相当,故不作为决定性影响因素,而公司满意度出现了明显特征:离职员工的评分整体偏低,且离职人员对公司满意度整体波动较大。故公司满意度对员工离职的影响较大。
    在这里插入图片描述

    在这里插入图片描述

    从性别上来看男性偏多。从年龄上看,离职的人比在职的人整体年龄偏低,并且 24之前和58岁的人员流动很大,而在年龄分段之内离职倾向不大,趋于缓和,部分的特数值没有离职人员。
    在这里插入图片描述
    在这里插入图片描述

    从受教育程度上来看,受教育程度最高的,离职率越低,受教育程度低的,离职率高,而受教育程度中等的差别不大。从月收入来看,表现出明显的月收入低的人,离职的波动越大。
    在这里插入图片描述
    在这里插入图片描述

    在职的人群中,不加班的占大多数,离职的人群中,加班所占比例较大。工作与生活平衡程度较低和较高的时候都容易出现离职现象

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    数据集中在0-4年,第2,3年离职的人数较多;距离上次升职时间为3年,跟目前管理之共事3年,出现离职现象较多。
    在这里插入图片描述
    在这里插入图片描述
    研发部门的人离职率低,出差频率中等偏高的人更容易离职。

    总体来说,离职人员约占总人数的16%,离职员工的月收入比在职员工偏低,,大学专业和出差频率两项有明显的影响,经常出差的人流动性大。男性员工离职的更多,单身职员的离职的概率比较大,职业角色里,代理销售的人员流动大。可以刻画出形象,离职的人特征偏向单身男性代理销售,经常出差且月收入偏低,对公司满意度较低。

    (2)特征选择结果分析

    特征选择是从多维度的特征中选取出表征明显的特征显得非常的重要。特征选择主要可以从数据相关性角度和信息增益的角度来考虑。皮尔森相关系数也称皮尔森积矩相关系数,是一种线性相关系数,是最常用的一种相关系数。记为r,用来反映两个变量X和Y的线性相关程度,r值介于-1到1之间,绝对值越大表明相关性越强。通过计算,影响程度最高的分别为工作年限,年龄,职业级别,三个工作年限,月收入,股票期权,工作满意度和参与度。

    (3)多模型交叉验证结果分析

    预测并分类我们首先可以想到逻辑回归,根据输出,在不调参情况下,首选的逻辑回归具有较好的准确率。接着比较朴素贝叶斯和逻辑回归。由于逻辑回归和朴素贝叶斯分类器都采用了极大似然法进行参数估计,所以它们会被经常用来对比。.两者比较明显的不同之处在于,逻辑回归属于判别式模型,而朴素贝叶斯属于生成式模型。具体来说,两者的目标虽然都是最大化后验概率,但是逻辑回归是直接对后验概率P(Y|X)进行建模,而朴素贝叶斯是对联合概率P(X,Y)进行建模,所以说两者的出发点是不同的。朴素贝叶斯分类器要求“属性条件独立假设”即,对于已知类别的样本x,假设x的所有属性是相互独立的。这就导致了两点与逻辑回归的不同之处:朴素贝叶斯的限制条件比逻辑回归更加严格,意味着逻辑回归的应用范围更广。

    展开全文
  • kaggle员工离职预测案例(1)

    千次阅读 2021-04-19 10:58:44
    过采后的数据 传送门 建模处理过程请看《kaggle员工离职预测案例(2)》 模型评估《kaggle员工离职预测案例(3)》 背景 朋友圈无意中看到了老师分享的一篇关于模型评估的文章《机器学习模型评估教程!》,文章对建模后...

    传送门🚪

    建模处理过程请看《kaggle员工离职预测案例(2)
    模型评估《kaggle员工离职预测案例(3)》

    背景

    朋友圈无意中看到了老师分享的一篇关于模型评估的文章《机器学习模型评估教程!》,文章对建模后的模型评估进行了深入浅出的评估思路梳理和解读。文章的重点在于模型评估部分,数据梳理和建模部分较为基础故省略不谈。作为一名机器学习的初学者,这简直是一次绝佳的案例学习的机会。so,废话不多说,找到文中的给到的数据来源,开整!

    等等…开整之前先简单说一下案例的背景。简单来讲,就是通过已有的数据集来建模预测员工的离职情况。是否会离职?(YES OR NO)很明显一个简单的二分类问题。数据集中包含了很多项关于员工的数据维度,比如基本的个人信息,教育程度,员工满意度,薪资情况等等。详细的数据解读会在后面说明。

    数据来源

    此案例数据集来源kaggle中的一个比赛项目,数据集下载链接如下:
    https://www.kaggle.com/pavansubhasht/ibm-hr-analytics-attrition-dataset

    Do It !

    数据展示:

    因变量(y):
    (1)Attrition:员工是否已经离职,1表示已经离职,2表示未离职,这是目标预测值;
    自变量(X):
    (1)Age:员工年龄 ;
    (2)MonthlyRate:月薪;
    (3)BusinessTravel:商务差旅频率,Non-Travel不出差,Travel_Rarely不经常出差,Travel_Frequently经常出差;
    (4)Department:员工所在部门,Sales销售部,Research & Development研发部,Human Resources人力资源部;
    (5)DistanceFromHome:公司跟家庭住址的距离,从1到29,1最近,29最远;
    (6)Education:员工的教育程度,从1到5,5教育程度最高;
    (7)EducationField:员工所学习的专业领域,Life Sciences生命科学,Medical医疗,Marketing市场营销,Technical Degree技术学位,Human Resources人力资源,Other其他;
    (8)EmployeeNumber:员工号码;
    (9)EnvironmentSatisfaction:员工对于工作环境的满意程度,从1到4,1的满意程度最低,4的满意程度最高;
    (10)Gender:员工性别,Male男性,Female女性;
    (11)JobInvolvement:员工工作投入度,从1到4,1为投入度最低,4为投入度最高;
    (12)JobLevel:职业级别,从1到5,1为最低级别,5为最高级别;
    (13)JobRole:工作角色:Sales Executive销售主管,Research Scientist科学研究员,Laboratory Technician实验室技术员,Manufacturing Director制造总监,Healthcare Representative医疗代表,Manager经理,Sales Representative销售代表,Research Director研究总监,Human Resources人力资源;
    (14)JobSatisfaction:工作满意度,从1到4,1满意程度最低,4满意程度最高;
    (15)MaritalStatus:员工婚姻状况,Single单身,Married已婚,Divorced离婚;
    (16)MonthlyIncome:员工月收入,范围在1009到19999之间;
    (17)NumCompaniesWorked:员工曾经工作过的公司数;
    (18)Over18:年龄是否超过18岁;
    (19)OverTime:是否加班,Yes表示加班,No表示不加班;
    (20)PercentSalaryHike:工资提高的百分比;
    (21)PerformanceRating:绩效评估;
    (22)RelationshipSatisfaction:关系满意度,从1到4,1满意度最低,4满意度最高;
    (23)StandardHours:标准工时;
    (24)StockOptionLevel:股票期权水平;
    (25)TotalWorkingYears:总工龄;
    (26)TrainingTimesLastYear:上一年的培训时长,从0到6,0没有培训,6培训时间最长;
    (27)WorkLifeBalance:工作与生活平衡程度,从1到4,1平衡程度最低,4平衡程度最高;
    (28)YearsAtCompany:在目前公司工作年数;
    (29)YearsInCurrentRole:在目前工作职责的工作年数
    (30)YearsSinceLastPromotion:距离上次升职时长
    (31)YearsWithCurrManager:跟目前的管理者共事年数;
    (32)DailyRate:日薪;
    (33)EmployeeCount:员工人数;
    (34)HourlyRate:时薪;
    (35)MonthlyRate:月薪;

    数据分析:

    导入一些必需包,涉及建模的包后面会有。

    import csv
    import pandas as pd  
    import numpy as np
    from scipy import stats #
    import matplotlib.pyplot as plt
    import seaborn as sns
    import warnings
    # 忽略警告
    warnings.filterwarnings('ignore') 
    # 使用 ggplot 画图风格
    plt.style.use('ggplot')
    %matplotlib inline;
    
    data = pd.read_csv('WA_Fn-UseC_-HR-Employee-Attrition.csv')
    data.tail()
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    缺失值验证

    a = data.loc[data['Attrition']=='No'].count()[0]
    b = data.loc[data['Attrition']=='Yes'].count()[0]
    labels = ['0','1']
    explo=[0.1,0]
    plt.pie([a,b],labels=labels,explode=explo,shadow=True,startangle=0,autopct='%1.2f%%',wedgeprops={'edgecolor':'black'})
    plt.show()
    

    在这里插入图片描述
    分析:


    1. 数据结构1470行(样本容量)*35列(变量),其中数值型变量26个,文本型变量9个。
    2. 35个变量中EmployeeCount,EmployeeNumber,Over18,StandardHours的这四个,常识上认为员工编号与是否离职关系不大(否则过于玄学,哈哈),另外三个变量所有员工都一致,对最终的结果影响不大,可以删除上述四个变量
    3. 数值型变量需要考虑离散程度,是否需要数据标准化;文本型变量需要考虑one-hot编码
    4. 因变量离职情况分布不,离职的样本只占全体样本的16%,这种情况可能会导致模型在很大程度上学到的都是未离职的特征,离职的样本过少而导致没有学习到,sad。针对这种情况需要考虑降采法或者过采法进行数据样本平衡。看到这里你一定会问哪一种方法更好?说实话我也不知道,所以后面我们两种方法都试一遍,看看哪种方法模型的精度更好。

     #删除上述四个无关变量
    data = data.drop(['EmployeeCount','EmployeeNumber','Over18','StandardHours'], axis='columns')  
    #对删除后的数据依旧类型分类,文本型和数值型。
    category=[f for f in data.columns if data.dtypes[f] =='object'] 
    numeric=[f for f in data.columns if data.dtypes[f] !='object']
    

    可以分别打印出来看一下,很好,删除了得到了新的data。
    在这里插入图片描述

     #展示数值型变量和因变量Attrition的关系,这里用
    plt.figure(figsize = (30,30))
    for i in numeric:
        plt.subplot(5,6,numeric.index(i)+1)
        sns.boxplot(x = 'Attrition',y = i,data = data)
    

    在这里插入图片描述

     #展示数值型变量的数据分别情况
    data.hist(edgecolor='black', linewidth=1.2, figsize=(20, 20));
    

    在这里插入图片描述

     #热力图展示
    data.Attrition[data['Attrition']=='Yes']=int(1)
    data.Attrition[data['Attrition']=='No']=int(0)
    data[['Attrition']] = data[['Attrition']].astype(int)
    
    corrmat = data.corr()
    k = len(corrmat[abs(corrmat['Attrition'])>0.04].index)
    # 获取前k个重要的特征名
    cols = corrmat.nlargest(k,'Attrition')['Attrition'].index.tolist()
    plt.figure(figsize=(20,15))
    sns.heatmap(data[cols].corr(),annot=True,square=True)
    

    在这里插入图片描述
    分析:


    1. 从箱型图中可以看出单个变量中哪一种情况对Attrition的影响更大。比如Age变量中可以看出,年纪轻的比年纪大的更容易离职。
    2. 热力图中可以看出某个变量特征和Attrition的相关性数据。越接近1表示正相关性越高,越接近-1表示负相关性越高,越接近0表示相关性越低。
    3. 数据分布图中可以看出像AgeEducation特征它们的数据分类类似正太分布;但是像 DistanceFromHomeMonthlyIncomeYearsAtCompanyYearsInCurrentRole等这类特征它们的数据分布很明显的呈现右偏,也可以说成正偏态,这种情况可以考虑通过.log1p( ) 函数进行纠正


    数据处理:

    step 1:对数据进行归一化处理。

    这里挑选了部分数值型变量进行归一化,使它们的参考系处于同一标准,比如0-1之间。
    (为什么要这么做?可以参考《机器学习之数据的偏态分布和数据的标准化》)

     #采用MinMaxScaler对数据进行标准化
    from sklearn.preprocessing import MinMaxScaler
    data_norm = data
    lst = ['Age',
     'DailyRate',
     'DistanceFromHome',
     'Education',
     'EnvironmentSatisfaction',
     'HourlyRate',
     'JobInvolvement',
     'JobLevel',
     'JobSatisfaction',
     'MonthlyIncome',
     'MonthlyRate',
     'NumCompaniesWorked',
     'PercentSalaryHike',
     'PerformanceRating',
     'RelationshipSatisfaction',
     'StockOptionLevel',
     'TotalWorkingYears',
     'TrainingTimesLastYear',
     'WorkLifeBalance',
     'YearsAtCompany',
     'YearsInCurrentRole',
     'YearsSinceLastPromotion',
     'YearsWithCurrManager']
    for i in lst:
        data_norm['{}_norm'.format(i)] = MinMaxScaler().fit_transform(data[i].values.reshape(-1,1))
    #删除原有变量    
    data_norm = data_norm.drop(lst,axis='columns')
    data_norm
    

    在这里插入图片描述

    step 2: 对文本型变量进行One-Hot编码处理

     #先把文本型变量找出来储存为新的datafrme-data1_norm
    category=[f for f in data_norm.columns if data_norm.dtypes[f] =='object'] 
    data1_norm =  data_norm[category]
    data1_norm
    

    一共7个,完美

     #可以分别检查一下其中有没有特殊值
    for i in category:
        print(data1_norm[i].value_counts())
        print('*'*40)
    

    在这里插入图片描述

     #使用pandas的.get_dummies()方法可以轻易的将他们进行one-hot编码操作。
    data_dummies = pd.get_dummies(data1_norm)
    print(list(data_dummies))
    data_dummies  
    

    在这里插入图片描述

     #将编码后的data与原始data 合并,并删除原有的文本型变量。
    data_final_norm = pd.concat((data_norm.drop(list(data1_norm), axis='columns'),data_dummies),axis=1)
    

    在这里插入图片描述
    经过一系列的处理,原本35列数据变成52列数据,我们把得到的最终数据保存为一个新的CSV文件,以防丢失(后面建模就用到我们这个最终的数据啦。)

    data_final_norm.to_csv('data_final_norm.csv',index=0) #不保存行索引
    

    step 3.1: 降采样

    降采样的目的就是让多的情况(未离职)的样本数量变的和少的情况(离职)的数量一样多。我们要做的就是在(未离职)的样本中随机取出n个样本,n=(离职)的数量。

    # 得到所有离职样本的索引
    number_Attrition = len(data_final_norm[data_final_norm.Attrition == 1])
    Attrition_indices = np.array(data_final_norm[data_final_norm.Attrition == 1].index)
    
    # 得到所有非离职样本的索引
    normal_indices = data_final_norm[data_final_norm.Attrition == 0].index
    
    # 在正常样本中随机采样出指定个数的样本,并取其索引
    random_normal_indices = np.random.choice(normal_indices, number_Attrition, replace = False) #注意replace参数的使用
    random_normal_indices = np.array(random_normal_indices)
    
    # 有了正常和异常样本后把它们的索引都拿到手
    under_sample_indices = np.concatenate([Attrition_indices,random_normal_indices])
    
    # 根据索引得到降采样所有样本点
    under_sample_data = data_final_norm.iloc[under_sample_indices,:]
    
    # 降采样 样本比例
    print("正常样本所占整体比例: ", len(under_sample_data[under_sample_data.Attrition == 0])/len(under_sample_data))
    print("异常样本所占整体比例: ", len(under_sample_data[under_sample_data.Attrition == 1])/len(under_sample_data))
    print("降采样策略总体样本数量: ", len(under_sample_data))
    

    可以把最终结果打印出来,平衡了,木问题。
    在这里插入图片描述

    step 3.2 过采样

    降采样的目的就是让少的情况(离职)的样本数量变的和多的情况(未离职)的数量一样多。我们要做的就是随机生成n个(离职)样本,n=(未离职)的数量 减去(离职)的数量。
    因为要随机生成一些样本数据,我们这里直接调用imblearn库的RandomOverSampler(ROSP)方法。关于具体说明,可以参考《》。

    from imblearn.over_sampling import RandomOverSampler
    
    columns=data_final_norm.columns
    # 在特征中去除掉标签
    features_columns=columns
    features=data_final_norm[features_columns]
    labels=data_final_norm['Attrition']
    
    features_train, features_test, labels_train, labels_test = train_test_split(features, 
                                                                                labels, 
                                                                               test_size=0.3, 
                                                                              random_state=0)
    #需要先初始化一下,然后传入数据特征和标签
    oversampler = RandomOverSampler(random_state=0)
    os_features,os_labels=oversampler.fit_resample(features_train,labels_train)
    
    #查看一下生成的数据量
    len(os_labels[os_labels==1])  # 输出862                                                                   
    
     #可以可视化展示过采后的结果,离职和未离职数据一样多了。
    sns.countplot('Attrition',data=os_features)
    c = os_features[os_features['Attrition']==0]
    d = os_features[os_features['Attrition']==1]
    print(c.shape[0])
    print(d.shape[0]
    

    在这里插入图片描述
    对上面两种方法不清楚的可以参考我的老师写的一个案例博客《逻辑回归案例模板——信用卡欺诈检测》,里面有非常详细的解释。我的代码也是参考的这个案例。

    训练集、测试集划分:

    因为我们要验证降采和过采哪一种方案会更好,所以要分别对降采后的数据和过采后的数据进行数据集划分。

    1. 降采后的数据

    from sklearn.model_selection import train_test_split
    
    X_undersample = under_sample_data.iloc[:, under_sample_data.columns != 'Attrition']
    y_undersample = under_sample_data.iloc[:, under_sample_data.columns == 'Attrition']
    
    #取出所有的特征数据和标签数据
    X = data_final_norm.iloc[:, data_final_norm.columns != 'Attrition']
    y = data_final_norm.iloc[:, data_final_norm.columns == 'Attrition']
    
    #整个数据集进行划分,注意random_state一定要设置一样的,因为要进行过采样的对比
    X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 0)
    
    #降采样数据进行划分
    X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(
    X_undersample,y_undersample,test_size = 0.3,random_state = 0
    )
    

    2.过采后的数据

     #可以可视化展示过采后的结果,离职和未离职数据一样多了。
    X_oversample = os_features.iloc[:, os_features.columns != 'Attrition']
    y_oversample = os_features.iloc[:, os_features.columns == 'Attrition']
    
    X_train_oversample, X_test_oversample, y_train_oversample, y_test_oversample = train_test_split(
        X_oversample,y_oversample,test_size = 0.3,random_state = 0)
    
     #可以可视化展示过采后的结果,离职和未离职数据一样多了。
    print('初始训练集包含样本数量:',len(X_train))
    print('初始测试集包含样本数量:',len(X_test))
    print('初始样本总数:',len(X_train) + len(X_test))
    print("")
    print("过采样训练集包含样本数量: ", len(X_train_oversample))
    print("过采样测试集包含样本数量: ", len(X_test_oversample))
    print("过采样样本总数: ", len(X_train_oversample)+len(X_test_oversample))
    print("")
    print("降采样训练集包含样本数量: ", len(X_train_undersample))
    print("降采样测试集包含样本数量: ", len(X_test_undersample))
    print("降采样样本总数: ", len(X_train_undersample)+len(X_test_undersample))
    

    降采后和过采后的数据比较:
    在这里插入图片描述
    写到这里,数据的处理的工作已经完成了。后面需要做的就是选择不同的模型进行训练学习,并选择其中最好的一个模型进行评估。请继续看《kaggle员工离职预测案例(2)》

    这里需要特别说明的是,本文没有对偏态数据进行纠正处理。

    展开全文
  • 案例背景及数据分析处理过程请看《kaggle员工离职预测案例(1)》 建模处理过程请看《kaggle员工离职预测案例(2)》 背景 一切的一切,因为这篇文章《机器学习模型评估教程!》 三级目录 from sklearn.metrics import ...

    传送门🚪

    案例背景及数据分析处理过程请看《kaggle员工离职预测案例(1)
    建模处理过程请看《kaggle员工离职预测案例(2)

    背景

    一切的一切,因为这篇文章《机器学习模型评估教程!
    在第二篇文章中,我们罗列了在原始数据、降采数据、过采数据下的逻辑回归分类模型、决策树分类模型、随机森林分类模型,这样一共得到九个结果。我们在不同模型中挑选出了其中表现最好的几个(标准参考了 召回率和准确率),如下:

    逻辑回归模型备注
    召回率80%,精准率80%降采数据
    召回率84%,精准率79%👍过采数据
    决策树模型备注
    召回率94%,精准率73%降采数据,默认参数
    召回率82%,精准率78.9%降采数据,调参后
    随机森林模型备注
    召回率84%,精准率83% 👍降采数据,默认参数
    召回率91%,精准率83%👍👍降采数据,GridSearchCV调参
    召回率92.85%,精准率84.35% 👍👍👍降采数据,RandomizedSearchCV调参

    原始数据下的模型因为类别不平衡的篇问题,不在我们讨论的范围内。篇2大费周章的在原始数据下建模的目的在于练习、对比 。😉

    精明的机器学习者知道其中的窍门。两个类别的规模远不相等。在这种情况下,准确度的衡量标准是没有太大意义的。即使这些数字可能在 "论文"上看起来很好。

    这一篇章中我们将引入ROC-AUC评估标准来进一步的对我们的模型进行评估。


    何为ROC-AUC?

    大约10年前在machine learning文献中一统天下的标准:分类精度;在信息检索(IR)领域中常用的recall和precision,等等。其实,度量反应了人们对”好”的分类结果的追求,同一时期的不同的度量反映了人们对什么是”好”这个最根本问题的不同认识,而不同时期流行的度量则反映了人们认识事物的深度的变化。

    近年来,随着machine learning的相关技术从实验室走向实际应用,一些实际的问题对度量标准提出了新的需求。特别的,现实中样本在不同类别上的不均衡分布(class distribution imbalance problem)。使得accuracy这样的传统的度量标准不能恰当的反应分类器的performance。举个例子:测试样本中有A类样本90个,B 类样本10个。分类器C1把所有的测试样本都分成了A类,分类器C2把A类的90个样本分对了70个,B类的10个样本分对了5个。则C1的分类精度为 90%,C2的分类精度为75%。但是,显然C2更有用些。另外,在一些分类问题中犯不同的错误代价是不同的(cost sensitive learning)。这样,默认0.5为分类阈值的传统做法也显得不恰当了。

    近年来,随着machine learning的相关技术从实验室走向实际应用,一些实际的问题对度量标准提出了新的需求。特别的,现实中样本在不同类别上的不均衡分布(class distribution imbalance problem)。使得accuracy这样的传统的度量标准不能恰当的反应分类器的performance。举个例子:测试样本中有A类样本90个,B 类样本10个。分类器C1把所有的测试样本都分成了A类,分类器C2把A类的90个样本分对了70个,B类的10个样本分对了5个。则C1的分类精度为 90%,C2的分类精度为75%。但是,显然C2更有用些。另外,在一些分类问题中犯不同的错误代价是不同的(cost sensitive learning)。这样,默认0.5为分类阈值的传统做法也显得不恰当了。

    为了解决上述问题,人们从医疗分析领域引入了一种新的分类模型performance评判方法——ROC分析。ROC分析本身就是一个很丰富的内容,有兴趣的读者可以自行Google,这里只做些简单的概念性的介绍。

    ROC的全名叫做Receiver Operating Characteristic,其主要分析工具是一个画在二维平面上的曲线——ROC curve。平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)。对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。这样,此分类器就可以映射成ROC平面上的一个点。调整这个分类器分类时候使用的阈值,我们就可以得到一个经过(0, 0),(1, 1)的曲线,这就是此分类器的ROC曲线。

    一般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上方。因为(0, 0)和(1, 1)连线形成的ROC曲线实际上代表的是一个随机分类器。如果很不幸,你得到一个位于此直线下方的分类器的话,一个直观的补救办法就是把所有的预测结果反向,即:分类器输出结果为正类,则最终分类的结果为负类,反之,则为正类。虽然,用ROC curve来表示分类器的performance很直观好用。可是,人们总是希望能有一个数值来标志分类器的好坏。于是Area Under roc Curve(AUC)就出现了。AUC(Area Under roc Curve)是一种用来度量分类模型好坏的一个标准。AUC的值就是处于ROC curve下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的performance

    更多内容可参考文章《ROC曲线与AUC值》《机器学习基础(1)- ROC曲线理解

    举个栗子🌰:

    在这里插入图片描述
    上图是一个以FPR为横轴,TPR为纵轴的ROC图例

    1. 左上角的点Pefect Classification(TPR=1,FPR=0),为完美分类,也就是这个模型100%正确,预测全对。此时FP = 0, FN = 0。用人话说就是没有原本离职的员工被预测成不离职,也没有不离职的员工被预测成离职。

    2. 点A(TPR>FPR)模型A的判断大体是正确的。TPR≈0.62,FPR≈0.3 ,我们由TPR和FPR的公式可以推导出TP/FN ≈3/2, FP/TN≈3/7。如果用二分类矩阵表示为:
      在这里插入图片描述
      👽用人话说就是15个员工,成功预测离职了3个,成功预测不离职的7个,一共对了10个。但是有3个原本不会离职的人被预测成了离职(误杀),还有两个原本会离职的人被预测成不离职(漏杀)。对于这一结果我们表示满意。

    3. 中线上的点B(TPR=FPR),也就是模型B全都是蒙的,蒙对一半,蒙错一半;

    4. 上半平面的点C1(TPR>FPR)。TPR≈0.78(方便计算我们取0.8),FPR≈0.1 ,我们由TPR和FPR的公式可以推导出TP/FN ≈4/1, FP/TN≈1/9。如果用二分类矩阵表示为:
      在这里插入图片描述
      👽 用人话说就是15个员工,成功预测离职了4个,成功预测不离职的9个,一共对了13个。但是有1个原本不会离职的人被预测成了离职(误杀),还有1个原本会离职的人被预测成不离职(漏杀)。对于这一结果我们表示非常满意,相比模型A更好了。

    5. 下半平面的点C2(TPR<FPR),恰恰和点C1完全相反。

    上图中的某一个点是在某一具体阈值下的提现,如果我们遍历所有的阈值就会得到ROC曲线。
    AUC值为ROC曲线所覆盖的区域面积,显然,AUC越大,分类器分类效果越好AUC的取值范围为0-1。

    • AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
    • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
    • AUC =0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
    • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

    在这里插入图片描述

    一句话概括重点:

    ROC曲线越成弓形,越接近左上角,模型越好。AUC值越大越好。


    代码部分

    今天我们一共画6个模型的ROC曲线。分别是随机森林模型RandomizedSearchCV调参,随机森林模型GridSearchCV调参,决策树模型–默认参数,决策树模型–调参后,逻辑回归过采数据,逻辑回归过采数据。一起看看它们的表现。

    #导入必需包
    from sklearn.metrics import roc_curve
    from sklearn import metrics
    import matplotlib as mpl
    
    #随机森林模型RandomizedSearchCV调参
    #调用文章2的最佳参数进行建模
    rf_best_params={'n_estimators': 1800, 'min_samples_split': 2, 'min_samples_leaf': 2, 'max_features': 'auto', 'max_depth': 110, 'bootstrap': True}
    rf_clf = RandomForestClassifier(**rf_best_params)
    #训练模型
    rf_clf.fit(X_train_undersample, y_train_undersample.values.ravel())
    #调用 roc_curve 计算fpr、tpr值。注意roc_curve()这里调用的是训练集的数据,我们要观察的是模型在训练集中的表现
    fpr_rf_clf,tpr_rf_clf,thresholds_rf_clf = roc_curve(y_test,rf_clf.predict_proba(X_test)[:,1])
    #调用metrics.auc()方法计算AUC值。
    roc_auc_rf_clf = metrics.auc(fpr_rf_clf, tpr_rf_clf)
    
    #随机森林模型GridSearchCV调参
    rf_best_params2={'bootstrap': True, 'max_depth': None, 'max_features': 'auto', 'min_samples_leaf': 2, 'min_samples_split': 5, 'n_estimators': 1500}
    rf_clf2 = RandomForestClassifier(**rf_best_params2)
    rf_clf2.fit(X_train_undersample, y_train_undersample.values.ravel())
    fpr_rf_clf2,tpr_rf_clf2,thresholds_rf_clf2 = roc_curve(y_test,rf_clf2.predict_proba(X_test)[:,1])
    roc_auc_rf_clf2 = metrics.auc(fpr_rf_clf2, tpr_rf_clf2)
    
    # 决策树模型--默认参数
    tree_clf = DecisionTreeClassifier(random_state=42)
    tree_clf.fit(X_train_undersample, y_train_undersample.values.ravel())
    fpr_tree_clf,tpr_tree_clf,thresholds_tree_clf = roc_curve(y_test,tree_clf.predict_proba(X_test)[:,1])
    roc_auc_tree_clf = metrics.auc(fpr_tree_clf, tpr_tree_clf)
    
    # 决策树模型--调参后
    best_params={'criterion': 'entropy', 'max_depth': 7, 'min_samples_leaf': 4, 'min_samples_split': 2, 'splitter': 'random'}
    tree_clf2 = DecisionTreeClassifier(**best_params)
    tree_clf2.fit(X_train_undersample, y_train_undersample.values.ravel())
    fpr_tree_clf2,tpr_tree_clf2,thresholds_tree_clf2 = roc_curve(y_test,tree_clf2.predict_proba(X_test)[:,1])
    roc_auc_tree_clf2 = metrics.auc(fpr_tree_clf2, tpr_tree_clf2)
    
    #逻辑回归过采数据
    best_c = 1
    lr = LogisticRegression(C=best_c,penalty = 'l1',solver='liblinear')
    lr.fit(X_train_oversample, y_train_oversample.values.ravel())
    fpr_lr,tpr_lr,thresholds_lr = roc_curve(y_test,lr.predict_proba(X_test)[:,1])
    roc_auc_lr = metrics.auc(fpr_lr, tpr_lr)
    
    #逻辑回归降采数据
    best_c = 10
    lr2 = LogisticRegression(C=best_c,penalty = 'l1',solver='liblinear')
    lr2.fit(X_train_undersample, y_train_undersample.values.ravel())
    fpr_lr2,tpr_lr2,thresholds_lr = roc_curve(y_test,lr2.predict_proba(X_test)[:,1])
    roc_auc_lr2 = metrics.auc(fpr_lr2, tpr_lr2)
    
    #中文设置
    mpl.rcParams['font.sans-serif'] = ['simHei']
    mpl.rcParams['axes.unicode_minus'] = False
    #绘图
    plt.figure(figsize=(10,10))
    plt.plot(fpr_rf_clf, tpr_rf_clf, 'b', label = '随机森林随机调参Val AUC = %0.3f' % roc_auc_rf_clf)
    plt.plot(fpr_rf_clf2, tpr_rf_clf2, 'r', label = '随机森林GS调参Val AUC = %0.3f' % roc_auc_rf_clf2)
    plt.plot(fpr_tree_clf, tpr_tree_clf, 'y', label = '决策树默认Val AUC = %0.3f' % roc_auc_tree_clf)
    plt.plot(fpr_tree_clf2, tpr_tree_clf2, 'g', label = '决策树调参Val AUC = %0.3f' % roc_auc_tree_clf2)
    plt.xlabel('FPR')
    plt.ylabel('TPR(RECALL)')
    plt.legend(loc=4)
    plt.show()
    

    在这里插入图片描述

    总结:⏭

    由上图可见,效果最好的模型是随机森林模型(采用RandomizedSearchCV调参方式),采用普通GridSearchCV调参的随机森林模型表现也十分接近(本来就是一个模型,只是调参方式不同而已。仔细看他们选出的最佳参数,其实也十分相似。)

    决策树模型的表现最差,由此我们可以进一步进行改进(参数?,变量?)

    最后的最后

    展开全文
  • DC算法竞赛——员工离职预测

    千次阅读 2019-09-22 11:48:03
    员工离职预测 一、概述 1、项目来源:https://www.dcjingsai.com/static_page/cmpList.html 2、字段信息如下: 训练数据主要包括1100条记录,31个字段,主要字段说明如下: (1)Age:员工年龄 (2)Attrition:员工...
  • 员工离职预测---ZhouYi
  • 总结: RandomizedSearchCV 降采数据下的结果: 过采数据下的结果: 未进行重采样数据下的结果: 总结: 未调参,默认参数 总汇总 传送门 案例背景及数据分析处理过程请看《kaggle员工离职预测案例(1)》 模型评估...
  • 公司从招聘到培训一名员工,每个环节都需花费不少的资源,而一个员工的离职多多少少会给公司带来损失,为了了解员工离职的原因并预测潜在的离职对象,IBM 公布了他们真实的员工信息并提出以下问题陈述: “预测员工...
  • R:员工离职预测实战

    千次阅读 2018-03-04 13:43:49
    通过分析数据,了解影响员工辞职的因素有哪些,以及最主要的原因,预测哪些优秀员工离职。变量说明:&lt;textarea readonly="readonly" name="code" class="python"&gt; ##...
  • 机器学习-员工离职预测训练赛

    千次阅读 2019-02-18 12:46:37
    【数据来源】DC竞赛的员工离职预测训练赛 一共两个csv表格,pfm_train.csv训练(1100行,31个字段),pfm_test.csv测试集(350行,30个字段) 【字段说明】 Age:员工年龄 Attrition:员工是否已经离职,1表示...
  • R语言——Kaggle十大经典案例—员工离职预测

    万次阅读 多人点赞 2018-06-09 15:17:25
    从图中可以看出,参与过项目个数为7的员工离职率百分之百,大致来看,参与项目个数越多,离职率越高(参与过2个项目个数的为特例)。   b. 探索5年内是否升职与是否离职的关系 # 绘制5年内是否升职与是否...
  • 员工离职预测 逻辑回归 import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder#中文编码为数字 import seaborn as sns#热力图 import matplotlib.pyplot as plt from sklearn....
  • 为了弄清楚公司员工离职原因,通过kaggle上某一家企业员工离职的真实数据来对离职率进行分析建模。 一、初识数据 1、数据来源 数据来源:[https://www.kaggle.com/jiangzuo/hr-comma-sep/version/1] 2、载入数据 ...
  • DataCastle员工离职预测数据竞赛个人总结 赛题链接 赛题任务: 给定影响员工离职的因素和员工是否离职的记录,建立模型预测有可能离职的员工。 数据字段: (1)Age:员工年龄 ; (2)Label:员工是否已经离职,1...
  • hidden, n_output) # n_hidden个输入(预测y的值所以 1个输出) 预测神经层 self.drop=nn.Dropout(0.32) self.drop1=nn.Dropout(0.515) # self.bl=nn.BatchNorm1d(n_hidden) def forward(self, x): # x为输入信息 x ...
  • 员工离职预测(logistic)(R语言)

    千次阅读 2019-02-25 14:53:00
    员工离职预测(logistic) 出于工作需要及个人兴趣,学习数据分析及R语言是差不多2年前,第一篇更新的文章为m久前做的员工离职预测,当时做这个项目的主要是为了学习logistic算法,数据来源为DC竞赛平台,本文章...
  • 导言墨西哥的员工流动率在世界上排名第八,平均每年的流失率约为17%,然而某些行业如:食品服务,则达到50%。根据Catalyst的一项研究,更换员工的成本平均约为员工年薪...
  • 从给定的影响员工离职的因素和员工是否离职的记录,建立一个逻辑回归模型预测有可能离职的员工 数据 数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资...
  • hr ("D:/R/天善智能/书豪十大案例/员工离职预测\\HR_comma_sep.csv") str(hr) # 查看数据的基本数据结构 描述性分析 ################### ============= 描述性分析 ================== #############...
  • hr ("D:/R/天善智能/书豪十大案例/员工离职预测\\HR_comma_sep.csv") str(hr)# 查看数据的基本数据结构 描述性分析 ################### ============= 描述性分析 ================== ############### ...
  • Python源码集锦-员工离职预测模型
  • R语言-决策树-员工离职预测训练赛

    千次阅读 2017-09-11 10:50:00
    题目:员工离职预测训练赛 网址:http://www.pkbigdata.com/common/cmpt/员工离职预测训练赛_竞赛信息.html 要求: 数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、...
  • 一、比赛说明 ...问题描述 数据包括员工的各种统计信息,...需要通过训练数据得出员工离职预测的结果。 评分标准 AUC 二、代码 import pandas as pd train = pd.read_csv('train.csv',index_col=0) test = pd.read_csv('

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,505
精华内容 1,402
关键字:

员工离职预测