Пользовательский метод Predict для RandomForestRegressor, который принимает список словарей - PullRequest
0 голосов
/ 06 августа 2020

Как я могу переопределить метод прогнозирования в RandomForestRegressor, чтобы он принял список словарей. Преобразование должно произойти в методе прогноза, потому что он вызывается оценщиком. Я получаю:

ValueError: Expected 2D array, got 1D array instead:

Я попытался создать собственный регрессор следующим образом:

from sklearn.base import BaseEstimator, RegressorMixin
from sklearn.ensemble import RandomForestRegressor
from sklearn.utils import check_array, check_random_state

class SurveyEstimator(BaseEstimator, RegressorMixin):
        def __init__(self, random_state=None):
            self.random_state = random_state
            self.rgr = RandomForestRegressor(random_state =  self.random_state)
            
            
        def get_params(self, deep=True):
            return {'random_state': self.random_state}
        
        def set_params(self, **parameters):
            for parameter, value in parameters.items():
                setattr(self, parameter, value)
            return self
            
        def fit(self, X, y):
            self.random_state_ = check_random_state(self.random_state)
            self.rgr.fit(X,y)
            return self

      
        def predict(self, X):
            if not isinstance(X, pd.DataFrame): 
     
                X = pd.DataFrame(X);
                 
            y_pred = self.rgr.predict(X)
           
            return y_pred 

Модель выглядит так:

survey_model = Pipeline([
    ('features', FeatureUnion([
        ('business', business_features),
        ('survey', cycle_1_features),
        ('time', time_feature)
    ])),
    
     ('estimator', SurveyEstimator(random_state=0))
])

survey_model.predict(dataset)

возвращает

ValueError: Expected 2D array, got 1D array instead:
   
array=[{'BEDCERT': 76, 'RESTOT': 64.8, 'INHOSP': False, 'CCRC_FACIL': False, 'SFF': False, 'CHOW_LAST_12MOS': False, 'SPRINKLER_STATUS': True, 'EXP_TOTAL':     3.41266, 'ADJ_TOTAL': 4.8281600000000005, 'OWNERSHIP': 'Non profit - Corporation', 'CERTIFICATION': 'Medicare and Medicaid', 'CYCLE_1_DEFS': 5,     'CYCLE_1_NFROMDEFS': 5, 'CYCLE_1_NFROMCOMP': 0, 'CYCLE_1_DEFS_SCORE': 20, 'CYCLE_1_NUMREVIS': 1, 'CYCLE_1_REVISIT_SCORE': 0, 'CYCLE_1_TOTAL_SCORE': 20,     'CYCLE_1_SURVEY_DATE': '2017-04-13', 'CYCLE_2_SURVEY_DATE': '2016-03-17'}
 {'BEDCERT': 118, 'RESTOT': 92.4, 'INHOSP': False, 'CCRC_FACIL': False, 'SFF': False, 'CHOW_LAST_12MOS': False, 'SPRINKLER_STATUS': True, 'EXP_TOTAL': 3.34641,      'ADJ_TOTAL': 3.16711, 'OWNERSHIP': 'For profit - Corporation', 'CERTIFICATION': 'Medicare and Medicaid', 'CYCLE_1_DEFS': 3, 'CYCLE_1_NFROMDEFS': 3,      'CYCLE_1_NFROMCOMP': 0, 'CYCLE_1_DEFS_SCORE': 12, 'CYCLE_1_NUMREVIS': 1, 'CYCLE_1_REVISIT_SCORE': 0, 'CYCLE_1_TOTAL_SCORE': 12, 'CYCLE_1_SURVEY_DATE': '2017-05-      10', 'CYCLE_2_SURVEY_DATE': '2016-05-26'}

Эти утверждения работали нормально:

assert time_feature.fit_transform(data).shape[0] == data.shape[0]
assert business_features.fit_transform(data).shape[0] == data.shape[0]
assert cycle_1_features.fit_transform(data).shape[0] == data.shape[0]
...