FunctionSampler Imbalanced-Learn генерирует ValueError - PullRequest
1 голос
/ 30 июня 2019

Я хочу использовать класс FunctionSampler из imblearn, чтобы создать свой собственный класс для повторной выборки моего набора данных.

У меня есть одномерная серия объектов, содержащая пути для каждого объекта и метка Серия содержащие ярлыки для каждого предмета. Оба происходят от 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 ...

1 Ответ

1 голос
/ 01 июля 2019

Ваша реализация 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))
...