及时行乐|原理+代码|深入浅出Python随机森林预测实战( 三 )


对错误和离群点更加鲁棒性
决策树容易过度拟合的问题会随着森林的规模而削弱
大数据情况下速度快(分布式) , 性能好
Python实战数据探索本次实战目标为演示随机森林的用法和调优方法 。 因为集成学习与神经网络一样 , 都属于解释性较差的黑盒模型 , 所以我们无需过分探究数据集中每个变量的具体含义 , 只需关注最后一个变量broadband即可 , 争取通过如年龄 , 使用时长 , 支付情况以及流量和通话情况等变量对宽带客户是否会续费做出一个较准确的预测 。
importpandasaspdimportnumpyasnpdf=pd.read_csv('broadband.csv')#宽带客户数据df.head;df.info
df.rename(str.lower,axis='columns',inplace=True)现在查看因变量broadband分布情况 , 看是否存在不平衡
fromcollectionsimportCounterprint('Broadband:',Counter(df['broadband']))##Broadband:Counter({0:908,1:206})比较不平衡 。 ##根据原理部分 , 可知随机森林是处理数据不平衡问题的利器接着拆分测试集与训练集 , 客户id没有用 , 故丢弃cust_id,
y=df['broadband']X=df.iloc[:,1:-1]fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=12345)决策树建模我们先进行完整的决策树建模来和随机森林进行对比
importsklearn.treeastree#直接使用交叉网格搜索来优化决策树模型 , 边训练边优化fromsklearn.model_selectionimportGridSearchCV#网格搜索的参数:正常决策树建模中的参数-评估指标 , 树的深度 , ##最小拆分的叶子样本数与树的深度param_grid={'criterion':['entropy','gini'],'max_depth':[2,3,4,5,6,7,8],'min_samples_split':[4,8,12,16,20,24,28]}#通常来说 , 十几层的树已经是比较深了clf=tree.DecisionTreeClassifier#定义一棵树clfcv=GridSearchCV(estimator=clf,param_grid=param_grid,scoring='roc_auc',cv=4)#传入模型 , 网格搜索的参数 , 评估指标 , cv交叉验证的次数##这里也只是定义 , 还没有开始训练模型clfcv.fit(X=X_train,y=y_train)#使用模型来对测试集进行预测test_est=clfcv.predict(X_test)#模型评估importsklearn.metricsasmetricsprint("决策树准确度:")print(metrics.classification_report(y_test,test_est))#该矩阵表格其实作用不大print("决策树AUC:")fpr_test,tpr_test,th_test=metrics.roc_curve(y_test,test_est)print('AUC=%.4f'%metrics.auc(fpr_test,tpr_test))AUC大于0.5是最基本的要求 , 可见模型精度还是比较糟糕的 , 决策树的调优技巧就不再过多展开 , 我们将在随机森林调优部分展示
param_grid={'criterion':['entropy','gini'],'max_depth':[5,6,7,8],#深度:这里是森林中每棵决策树的深度'n_estimators':[11,13,15],#决策树个数-随机森林特有参数'max_features':[0.3,0.4,0.5],#每棵决策树使用的变量占比-随机森林特有参数(结合原理)'min_samples_split':[4,8,12,16]#叶子的最小拆分样本量}importsklearn.ensembleasensemble#ensemblelearning:集成学习rfc=ensemble.RandomForestClassifierrfc_cv=GridSearchCV(estimator=rfc,param_grid=param_grid,scoring='roc_auc',cv=4)rfc_cv.fit(X_train,y_train)#使用随机森林对测试集进行预测test_est=rfc_cv.predict(X_test)print('随机森林精确度...')print(metrics.classification_report(test_est,y_test))print('随机森林AUC...')fpr_test,tpr_test,th_test=metrics.roc_curve(test_est,y_test)#构造roc曲线print('AUC=%.4f'%metrics.auc(fpr_test,tpr_test))可以看到 , 模型的精度大大提升


推荐阅读