随机森林的交叉验证参数调整

数据挖掘 scikit-学习 文本挖掘 随机森林 交叉验证 超参数
2022-02-21 23:12:51

我在 scikit-learn 的 20 个新闻组数据集上训练了一个二元随机森林分类器。我想调整参数并通过网格搜索和训练数据的 3 折交叉验证来尝试。

这种方法有什么问题吗?

对于max_depth参数,我得到一个非常高的 500 值,这似乎太高了。有什么建议吗?

代码是:

from __future__ import print_function  
import sklearn  
import sklearn.ensemble  
import sklearn.metrics  
from sklearn.datasets import fetch_20newsgroups  
from sklearn.grid_search import GridSearchCV

categories = ['sci.med', 'soc.religion.christian']  
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories, 
remove=('headers', 'footers', 'quotes'))  
newsgroups_test = fetch_20newsgroups(subset='test', categories=categories, 
remove=('headers', 'footers', 'quotes'))  
class_names = ['medicine', 'christian']  

vectorizer = 
sklearn.feature_extraction.text.TfidfVectorizer(lowercase=False)  
train_vectors = vectorizer.fit_transform(newsgroups_train.data)  
test_vectors = vectorizer.transform(newsgroups_test.data)  

rf = sklearn.ensemble.RandomForestClassifier(max_features='sqrt')  

param_grid = {  
           "n_estimators" : [10, 100, 1000],  
           "max_depth" : [5, 100, 500],  
           "min_samples_leaf" : [1, 20, 40]}  

CV_rf = GridSearchCV(estimator=rf, param_grid=param_grid)  
CV_rf.fit(train_vectors, newsgroups_train.target)  
print(CV_rf.best_params_)  
4个回答

您是否正在查看验证集的准确性,而不是您的训练集?(你应该)。您是否确保训练和验证准确性之间的差距很小?(你应该是!)是否有足够的数据来保证 3 倍交叉验证,或者你应该做 10 倍(并使用更多数据进行训练)?

一般来说,随机搜索(从参数空间中随机抽样)会比网格搜索更快地得到一个好的结果。它还有一个额外的好处,就是您可以指定要构建的模型数量,因为每个模型的参数都是独立采样的,并且不会像网格搜索那样被限制为覆盖整个空间。

可能是您的粗刻度太大(尽管开始是个好主意)。例如,如果 150 深度是最好的解决方案,但 500 比 100 好,那么它会给你 500 作为参数结果。您是否尝试过缩短此参数值之间的间隔?如果您尝试不同的方法,它会带来什么?

max_depth 500 不可​​能是正确的,如果我没记错的话,它意味着大约 2^500 个叶子,这是不可行的。

您的代码中可能存在一些错误。如果可能,请发布您的代码。

另外,你确定你没有混淆 max_depth 和树的数量吗?

500可能是对的。它并不意味着2^500 个叶子,一些叶子可以更早地停止。你有多少观察?

在随机森林中,您可以使用袋外预测进行调整。这将使您的调整算法更快。

Max_depth = 500 不必太多。R中随机森林的默认值是树的最大深度,所以没关系。你应该通过交叉验证来验证你的最终参数设置(然后你有一个嵌套的交叉验证),然后你可以看看在调整过程中是否有问题。