kaggle员工离职预测案例(2)

传送门 🚪

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

背景

第一篇文章中说此案例是一个典型的二分类问题,这里我们将采用常见的一些模型如逻辑回归(LogisticRegression),决策树分类(DecisionTreeClassifier),随机森林分类(RandomForestClassifier)。

另本文属于学习笔记,在下面的建模中会对不同的数据集(原始数据、降采数据、过采数据)都进行建模学习预测,以此来对比降采过采的效果。

建模

逻辑回归(LogisticRegression)

#导入常用库
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold,cross_val_score,cross_val_predict
from sklearn.metrics import confusion_matrix, recall_score, classification_report

使用交叉验证的方法寻找最佳参数,将方法函数封装起来,后面不同的模型和数据集可以直接调用,而非常方便。

#导入常用库
def printing_Kfold_scores(x_train_XXX, y_train_XXX):
    fold = KFold(5, shuffle = False)
    
    #定义不同的惩罚力度,数值越大惩罚力度越小,可以查看官网
    c_param_range = [0.01,0.1,1,10,100]
    
    #展示结果用的表格
    result_table = pd.DataFrame(index = range(len(c_param_range),2),columns = ['C_parameter','Mean recall score'])
    result_table['C_parameter'] = c_param_range
    
    #k-fold表示k折的交叉验证,这里会得到两个索引集合:训练集 = indices[0],验证集 = indices[1]
    j = 0
    #循环遍历不同的参数
    for c_param in c_param_range:
        print('-----------------------------')
        print('正则化惩罚力度:', c_param)
        print('-----------------------------')
        print('')
        
        recall_accs = []
        
        #一步步分解来执行交叉验证
        for iteration,indices in enumerate(fold.split(x_train_XXX)):
            #指定算法模型,并且给定参数,也可以尝试一下惩罚参数选择'l2'
            lr = LogisticRegression(C = c_param,penalty = 'l1',solver='liblinear')
            
            #训练模型,注意索引不要给错了,训练的时候一定传入的是训练集,所以X和Y的索引都是0
            lr.fit(x_train_XXX.iloc[indices[0],:], y_train_XXX.iloc[indices[0],:].values.ravel())
            
            #建立好模型后,预测模型结果,这里用的就是验证集,索引为1
            y_pred_XXXsample = lr.predict(x_train_XXX.iloc[indices[1],:].values)
            
            #有了预测结果之后就可以来进行评估了,这里recall_score需要传入预测值和真实值
            recall_acc = recall_score(y_train_XXX.iloc[indices[1],:].values, y_pred_XXXsample)
            
            #一会还要算平均,这里就把每一步的结果保存起来
            recall_accs.append(recall_acc)
            print('Iteration {}: 召回率 = {}'.format(iteration,recall_acc))
            
        #当执行完所有交叉验证后,计算平均结果
        result_table.loc[j,'Mean recall score'] = np.mean(recall_accs)
        j += 1 
        print('')
        print('平均召回率',np.mean(recall_accs))
        print('')
        
    #找到最好的参数,哪一个recall高,自然就是最好的了
    best_c = result_table.loc[result_table['Mean recall score'].astype(float).idxmax()]['C_parameter']
    
    #打印最好的结果
    print('************************************************')
    print('效果最好的模型所选的参数 = ',best_c)
    print('************************************************')
    
    return best_c
#导入常用库
print('降采数据下:')
best_c_undersample = printing_Kfold_scores(X_train_undersample,y_train_undersample)
print('过采数据下:')
best_c_oversample = printing_Kfold_scores(X_train_oversample,y_train_oversample)
print('未进行重采样数据下:')
best_c = printing_Kfold_scores(X_train,y_train)
#导入常用库
降采数据下:
-----------------------------
正则化惩罚力度: 0.01
-----------------------------

Iteration 0: 召回率 = 0.0
Iteration 1: 召回率 = 0.0
Iteration 2: 召回率 = 0.0
Iteration 3: 召回率 = 0.0
Iteration 4: 召回率 = 0.0

平均召回率 0.0

-----------------------------
正则化惩罚力度: 0.1
-----------------------------

Iteration 0: 召回率 = 0.8333333333333334
Iteration 1: 召回率 = 0.4411764705882353
Iteration 2: 召回率 = 0.8
Iteration 3: 召回率 = 0.5151515151515151
Iteration 4: 召回率 = 0.48484848484848486

平均召回率 0.6149019607843137

-----------------------------
正则化惩罚力度: 1
-----------------------------

Iteration 0: 召回率 = 0.8666666666666667
Iteration 1: 召回率 = 0.6764705882352942
Iteration 2: 召回率 = 0.8
Iteration 3: 召回率 = 0.6363636363636364
Iteration 4: 召回率 = 0.696969696969697

平均召回率 0.7352941176470589

-----------------------------
正则化惩罚力度: 10
-----------------------------

Iteration 0: 召回率 = 0.8666666666666667
Iteration 1: 召回率 = 0.7647058823529411
Iteration 2: 召回率 = 0.8333333333333334
Iteration 3: 召回率 = 0.696969696969697
Iteration 4: 召回率 = 0.6666666666666666

平均召回率 0.765668449197861

-----------------------------
正则化惩罚力度: 100
--------
  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值