随机森林-参数设置及调优

本文详细解析了随机森林分类器的主要参数,包括n_estimators、criterion、max_features等,并介绍了如何使用GridSearchCV进行参数调优,以提升模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1、参数意义,参考网址:https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

n_estimators

森林中数的个数。 
这个属性是典型的模型表现与模型效率成反比的影响因子,即便如此,你还是应该尽可能提高这个数字,以让你的模型更准确更稳定。 
 

criterion

度量分裂的标准。可选值:“mse”,均方差(mean squared error);“mae”,平均绝对值误差(mean absolute error) 
支持的标准是基尼杂质的“gini(基尼)”和信息增益的“entropy(熵)”。注意:此参数是特定于树的。

max_features

寻找最佳分裂点时考虑的特征数目。可选值,int(具体的数目),float(数目的百分比),string(“auto”, “sqrt”,“log2”). 
这一属性是对单个树来设置的,通常来讲,这个值越大单棵树可以考虑的属性越多,则模型的表现就越好。但是这也不是肯定的,不过有一点是肯定的,增加这个值会导致算法运行速度变慢,所以需要我们考虑去达到一个平衡。 

max_depth :

integer或者None。树的最大深度,如果None,节点扩展直到所有叶子是纯的或者所有叶子节点包含的样例数小于min_samples_split 

min_samples_split : 分裂内部节点需要的最少样例数。int(具体数目),float(数目的百分比) 

 

min_samples_leaf :叶子节点上应有的最少样例数。int(具体数目),float(数目的百分比)。 
更少的节点数使得模型更容易遭受noise data的影响,我通常设置这个值大于50,但是你需要寻找最适合你的数值。 

min_weight_fraction_leaf : 


max_leaf_nodes :以”最优优先方式”(best-first fashion),最优节点定义为:纯度的相对减少.如果None则不限制叶子节点个数;[float] 
min_impurity_split : 树增长提前结束的阈值.对于当前节点,大于这个阈值将分裂,否则就看做叶子节点; [float] 
min_impurity_decrease :一个阈值,表示一个节点分裂的条件是:如果这次分裂纯度的减少大于等于这这个值. 
bootstrap :构建数是不是采用有放回样本的方式(bootstrap samples); [True/False] 
oob_score :交叉验证相关的属性。 
n_jobs :设定fit和predict阶段并列执行的任务个数,如果设置为-1表示并行执行的任务数等于计算级核数; [integer, optional (default=1)] 
random_state :如果是int数值表示它就是随机数产生器的种子.如果指定RandomState实例,它就是随机产生器的种子.如果是None,随机数产生器是np.random所用的RandomState实例; [int, RandomState instance or None, optional (default=None)] 
verbose :控制构建数过程的冗长度; [int, optional (default=0)] 
warm_start :当设置为True,重新使用之前的结构去拟合样例并且加入更多的估计器(estimators,在这里就是随机树)到组合器中; [True/False] 
class_weight: “banlanced”模式是根据y标签值自动调整权值与输入数据的类频率成反比,计算公式是:n_samples / (n_classes np.bincount(y)).“balanced_subsample”模式的与”balanced模式相同,只不过在每一次树增长过程中权值的计算是根据有放回样本的.
 

2、调优神器,遍历调优

sklearn中的神器:GridSearcherCV(),它使用交叉验证的方式,对某一分类器,你制定想要调参的名称和数值,作为一个字典传入进这个函数,然后它就会告诉你最佳的参数组合.(其实就是for for for都试试).


from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
#准备训练数据和y值
X_train, y_train = ...
#初步定义分类器
rfc = RandomForestClassifier(max_depth=2, random_state=0)
#需要选择的参数名称一起后选值
tuned_parameter = [{'min_samples_leaf':[1,2,3,4], 'n_estimators':[50,100,200]}]
#神器出场,cv设置交叉验证
clf = GridSearchCV(estimator=rfc,param_grid=tuned_parameters, cv=5, n_jobs=1)
#拟合训练集
clf.fit(X_train, y_train)
print('Best parameters:')
pritn(clf.best_params_)

 

### 随机森林参数选择与的方法和技巧 #### 1. 理解随机森林的关键超参数 为了有效地调整随机森林模型,理解其主要超参数至关重要。这些超参数控制着模型的行为并影响最终性能: - **n_estimators**: 这是指定要构建的决策树数量。更多的树木通常会带来更高的准确性,但也增加了计算成本[^1]。 - **max_depth**: 控制单棵树的最大深度。较深的树可能会过拟合训练数据;而浅层则可能导致欠拟合[^2]。 - **min_samples_split / min_samples_leaf**: 它们分别定义了一个节点分裂所需的最小样本数以及叶节点所必需含有的最少样本数目。适当设置这两个值可以帮助防止过度拟合或不足拟合问题的发生[^3]。 - **max_features**: 表示在寻找最佳分割时考虑的最大特征子集大小。较小的比例有助于减少方差误差,但可能增加偏差错误的风险。 #### 2. 使用交叉验证评估不同配置的效果 当尝试多种超参数组合时,采用k折交叉验证(k-fold cross-validation)技术可以在不牺牲过多测试样本的情况下获得更可靠的估计结果。这使得能够在保持独立于未来预测的同时化当前设定下的表现指标。 ```python from sklearn.model_selection import KFold, cross_val_score from sklearn.ensemble import RandomForestClassifier rf_model = RandomForestClassifier() kfolds = KFold(n_splits=5) scores = cross_val_score(rf_model, X_train, y_train, cv=kfolds) print(f'Cross Validation Scores: {scores.mean():.4f} (+/- {scores.std() * 2:.4f})') ``` #### 3. 应用网格搜索(Grid Search)进行全面探索 对于那些具有有限范围内的离散取值空间来说,`GridSearchCV`提供了一种系统化的手段去遍历所有可能性,并找到最的一组参数集合。尽管这种方法耗时较长,但它能确保不会错过任何潜在的最佳解决方案。 ```python from sklearn.model_selection import GridSearchCV param_grid = { 'n_estimators': [100, 200], 'max_depth': [None, 10, 20], 'min_samples_split': [2, 5], 'min_samples_leaf': [1, 2], 'max_features': ['auto', 'sqrt'] } grid_search = GridSearchCV(RandomForestClassifier(), param_grid, cv=5) grid_search.fit(X_train, y_train) best_params = grid_search.best_params_ print('Best Parameters:', best_params) ``` #### 4. 利用随机搜索(Randomized Search)加速过程 如果面对的是连续型变量或者是维度较高的情况,则可以考虑使用`RandomizedSearchCV`来进行更加高效地采样。相比于传统的穷举法,这种方式不仅节省时间而且往往也能达到相近甚至更好的效果。 ```python from scipy.stats import randint as sp_randint from sklearn.model_selection import RandomizedSearchCV random_param_dist = { "n_estimators": sp_randint(100, 1000), "max_depth": [None] + list(sp_randint(1, 20)), "min_samples_split": sp_randint(2, 11), "min_samples_leaf": sp_randint(1, 11), "bootstrap": [True, False] } rand_search = RandomizedSearchCV( estimator=RandomForestClassifier(), param_distributions=random_param_dist, n_iter=100, cv=5, random_state=42 ) rand_search.fit(X_train, y_train) best_random_params = rand_search.best_params_ print('Best Random Params:', best_random_params) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值