0

我使用随机森林创建了一个分类模型。为了验证模型,我使用了 10 次拆分的 K-Fold 方法,并通过 f1-score 测量模型性能。当我执行此操作时,前几折的 f1 分数非常低,其余折的 f1 分数非常高。

我期望每次分组的得分范围相同。

代码:

from sklearn.ensemble.forest import RandomForestClassifier
from sklearn.model_selection._split import KFold
kf = KFold(n_splits=20,random_state=41) 

f1list = []

for train_index, test_index in kf.split(XX):
    print("Train:", train_index, "Validation:",test_index)
    X_train, X_test = XX[train_index], XX[test_index] 
    Y_train, Y_test = YY[train_index], YY[test_index]
    LR1 = RandomForestClassifier(n_estimators=10,criterion='entropy',random_state=1,max_depth=25,warm_start=True,bootstrap=True, oob_score=True,n_jobs=-1)

    model1 = LR1.fit(X_train,Y_train)
    pred1 = model1.predict(X_test)

    from sklearn.metrics import f1_score

    f1list.append(f1_score(pred1,Y_test))

并且 10 次拆分的 f1-score 列表是

[0.3659305993690852, 0.32, 0.3440860215053763, 0.3668639053254438, 0.4183381088825215, 0.9969525468001741, 0.9979652345793849, 0.9984892504357932, 0.9980234856412045, 0.9977904407489243]
4

1 回答 1

0

该代码对我来说似乎是正确的,因此问题可能出在您的数据上。这里的问题是结果在很大程度上取决于分区......您可以尝试以下操作:

  1. 检查您是否有足够的数据来制作 20 倍的 CV。也许你可以考虑减少折叠。
  2. 洗牌数据。是一种很好的做法,如此所述。
  3. 重复 CV 几次。对于单一指标,您可以平均每个拆分的 f1-score,然后平均每个 cv 的 f1-score 平均值。

让我知道它是否有效!

于 2019-10-08T09:55:19.550 回答