Я создал следующий конвейер для классификатора с той особенностью, что я использую y_train в качестве параметра на этапе feature_select. Вот структура конвейера:
numerical_features=['age','bp','bgr','bu','sc','sod','pot','hemo','pcv','wc','rc']
category_features= ['sg','al','su','rbc', 'pc', 'pcc', 'ba', 'htn', 'dm', 'cad', 'appet', 'pe', 'ane']
pipeline_numeric_feat= Pipeline([('mispelling',adhoc_transf.misspellingTransformer()),
('features_cast',adhoc_transf.Numeric_Cast_Column()),
('data_missing',missing_val_imput.Numeric_Imputer(strategy='median')),
('features_select',feature_select.Feature_Selector(y_train, strategy='wrapper_RFECV')),
('scaler', MinMaxScaler())
])
pipeline_category_feat= Pipeline([('mispelling',adhoc_transf.misspellingTransformer()),
('features_cast',adhoc_transf.Category_Cast_Column()),
('data_missing',missing_val_imput.Category_Imputer(strategy='most_frequent')),
('encoding', OrdinalEncoder()),
('features_select',feature_select.Feature_Selector(y_train, strategy='wrapper_RFECV'))
])
dataprep_pipe=ColumnTransformer([('numeric_pipe',pipeline_numeric_feat,numerical_features),
('category_pipe',pipeline_category_feat, category_features)
])
К вашему сведению, вот что я делаю на шаге 'feature_select' с классом Feature_Selector:
def __init__(self,y_train,strategy='wrapper_RFECV',k_out_features=5, rfe_estimator='LogisticRegression'):
self.y_train=y_train
self.strategy=strategy
self.k_out_features=k_out_features
self.rfe_estimator=rfe_estimator
if self.strategy=='filter_mutinf':
self.feat_sel=SelectKBest(score_func=mutual_info_classif, k=self.k_out_features)
if self.strategy=='wrapper_RFECV':
if self.rfe_estimator=='LogisticRegression':
self.model=LogisticRegression(solver='lbfgs', max_iter=2000)
if self.rfe_estimator=='SVR':
self.model=SVR(kernel='linear')
self.feat_sel=RFECV(self.model)
def fit(self,X,y=None):
print('\n********Inside fit() from Feature_Selector y_train length:', self.y_train.size)
print('\n********Calling fit() from Feature_Selector X length: ', X.shape[0])
self.feat_sel.fit(X,self.y_train)
return self
def transform(self,X,y=None):
X_pruned=self.feat_sel.transform(X)
return X_pruned
Все идет нормально, помещая этот конвейер в более крупный с оценщиком:
full_pipeline=Pipeline([('data_prep',dataprep_pipe),
('model',SGDClassifier())])
full_pipeline.fit(X_train,y_train)
Однако, если я попытаюсь включить full_pipeline в cross_val_score:
cross_val_score(full_pipeline,X_train,y_train, cv=2, scoring='roc_auc')
, я получаю следующую ошибку:
ValueError: Found input variables with inconsistent numbers of samples: [256, 320]
Я обнаружил, что y_train сохраняет свой исходный размер внутри шага feature_select для каждой складки в cross_val, поскольку я получаю следующие следы печати:
********Inside fit() from Feature_Selector y_train length: 320
********Calling fit() from Feature_Selector X length: 256
Как видите, проблема ясна, но у меня нет подсказка о решении. Как я могу сделать, чтобы параметр y_train в создании Feature_Selector соответствовал y, сгенерированному в процессе cross val?
Заранее спасибо!