使用 sklearn 和随机森林显示过度拟合

Posted

技术标签:

【中文标题】使用 sklearn 和随机森林显示过度拟合【英文标题】:show overfitting with sklearn & random forest 【发布时间】:2021-02-08 00:04:07 【问题描述】:

我按照本教程创建了一个简单的图像分类脚本:

https://blog.hyperiondev.com/index.php/2019/02/18/machine-learning/

train_data = scipy.io.loadmat('extra_32x32.mat')
# extract the images and labels from the dictionary object
X = train_data['X']
y = train_data['y']

X = X.reshape(X.shape[0]*X.shape[1]*X.shape[2],X.shape[3]).T
y = y.reshape(y.shape[0],)
X, y = shuffle(X, y, random_state=42)
....
clf = RandomForestClassifier()
print(clf)
start_time = time.time()
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
               max_depth=None, max_features='auto', max_leaf_nodes=None,
               min_impurity_split=1e-07, min_samples_leaf=1,
               min_samples_split=2, min_weight_fraction_leaf=0.0,
               n_estimators=10, n_jobs=1, oob_score=False, random_state=None,
               verbose=0, warm_start=False)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
clf.fit(X_train, y_train)
preds = clf.predict(X_test)

print("Accuracy:", accuracy_score(y_test,preds))

它给了我大约 0.7 的准确度。

是否有某种方式可以可视化或显示模型在何处/何时/是否过度拟合?我相信这可以通过训练模型来证明,直到我们看到训练的准确性在增加而验证数据在减少。但是如何在代码中这样做呢?

【问题讨论】:

【参考方案1】:

有多种方法可以测试过拟合和欠拟合。如果您想专门查看训练和测试分数并进行比较,您可以使用 sklearns cross_validate[https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_validate.html#sklearn.model_selection 进行此操作。交叉验证]。如果您阅读文档,它将返回一个字典,其中包含训练分数(如果提供为 train_score=True)和您提供的指标中的测试分数。

示例代码

模型 = RandomForestClassifier(n_estimators=1000,random_state=1,criteria='entropy',bootstrap=True,oob_score=True,verbose=1) cv_dict = cross_validate(model, X, y, return_train_score=True)

您还可以简单地创建一个包含训练测试拆分的保留测试集,并使用测试数据集比较您的训练和测试分数。

【讨论】:

这里,X & y 是原始的 X & y 值,对吧?不是训练/测试的? 虽然这会给我们带来训练错误,但我的问题是我们如何“证明”这是过度拟合?正如 qs 中提到的,当训练开始过度拟合时,有什么方法可以“停止”训练?【参考方案2】:

另一种选择是使用像 Optuna 这样的库,它会为您测试各种超参数,您可以使用上述方法。

【讨论】:

以上是关于使用 sklearn 和随机森林显示过度拟合的主要内容,如果未能解决你的问题,请参考以下文章

随机森林为啥不会过度拟合

梯度提升与随机森林

如何使用随机森林对不平衡类进行分类以避免过度拟合

如何测试过度拟合的随机森林回归模型?

sklearn中的随机森林

SKlearn 随机森林输入错误