我使用SMOTENC对不平衡的数据集进行过采样。
我认为SMOTENC的目的是给出对分类特性进行过度采样的选项-- without一个热编码它们。我不想使用一个热编码的原因是为了避免维度的诅咒,让CatBoost通过使用池级定义分类特征来处理分类特征。
但是,当试图使用SMOTENC进行过度采样时,我仍然会得到以下错误:
could not convert string to float
首先,我对我的数字和分类特征进行了一些预处理。
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"):
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,
)我对我的数据进行了预处理和重采样:
x_t = preprocessor.fit_transform(x)
x_t, y_t = resampling_transformer.fit_resample(x_t, y)Resampling_transformer fit_resample函数为我提供了:
ValueError: could not convert string to float: '(str)'我还需要使用SMOTENC进行一次热编码吗?还是我做错什么了?`
发布于 2023-04-26 15:04:51
我也有同样的场景--我通过将类别列转换为'object‘而不是’分类‘类型来修正它。
X[categorical_features]=X[categorical_features].astype("object")编辑:另一个可能的原因是,SMOTENC希望索引而不是分类属性的名称,但是其他转换器可能正在重新排序数据格式列(例如数字标量),因此当管道到达SMOTENC时,索引是错误的。
https://datascience.stackexchange.com/questions/118596
复制相似问题