Обнаружено значение NaN между этапами конвейера, пользовательскими оценщиками sklearn и пользовательским сэмплером imblePython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обнаружено значение NaN между этапами конвейера, пользовательскими оценщиками sklearn и пользовательским сэмплером imble

Сообщение Anonymous »

Я пробовал собственный оценщик и собственный сэмплер.

Код: Выделить всё

MyFeatureConcator
и MyFeatureResampler — это пользовательские оценщики, которые я хотел бы использовать в качестве шагов в своем конвейере.
Обнаружена следующая ошибка:

ValueError: входные данные X содержат NaN.
MyFeatureResampler не принимает отсутствующие значения, закодированные как NaN. Для контролируемого обучения вы можете рассмотреть sklearn.ensemble.HistGradientBoostingClassifier и Regressor, которые принимают пропущенные значения, закодированные как NaN. В качестве альтернативы можно предварительно обработать данные, например, используя преобразователь в конвейере или отбросив выборки с пропущенными значениями. См. https://scikit-learn.org/stable/modules/impute.html. Список всех оценщиков, обрабатывающих значения NaN, можно найти на следующей странице: https://scikit-learn.org/stable/modules/impute. .html#estimators-that-handle-nan-values

Код:

Код: Выделить всё

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from imblearn.over_sampling import SMOTE
from sklearn.base import BaseEstimator, TransformerMixin
from imblearn.base import BaseSampler, SamplerMixin
from imblearn.pipeline import Pipeline as ImbPipeline

# custom Concator
class MyFeatureConcator(BaseEstimator, TransformerMixin):
def __init__(self, df0_cols ,concatee):
self.concatee = concatee
self.df0_cols = df0_cols

def fit(self, X, y = None):
return self

def transform(self, X, y=None):
x = pd.DataFrame(data= X, columns= self.df0_cols)
X = pd.concat(objs = [x, self.concatee], axis = 1)
return X

# custom OverSampler (SMOTE)
class MyFeatureResampler(BaseSampler, SamplerMixin):
def __init__(self, kneigh=None):
self.kneigh = kneigh

def fit(self, X, y= None):
return self

def _fit_resample(self, X, y=None):
smote = SMOTE(k_neighbors= self.kneigh)
X_resample, y_resample = smote.fit_resample(X, y)
return (X_resample, y_resample)

# Estimators
scaler = StandardScaler()
concator = MyFeatureConcator(concatee= encoded_data, df0_cols=x.columns)
logistic = LogisticRegression(max_iter=3000)
knn = KNeighborsClassifier()
resampler = MyFeatureResampler()

# Pipeline steps
steps = [('scaler', scaler), ('concat', concator),('rsmp', resampler), ('clf', logistic)]
pipe = ImbPipeline(steps)

# Grid params
param1 = {'clf__C': np.linspace(0,1, 5),
'clf__penalty': ['elasticnet', 'l1', 'l2'],
'clf__solver' : ['saga'],
'clf__l1_ratio':np.linspace(0,1,6),
'clf': [logistic]
}

param2 = {'clf__n_neighbors':np.linspace(3,20,5,dtype=np.int_),
'clf':[knn]}

param3 = {'rsmp__kneigh': np.linspace(3,20,5, dtype=np.int_),
'rsmp':[resampler]}

params = [param1, param2, param3]

# GridSearch
grid = GridSearchCV(estimator= pipe, param_grid=params, cv = 5, verbose=1)
grid.fit(x, target)
Подтверждено, что x и target не имеют значений NaN
Здесь также не показано значение NaN:< /p>

Код: Выделить всё

pipe.named_steps['concat'].fit_transform(pipe.named_steps['scaler'].fit_transform(x)).isna().sum()
Encoded_data — это горячее кодирование для категориальных данных, где x — это числовые данные, которые я хотел масштабировать. После масштабирования x я хотел объединить x и encoded_data в один кадр данных, таким образом создав собственный оценщик MyFeatureConcator. Затем конкатор возвращает X, который должен быть передан в пользовательский ресэмплер MyFeatureResampler.
Я ожидаю, что пользовательский ресэмплер получит X от предыдущий конкатор и цель из сетки.fit(X, target), которая затем должна вернуть X_resampled и y_resampled, которые должны быть переданы на последнем этапе, т.е. классификатор .

Подробнее здесь: https://stackoverflow.com/questions/791 ... mators-and
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»