Размер y не изменяется внутри конвейера при его перекрестной проверке - PullRequest
0 голосов
/ 09 июля 2020

Я создал следующий конвейер для классификатора с той особенностью, что я использую 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?

Заранее спасибо!

...