首页 > 解决方案 > 不平衡学习的 FunctionSampler 抛出 ValueError

问题描述

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

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

当我使用该类时RandomUnderSampler,一切正常,但是,如果我首先将功能和标签都传递给该fit_resample方法 FunctionSampler,然后创建一个实例,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)

有谁知道这里出了什么问题?似乎fit_resample方法FunctionSampler不等于fit_resample方法RandomUnderSampler...

标签: pythonpandasscikit-learnimblearn

解决方案


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

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

但是FunctionSampler()有这个检查,看这里

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))

推荐阅读