gpt4 book ai didi

machine-learning - 在数据不平衡的管道中进行交叉验证的正确方法

转载 作者:行者123 更新时间:2023-12-04 09:41:37 25 4
gpt4 key购买 nike

对于给定的不平衡数据,我创建了一个不同的标准化管道和一个热编码

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 来强制执行似乎是可取的。 , IE。:

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;来自 docs :

cv : int, cross-validation generator or an iterable, default=None

  • None, to use the default 5-fold cross validation,

  • int, to specify the number of folds in a (Stratified)KFold.

For int/None inputs, if the estimator is a classifier and y is either binary or multiclass, StratifiedKFold is used. In all other cases, KFold is used.



因此,按原样使用您的代码:

scores = cross_val_score(rf, X, y, cv=5, scoring="recall")

确实很好。

关于machine-learning - 在数据不平衡的管道中进行交叉验证的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62308095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com