首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不进行一次热编码的SMOTENC过采样

不进行一次热编码的SMOTENC过采样
EN

Data Science用户
提问于 2023-02-17 17:48:59
回答 1查看 77关注 0票数 0

我使用SMOTENC对不平衡的数据集进行过采样。

我认为SMOTENC的目的是给出对分类特性进行过度采样的选项-- without一个热编码它们。我不想使用一个热编码的原因是为了避免维度的诅咒,让CatBoost通过使用池级定义分类特征来处理分类特征。

但是,当试图使用SMOTENC进行过度采样时,我仍然会得到以下错误:

could not convert string to float

首先,我对我的数字和分类特征进行了一些预处理。

预处理

代码语言:javascript
复制
     numerical_transformer = Pipeline(
            steps=[
                ("transformer", FunctionTransformer(lambda d: d.astype(np.float32))),
                ("imputer", SimpleImputer(strategy="mean")),
                ("scaler", MinMaxScaler()),
            ],
            verbose=True,
        )
    
        categorical_transformer = Pipeline(
            steps=[
                ("transformer", FunctionTransformer(lambda d: d.astype(str))),
                ("imputer", SimpleImputer(strategy="most_frequent")),
                #("oh_encoder", OneHotEncoder(handle_unknown="ignore")),
            ],
            verbose=True,
        )

其次,我的重采样变压器首先由一个欠采样器组成,然后是一个过采样器(cat_col_indices是我的类别特征的索引,它们都具有dtype "object"):

重采样

代码语言:javascript
复制
    resampling_coefficient = 0.6
    resampling_transformer = Pipeline(
        steps=[
            (
                "undersampler",
                    RandomUnderSampler(
                        sampling_strategy=resampling_coefficient
                    ),
            ),
            (
                "oversampler",
                    SMOTENC(
                        categorical_features=cat_col_indices,
                        sampling_strategy="not majority", 
                        k_neighbors=3, 
                        n_jobs=16
                    ),
            ),
        ],
        verbose=True,
    )

我对我的数据进行了预处理和重采样:

代码语言:javascript
复制
    x_t = preprocessor.fit_transform(x)
    x_t, y_t = resampling_transformer.fit_resample(x_t, y)

Resampling_transformer fit_resample函数为我提供了:

代码语言:javascript
复制
ValueError: could not convert string to float: '(str)'

我还需要使用SMOTENC进行一次热编码吗?还是我做错什么了?`

EN

回答 1

Data Science用户

发布于 2023-04-26 15:04:51

我也有同样的场景--我通过将类别列转换为'object‘而不是’分类‘类型来修正它。

代码语言:javascript
复制
X[categorical_features]=X[categorical_features].astype("object")

编辑:另一个可能的原因是,SMOTENC希望索引而不是分类属性的名称,但是其他转换器可能正在重新排序数据格式列(例如数字标量),因此当管道到达SMOTENC时,索引是错误的。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/118596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档