Как я могу переопределить метод прогнозирования в 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]