我使用随机森林与scikit学习。RF过拟合数据,预测结果很差。
过拟合不依赖于RF的参数:NBtree, Depth_Tree
过拟合发生在许多不同的参数上(通过grid_search测试)。
补救:我调整了初始数据/降低了一些采样结果以影响拟合(手动预处理噪声样本)。
Loop on random generation of RF fits,
Get RF prediction on the data for prediction
Select the model which best fits the "predicted data" (not the calibration data).
这个蒙特卡罗非常消费,只是想知道有没有别的办法随机森林交叉验证?(即不是超参数优化)。
编辑scikit-learn中任何分类器的交叉验证都是微不足道的:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
# Initialize with whatever parameters you want to
clf = RandomForestClassifier()
# 10-Fold Cross validation
print np.mean(cross_val_score(clf, X_train, y_train, cv=10))
如果你想运行网格搜索,你可以通过GridSearchCV类轻松地做到这一点。为此,您必须提供一个param_grid
,根据文档,它是
以参数名称(字符串)作为键和列表的字典要作为值尝试的参数设置,或此类字典的列表,在这种情况下,列表中每个字典所跨越的网格是探索。这允许对任何参数序列进行搜索设置。
也许,你可以这样定义你的param_grid
:
param_grid = {
'n_estimators': [5, 10, 15, 20],
'max_depth': [2, 5, 7, 9]
}
那么您可以使用GridSearchCV
类如下
from sklearn.model_selection import GridSearchCV
grid_clf = GridSearchCV(clf, param_grid, cv=10)
grid_clf.fit(X_train, y_train)
使用grid_clf. best_estimator_
可以得到最佳模型,使用grid_clf. best_params_
可以得到最佳参数。同样,您可以使用grid_clf.cv_results_
希望这对你有帮助!