Код: Выделить всё
MyFeatureConcator
Обнаружена следующая ошибка:
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)
Здесь также не показано значение NaN:< /p>
Код: Выделить всё
pipe.named_steps['concat'].fit_transform(pipe.named_steps['scaler'].fit_transform(x)).isna().sum()
Я ожидаю, что пользовательский ресэмплер получит X от предыдущий конкатор и цель из сетки.fit(X, target), которая затем должна вернуть X_resampled и y_resampled, которые должны быть переданы на последнем этапе, т.е. классификатор .
Подробнее здесь: https://stackoverflow.com/questions/791 ... mators-and