【问题标题】:Imbalanced-Learn's FunctionSampler throws ValueError不平衡学习的 FunctionSampler 抛出 ValueError
【发布时间】:2023-03-23 20:27:01
【问题描述】:

我想使用 imblearn 中的 FunctionSampler 类来创建我自己的自定义类来重新采样我的数据集。

我有一个一维特征系列,其中包含每个主题的路径和一个标签系列包含每个主题的标签。两者都来自pd.DataFrame。我知道我必须先重塑特征数组,因为它是一维的。

当我使用 RandomUnderSampler 类时,一切正常,但是如果我首先将功能和标签都传递给 FunctionSamplerfit_resample 方法,然后创建 RandomUnderSampler 的实例,然后调用fit_resample 在这个类上,我收到以下错误:

ValueError:无法将字符串转换为浮点数:'path_1'

这是一个产生错误的最小示例:

import pandas as pd
from imblearn.under_sampling import RandomUnderSampler
from imblearn import FunctionSampler

# create one dimensional feature and label arrays X and y
# X has to be converted to numpy array and then reshaped. 
X = pd.Series(['path_1','path_2','path_3'])
X = X.values.reshape(-1,1)
y = pd.Series([1,0,0])

第一种方法(有效)

rus = RandomUnderSampler()
X_res, y_res = rus.fit_resample(X,y)

第二种方法(不起作用)

def resample(X, y):
    return RandomUnderSampler().fit_resample(X, y)

sampler = FunctionSampler(func=resample)
X_res, y_res = sampler.fit_resample(X, y)

有人知道这里出了什么问题吗?似乎FunctionSamplerfit_resample 方法不等于RandomUnderSamplerfit_resample 方法...

【问题讨论】:

    标签: python pandas scikit-learn imblearn


    【解决方案1】:

    您对FunctionSampler 的实现是正确的。问题出在您的数据集上。

    RandomUnderSampler 似乎也适用于文本数据。没有使用check_X_y 进行检查。

    但是FunctionSampler() 有这个检查,见here

    from sklearn.utils import check_X_y
    
    X = pd.Series(['path_1','path_2','path_2'])
    X = X.values.reshape(-1,1)
    y = pd.Series([1,0,0])
    
    check_X_y(X, y)
    

    这会报错

    ValueError:无法将字符串转换为浮点数:'path_1'

    下面的例子可以工作!

    X = pd.Series(['1','2','2'])
    X = X.values.reshape(-1,1)
    y = pd.Series([1,0,0])
    
    def resample(X, y):
        return RandomUnderSampler().fit_resample(X, y)
    
    sampler = FunctionSampler(func=resample)
    X_res, y_res = sampler.fit_resample(X, y)
    
    X_res, y_res 
    # (array([[2.],
    #        [1.]]), array([0, 1], dtype=int64))
    

    【讨论】:

    • 啊,我明白了。感谢您的链接!正如check_X_y 的文档中所说:“如果 X 的 dtype 是对象,请尝试转换为浮点数,失败时引发。”由于路径无法转换为浮点数,因此会引发此错误。但是FunctionSampler 包含check_X_y 而不是RandomUnderSampler 背后的逻辑是什么?直觉上,我希望它们能够以相同的方式工作,因此要么允许要么不允许路径字符串。
    • 有效问题。我建议在 github 上提出问题。
    • 我提出了一个问题!
    猜你喜欢
    • 2023-04-10
    • 2013-06-29
    • 2017-03-26
    • 2017-01-05
    • 2017-11-19
    • 2018-12-14
    • 2018-03-02
    • 2018-02-27
    • 2017-09-19
    相关资源
    最近更新 更多