当前位置: 首页 > 后端技术 > Python

100天搞定机器学习-Day56随机森林工作原理及参数调整(信用卡欺诈预测)

时间:2023-03-25 22:59:53 Python

本文为100天搞定机器学习的补充|Day33-34randomforest上一篇文章随机森林的概念、工作原理和使用方法简单介绍,并提供分类和回归的例子。本期我们将重点关注:1.集成学习、Bagging、随机森林的概念及相互关系2.随机森林参数讲解及设置建议3.随机森林模型调参实战4.优缺点总结随机森林模型集成学习、Bagging和随机森林集成学习集成学习不是一个单独的机器学习算法。它结合多个基学习器(弱学习器)最终得到一个强学习器。这里的弱学习器应该具有一定的准确性和多样性(学习器之间的差异)。比较常用的基础学习器包括决策树和神经网络。集成学习的核心是如何生成和组合好的和不同的基学习器。这里有两种方式。一种是装袋。基学习器和可以同时生成的并行方法之间没有强依赖关系。一种是Boosting,它在基学习器之间有很强的依赖性,必须串行生成。集成学习的另一个关键问题是策略的组合,主要包括平均法、投票法和学习法,这里不再展开。BaggingBagging是BootstrapAGGGregaING的缩写。Bootstrap是随机抽样。例如,给定一个包含$m$个样本的数据集$D$,每次从中随机抽取一个样本,放入一个新的数据集,然后再放回初始的数据集$D$,可能会继续放回去后收起来。重复这个动作$m$次,我们会得到一个新的数据集$D'$。这样我们就可以对包含m个训练样本的TGE样本集进行采样,然后根据每个样本集训练基学习器,再将基学习器进行组合。这就是Bagging的基本过程。RandomForestRandomForest是一种非常有代表性的Bagging集成算法,是在Bagging的基础上进行了增强。它的所有基础学习器都是CART决策树。传统的决策树在选择分区属性时,会从当前节点的属性集中(假设有d个属性)选择最优属性。但是对于随机森林的决策树来说,现在每个节点的属性集随机选择k个属性的子集,然后在子集中选择一个最优的特征来划分决策树的左右子树。一般推荐$k=log_2d$组成的森林。分类决策树称为随机森林分类器,与回归决策树集成的森林称为随机森林回归器。RF算法:输入为样本集$D=\{(x_,y_1),(x_2,y_2),...(x_m,y_m)\}$,弱分类器迭代次数为T。输出就是最终的强分类器$f(x)$1)Fort=1,2...,T:a)对训练集随机抽取第t次,共收集m次,得到包含m的样本samplesSetDtb)使用采样集$D_t$训练第t个决策树模型$G_t(x)$,在训练决策树模型的节点时,从该节点上的所有样本特征中选择一部分样本特征,在这些随机选择的决策树的一些样本特征中选择一个最优的特征来划分决策树的左右子树。2)如果是通过分类算法预测的,则T个弱学习者投票最多的类别或类别之一就是最终类别。如果是回归算法,T个弱学习器得到的回归结果的算术平均就是最终的模型输出。RandomForest参数解释及设置建议在scikit-learn中,RandomForest的分类类是RandomForestClassifier,回归类是RandomForestRegressor。需要调整的参数包括两部分。第一部分是Bagging框架的参数,第二部分是CART决策树。范围。下面我们就来看看scikit-learn中随机森林的主要参数。随机森林模型调参是kaggle上的一个话题。它通过信用卡交易记录数据预测欺诈行为。信用卡欺诈检测文件记录了2013年9月欧洲信用卡持卡人进行的交易。284807条交易记录共包含492条欺诈记录。数据集下载地址:请在公众号后台回复[56]需要注意的是,本文侧重于RF模型调优,因此不涉及数据预处理、特征工程和模型融合,我将在本专栏讨论在未来的下一章中介绍。所以最后的结果可能不尽如人意。这里我们只关注调参和加深对重要参数的理解给模型带来的性能提升。1.导入使用的包importnumpyasnpiimportpandasasppdffromsklearn.model_selectionimportGridSearchCV,train_test_splitfromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportroc_auc_score2,importdatadf=pd.read_csvard("D:\CKS\Credycreditcard.csv")data=df.iloc[:,1:31]284807条交易记录中只有492条欺诈记录,样本严重失衡。这里需要使用下采样策略(减少多数类的数量,使它们与少数类的数量相等)X=data.loc[:,data.columns!='Class']y=data.loc[:,data.columns=='Class']number_records_fraud=len(data[data.Class==1])#class=1示例函数fraud_indices=np.array(data[data.Class==1].index)#样本等于1索引值normal_indices=data[data.Class==0].index#样本等于0索引值random_normal_indices=np.random.choice(normal_indices,number_records_fraud,replace=False)random_normal_indices=np.array(random_normal_indices)under_sample_indices=np.concatenate([fraud_indices,random_normal_indices])#添加2个索引under_sample_data=data.iloc[under_sample_indices,:]#UndersampledatasetX_undersample=uunder_sample_data.loc[:,under_sample_data.columns!='Class']y_undersample=under_sample_data.loc[:,under_sample_data.columns=='Class']X_train,X_test,y_train,y_test=train_test_split(X_undersample,y_undersample,test_size=0.random_state=0)首先使用默认参数训练RFrf0=RandomForestClassifier(oob_score=True,random_state=666)rf0.fit(X_train,y_train)print(rf0.oob_score_)y_predprob=rf0.predict_proba(X_test)[:,1]print("AUCScore(Train):%f"%roc_auc_score(y_test,y_predprob))0.9244186046511628AUCScore(Train):0.967082除了oob_score,将默认的False改为True,我们重点优化n_estimators、max_depth、min_samples_leaf这三个参数为了简单起见,为了模型评价指标,我们选择AUC值。对于模型调整,我们使用网格搜索来调整参数(网格搜索)。通过构建参数候选集,网格搜索将穷尽各种参数组合,并根据设置评估的评分机制找到最佳设置集。首先优化n_estimatorsparam_test1={'n_estimators':range(10,101,10)}gsearch1=GridSearchCV(estimator=RandomForestClassifier(oob_score=True,random_state=666,n_jobs=2),param_grid=param_test1,scoring='roc_auc',cv=5)gsearch1.fit(X_train,y_train)gsearch1.cv_results_,gsearch1.best_params_,gsearch1.best_score_{'n_estimators':50},0.9799524239675649)基于优化后的n_estimators,优化max_featuresparam_test2={'max_depth':range(2,12,2)}gsearch2=GridSearchCV(estimator=RandomForestClassifier(n_estimators=50,oob_score=True,random_state=666,n_jobs=2),param_grid=param_test2,scoring='roc_auc',cv=5)gsearch2.fit(X_train,y_train)gsearch2.cv_results_,gsearch2.best_params_,gsearch2.best_score_{'max_depth':6},0.9809897227343921)在以上两个参数优化结果的基础上优化max_depthparam_test2={'min_samples_split':range(2,8,1)}gsearch2=GridSearchCV(estimator=RandomForestClassifier(n_estimators=50,max_depth=6,oob_score=真,random_state=666,n_jobs=2),param_grid=param_test2,scoring='roc_auc',cv=5)gsearch2.fit(X_train,y_train)gsearch2.cv_results_,gsearch2.best_params_,gsearch2.best_score_{'min_samples_split':5},0.9819618127837587)最后我们再试一次rf1=RandomForestClassifier(n_estimators=50,max_depth=6,min_samples_split=5,oob_score=True,random_state=666,n_jobs=2)rf1.fit(X_train,y_train)print(rf1.oob_score)y_predprob1=rf1.predict_proba(X_test)[:,1]print("AUCScore(Train):%f"%roc_auc_score(y_test,y_predprob1))0.9331395348837209AUCScore(Train):0.977811最终结果比调参前要好Summary随机森林RF的优点和缺点1.不容易过拟合,因为在训练样本的时候并不是所有的样本都被选中2.可以处理离散值的量,比如ID3算法构造树,也可以处理attributes为连续值的数量构造树,例如C4.5算法。3.对高维数据集的处理能力令人兴奋。它可以处理数千个输入变量并确定最重要的变量,因此被认为是一种很好的降维方法。此外,该模型能够输出变量的重要程度,这是一个非常方便的功能。4.当分类不平衡时,随机森林可以提供一种有效的方法来平衡数据集的误差产生连续的输出。在做回归时,随机森林无法做出超出训练集数据范围的预测,这会导致在对一些也有一定噪声的数据建模时出现过拟合。2.对于许多统计建模者来说,随机森林就像一个黑匣子——你几乎无法控制模型内部发生的事情,你只能用不同的参数和随机种子进行试验。参考:https://www.jianshu.com/p/708...https://zhuanlan.zhihu.com/p/...https://www.cnblogs.com/pinar...《百面机器学习》有一道关于随机森林的面试题。大家可以想一想:随机森林中的基分类器是否可以换成带有线性分类器或K近邻的决策树?答:随机森林属于Bagging类的集成学习。Bagging的主要优点是集成分类器的方差比基分类器的方差小。Bagging使用的分类器最好本身对样本分布敏感(即不稳定的分类器),这样Bagging才有价值。线性分类器或K近邻比较稳定,方差小,所以用它们作为基分类器使用Bagging并不能达到更好的性能,甚至可能因为Bagging采样在训练中更难收敛,从而增加Bias对于大型集成分类器。本文由博客多发平台OpenWrite发布!