机器学习-随机森林的⽹格调参实例-附python代码
1. 随机森林
RandomForestClassifier官⽅⽹址:
GitHub⽂档地址:
1.1 原理解释
从给定的训练集通过多次随机的可重复的采样得到多个 bootstrap 数据集。接着,对每个 bootstrap 数据集构造⼀棵决策树,构造是通过迭代的将数据点分到左右两个⼦集中实现的,这个分割过程是⼀个搜索分割函数的参数空间以寻求最⼤信息增量意义下最佳参数的过程。然后,在每个叶节点处通过统计训练集中达到此叶节点的分类标签的直⽅图经验的估计此叶节点上的类分布。这样的迭代训练过程⼀直执⾏到⽤户设定的最⼤树深度(随机森林提出者Breiman采⽤的是ntree=500)或者直到不能通过继续分割获取更⼤的信息增益为⽌。
简⽽⾔之:
随机森林在bagging基础上做了修改,从样本集中⽤bootstrap采样选出n个样本,从所有属性中随机选择
k个属性,选择最佳分割属性作为节点建⽴CART决策树,重复以上两步m次,即建⽴了m棵CART决策树,这m个CART形成了随机森林,通过投票表决结果,决定数据属于哪⼀类。
*semble.RandomForestClassifier(n_estimators=100, , criterion=‘gini’, max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=‘auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None,
random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)[source]
1.2 Parameters
(1)n_estimators:int, default=100
森林中树的个数。这个属性是典型的模型表现与模型效率成反⽐的影响因⼦,即便如此,你还是应该尽可能提⾼这个数字,以让你的模型更准确更稳定。
(2)criterion:{“gini”, “entropy”}, default=”gini”
度量分裂的标准。可选值:“mse”,均⽅差(mean squared error);“mae”,平均绝对值误差(mean absolute error)
⽀持的标准是基尼杂质的“gini(基尼)”和信息增益的“entropy(熵)”。注意:此参数是特定于树的。
(3)max_depth:int, default=None
integer或者None。树的最⼤深度,如果None,节点扩展直到所有叶⼦是纯的或者所有叶⼦节点包含的样例数⼩于min_samples_split (4)min_samples_split:int or float, default=2
分裂内部节点需要的最少样例数。int(具体数⽬),float(数⽬的百分⽐)
(5)min_samples_leaf:int or float, default=1
叶⼦节点上应有的最少样例数。int(具体数⽬),float(数⽬的百分⽐)。
更少的节点数使得模型更容易遭受noise data的影响,我通常设置这个值⼤于50,但是你需要寻最适合你的数值。
(6)min_weight_fraction_leaf:float, default=0.0
The minimum weighted fraction of the sum total of weights (of all the input samples) required to be at a leaf node. Samples have equal weight when sample_weight is not provided.
(7)max_features:{“auto”, “sqrt”, “log2”}, int or float, default=”auto”
寻最佳分裂点时考虑的特征数⽬。可选值,int(具体的数⽬),float(数⽬的百分⽐),string(“auto”, “sqrt”,“log2”).这⼀属性是对单个树来设置的,通常来讲,这个值越⼤单棵树可以考虑的属性越多,则模型的表现就越好。但是这也不是肯定的,不过有⼀点是肯定的,增加这个值会导致算法运⾏速度变慢,所以需要我们考虑去达到⼀个平衡。
(8)max_leaf_nodes:int, default=None
以”最优优先⽅式”(best-first fashion),最优节点定义为:纯度的相对减少.如果None则不限制叶⼦节点个数
(9)min_impurity_decrease:float, default=0.0
⼀个阈值,表⽰⼀个节点分裂的条件是:如果这次分裂纯度的减少⼤于等于这这个值.
(10)min_impurity_split:float, default=None
树增长提前结束的阈值.对于当前节点,⼤于这个阈值将分裂,否则就看做叶⼦节点
(11)bootstrap:bool, default=True
构建数是不是采⽤有放回样本的⽅式(bootstrap samples)
(12)oob_score:bool, default=False
oob_score :交叉验证相关的属性。
(13)n_jobs:int, default=None
设定fit和predict阶段并列执⾏的任务个数,如果设置为-1表⽰并⾏执⾏的任务数等于计算级核数; [integer, optional (default=1)]
(14)random_state:int or RandomState, default=None
如果是int数值表⽰它就是随机数产⽣器的种⼦.如果指定RandomState实例,它就是随机产⽣器的种⼦.如果是None,随机数产⽣器是
np.random所⽤的RandomState实例; [int, RandomState instance or None, optional (default=None)]
(15)verbose:int, default=0
控制构建数过程的冗长度; [int, optional (default=0)]
(16)warm_start:bool, default=False
当设置为True,重新使⽤之前的结构去拟合样例并且加⼊更多的估计器(estimators,在这⾥就是随机树)到组合器中;
(17)class_weight:{“balanced”, “balanced_subsample”}, dict or list of dicts, default=None
“banlanced”模式是根据y标签值⾃动调整权值与输⼊数据的类频率成反⽐,计算公式是:n_samples / (n_classes
np.bincount(y)).“balanced_subsample”模式的与”balanced模式相同,只不过在每⼀次树增长过程中权值的计算是根据有放回样本的.
(18)ccp_alphanon-negative:float, default=0.0
⽤于最⼩化成本复杂性修剪的复杂性参数。 将选择成本复杂度最⼤且⼩于ccp_alpha的⼦树。 默认情况下,不执⾏修剪。 有关详细信息,请参见最⼩化成本复杂性修剪。
(19)max_samples:int or float, default=None
如果bootstrap为True,则从X抽取以训练每个基本估计量的样本数。
1.3 Attributes
(1)base_estimator_:DecisionTreeClassifier
⼦分类器⽤于创建拟合⼦分类器的集合。
(2)estimators_:list of DecisionTreeClassifier
拟合⼦分类器的集合
(3)classes_:ndarray of shape (n_classes,) or a list of such arrays
类标签(单输出问题)或类标签数组的列表(多输出问题)
(4)n_classes_:int or list
类数(单个输出问题),或包含每个输出的类数的列表(多输出问题)
(5)n_features_:int
执⾏拟合时的特征数量
(6)n_outputs_:int
执⾏拟合时的输出数量
(7)feature_importances_:ndarray of shape (n_features,)
基于impurity的特征的重要性
(8)oob_score_:float
使⽤袋外估计获得的训练数据集的分数。 仅当oob_score为True时,此属性才存在
(9)oob_decision_function_:ndarray of shape (n_samples, n_classes)
使⽤训练集上的实际估计值计算的决策函数。 如果n_estimators⼩,则有可能在引导过程中从未遗漏任何数据点。 在这种情况
下,oob_decision_function_可能包含NaN。 仅当oob_score为True时,此属性才存在。
2. ⽹格搜索
GridSearchCV官⽅⽹址:
2.1 原理解释
GridSearchCV,它存在的意义就是⾃动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个⽅法适合于⼩数据集,⼀旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量⽐较⼤的时候可以使⽤⼀个快速调优的⽅法——坐标下降。它其实是⼀种贪⼼算法:拿当前对模型影响最⼤的参数调优,直到最优化;再拿下⼀个影响最⼤的参数调优,如此下去,直到所有的参数调整完毕。这个⽅法的缺点就是可能会调到局部最优⽽不是全局最优,但是省时间省⼒,巨⼤的优势⾯前,还是试⼀试吧,后续可以再拿bagging再优化。
通常算法不够好,需要调试参数时必不可少。⽐如SVM的惩罚因⼦C,核函数kernel,gamma参数等,对于不同的数据使⽤不同的参数,结果效果可能差1-5个点,sklearn为我们提供专门调试参数的函数grid_search。
del_selection.GridSearchCV(estimator, param_grid, , scoring=None, n_jobs=None, iid=‘deprecated’,
refit=True, cv=None, verbose=0, pre_dispatch='2n_jobs’, error_score=nan, return_train_score=False)[source]
2.2 Parameters
(1)estimator:estimator object.
选择使⽤的分类器,并且传⼊除需要确定最佳的参数之外的其他参数。每⼀个分类器都需要⼀个scoring参数,或者score⽅法:estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features=‘sqrt’,ran dom_state=10),
三角函数公式大全初中生
(2)param_grid:dict or list of dictionaries
需要最优化的参数的取值,值为字典或者列表,例如:param_grid =param_test1,param_test1 =
{‘n_estimators’:range(10,71,10)}。
(3)scoring:str, callable, list/tuple or dict, default=None
模型评价标准,默认None,这时需要使⽤score函数;或者如scoring=‘roc_auc’,根据所选模型不同,评价准则不同。字符串(函数名),或是可调⽤对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使⽤estimator的误差估计函数。具体取值可访问
(4)n_jobs:int, default=None
n_jobs: 并⾏数,int:个数,-1:跟CPU核数⼀致, 1:默认值
(5)pre_dispatch:int, or str, default=n_jobs
指定总共分发的并⾏任务数。当n_jobs⼤于1时,数据将在每个运⾏点进⾏复制,这可能导致OOM,⽽设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次
(6)iid:bool, default=False
iid:默认True,为True时,默认为各个样本fold概率分布⼀致,误差估计为所有样本之和,⽽⾮各个fold的平均。
(7)cvint, cross-validation generator or an iterable, default=None
交叉验证参数,默认None,使⽤三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的⽣成器。
(8)refit:bool, str, or callable, default=True
默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可⽤的训练集与开发集进⾏,作为最终⽤于性能评估的最佳模型参数。即在搜索参数结束后,⽤最佳参数结果再次fit⼀遍全部数据集。
(9)verbose:integer
verbose:⽇志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个⼦模型都输出。
(10)error_score:‘raise’ or numeric, default=np.nan
如果估算器拟合出现错误,则分配给分数的值。 如果设置为“ raise”,则会引发错误。 如果给出数值,则引发FitFailedWarning。 此参数不会影响重新安装步骤,这将始终引发错误。
(11)return_train_score:bool, default=False
如果“False”,cv_results_属性将不包括训练分数
2.3 Attributes
(1)cv_results_ : dict of numpy (masked) ndarrays
具有键作为列标题和值作为列的dict,可以导⼊到DataFrame中。注意,“params”键⽤于存储所有参数候选项的参数设置列表。
(2)best_estimator_ : estimatordsum
通过搜索选择的估计器,即在左侧数据上给出最⾼分数(或指定的最⼩损失)的估计器。 如果refit = False,则不可⽤。
(3)best_score_ : float
best_estimator的分数
新浪短网址可以提供哪些服务(4)best_params_ : dict
在保存数据上给出最佳结果的参数设置
(5)best_index_ : int 对应于最佳候选参数设置的索引(cv_results_数组)。
python基础代码100例与最佳候选参数设置相对应的(cv_results_数组的)索引。
search.cv_results _ [‘params’] [search.best_index_]上的字典给出了最佳模型的参数设置,该模型给出了最⾼的平均分数(search.best_score_)。
对于多指标评估,仅当指定重新安装时才存在。
(6)scorer_ : function or a dict
在保留的数据上使⽤记分器功能,以为模型选择最佳参数。
对于多指标评估,此属性包含将得分者键映射到可调⽤的得分者的有效得分dict。
(7)n_splits_ : int
交叉验证拆分的数量(折叠/迭代)。
(8)refit_time_:float
⽤于在整个数据集中重新拟合最佳模型的秒数。仅当改装不为False时才存在。0.20版中的新功能。
3. 实例
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
del_selection import train_test_split,cross_val_score
semble import RandomForestClassifier
del_selection import GridSearchCV
# 加载数据并划分数据集
transferodata = pd.read_excel('E:/program/creditdata.xlsx','dataset')
x = data.drop(['uid','flag'],axis=1)
y = data['flag']
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.3,random_state=423)
# 0.查看初始效果
rf0 = RandomForestClassifier(oob_score=True, random_state=10)
rf0.fit(train_x,train_y)
y_predprob = rf0.predict_proba(test_x)[:,1]
print('oob_score : %f ,auc : %f' % (b_score_,roc_auc_score(test_y, y_predprob)))
没有调参前的效果
3.1 ⾸先,调整迭代次数,并打印最优的参数
# 1.迭代次数
param_test1 ={'n_estimators':range(10,101,10)}
gsearch1 = GridSearchCV(estimator = RandomForestClassifier(min_samples_split=20,
min_samples_leaf=10,max_depth=5,max_features='sqrt' ,random_state=10),                      param_grid = param_test1, scoring='roc_auc',cv=5)
gsearch1.fit(train_x,train_y)
means = gsearch1.cv_results_['mean_test_score']
std = gsearch1.cv_results_['std_test_score']
params = gsearch1.cv_results_['params']小时代1免费完整版在线观看
for mean,std,param in zip(means,std,params):
print("mean : %f std : %f %r" % (mean,std,param))
print('best_params :',gsearch1.best_params_)
结果如下:
3.2 确定最优的迭代次数是40后,再调整最⼤深度和内部节点再划分所需最⼩样本数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。