对于给定的不平衡数据,我已经创建了一个不同的管道标准化&一个热编码。
numeric_transformer = Pipeline(steps = [('scaler', StandardScaler())])
categorical_transformer = Pipeline(steps=['ohe', OneHotCategoricalEncoder()])
之后,一个列式变压器将上述管道保持在一个整体上。
from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer,categorical_features)]
最终的管道如下
smt = SMOTE(random_state=42)
rf = pl1([('preprocessor', preprocessor),('smote',smt),
('classifier', RandomForestClassifier())])
我正在对不平衡的数据进行管道拟合,所以我将SMOTE技术与预处理和分类器一起加入。由于它是不平衡的,我想检查召回分数。
是正确的方式,如下面的代码所示?我得到的召回率约为0.98,这可能会导致模型过拟合。如果我犯了任何错误,有什么建议吗?
scores = cross_val_score(rf, X, y, cv=5,scoring="recall")
在不平衡的设置中,重要的关注点是确保少数类的足够成员将存在于每个CV褶皱中;因此,似乎最好是强制使用 StratifiedKFold
,即。
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5)
scores = cross_val_score(rf, X, y, cv=skf, scoring="recall")
然而,事实证明,即使是在使用了 "大炮 "的情况下。cross_val_score
和你一样(即只用 cv=5
),scikit-learn照顾到了这一点,并从事了分层简历确实;从 文件:
cv .int,交叉验证生成器或迭代器,默认=None。int, 交叉验证生成器或可迭代,默认=None。
无,使用默认的5次交叉验证。
int,用于指定一个项目的折数。
(Stratified)KFold
.对于intNone输入,如果估计器是一个分类器,且
y
是二进制或多级。StratifiedKFold
使用的是。在所有其他情况下:KFold
被使用。
所以,按原样使用你的代码。
scores = cross_val_score(rf, X, y, cv=5, scoring="recall")
是绝对没有问题的。