Python 交叉评分和分层评分之间的F分差异

Python 交叉评分和分层评分之间的F分差异,python,scikit-learn,random-forest,cross-validation,imbalanced-data,Python,Scikit Learn,Random Forest,Cross Validation,Imbalanced Data,我想在不平衡数据上使用随机林分类器,其中X是表示特征的np.array,y是表示标签的np.array(标签有90%的0值和10%的1值)。由于我不确定如何在交叉验证中进行分层,如果这会产生影响,我还使用StratifiedKFold手动交叉验证。我期望的结果不一样,但有些相似。由于情况并非如此,我猜我错误地使用了一种方法,但我不明白是哪一种。这是密码 from sklearn.ensemble import RandomForestClassifier from sklearn.model_s

我想在不平衡数据上使用随机林分类器,其中X是表示特征的np.array,y是表示标签的np.array(标签有90%的0值和10%的1值)。由于我不确定如何在交叉验证中进行分层,如果这会产生影响,我还使用StratifiedKFold手动交叉验证。我期望的结果不一样,但有些相似。由于情况并非如此,我猜我错误地使用了一种方法,但我不明白是哪一种。这是密码

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score, train_test_split
from sklearn.metrics import f1_score

rfc = RandomForestClassifier(n_estimators = 200,
                             criterion = "gini",
                             max_depth = None, 
                             min_samples_leaf = 1, 
                             max_features = "auto", 
                             random_state = 42,
                             class_weight = "balanced")

X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size = 0.20, random_state = 42, stratify=y)
我还尝试了没有class_weight参数的分类器。从这里开始,我将两种方法与f1成绩进行比较

cv = cross_val_score(estimator=rfc,
                     X=X_train_val,
                     y=y_train_val,
                     cv=10,
                     scoring="f1")
print(cv)
交叉验证的10个f1分数都在65%左右。 现在,分层折叠:

skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) 
for train_index, test_index in skf.split(X_train_val, y_train_val):
    X_train, X_val = X_train_val[train_index], X_train_val[test_index]
    y_train, y_val = y_train_val[train_index], y_train_val[test_index]
    rfc.fit(X_train, y_train)
    rfc_predictions = rfc.predict(X_val)
    print("F1-Score: ", round(f1_score(y_val, rfc_predictions),3))

StratifiedKFold的10个f1分数使我的得分达到90%左右。这就是我感到困惑的地方,因为我不理解这两种方法之间的巨大偏差。如果我只是将分类器与列车数据相匹配,并将其应用于测试数据,我也会得到大约90%的f1分数,这让我相信我应用cross_val_分数的方法是不正确的。

造成这种差异的一个可能原因是,
cross_val_分数
使用了
分层折叠
shuffle=False
参数,而在使用
StratifiedKFold
的手动交叉验证中,您已通过
shuffle=True
。因此,它可能只是您的数据排序方式的一个产物,即不洗牌的交叉验证会产生更差的F1分数


在创建
skf
实例时,尝试传递
shuffle=False
,以查看分数是否与
cross\u val\u分数相匹配,然后,如果您想在使用
cross\u val\u score
时使用洗牌,只需在应用
cross\u val\u score
之前手动洗牌训练数据,差异的一个可能原因是
cross\u val\u score
使用带有默认
shuffle=False
参数的
StratifiedKFold
,而在使用
StratifiedKFold
的手动交叉验证中,您已经通过了
shuffle=True
。因此,它可能只是您的数据排序方式的一个产物,即不洗牌的交叉验证会产生更差的F1分数

在创建
skf
实例时,尝试传递
shuffle=False
,查看分数是否与
cross\u val\u分数
匹配,然后在使用
cross\u val\u分数
时,如果要使用shuffling,只需在应用
cross\u val\u分数
之前手动洗牌训练数据即可