def get_fitted_randomforest_processor(X_train,
                                      y_train,
                                      constraint_upper,
                                      standardize_y=True,
                                      **rf_params):
    # Initialize gaussian process regressor
    rf = RandomForestRegressor()
    rf.set_params(**rf_params)
    logger.debug(
        'Instantiated random forest processor for objective function:\n' +
        f'{rf}')
    logger.debug(f"Fitting random forest processor")

    if standardize_y:
        if constraint_upper is not None:
            y_train = scale(np.hstack((y_train, constraint_upper)))
            scaled_constraint_upper = y_train[-1]
            y_train = y_train[:-1]
        else:
            y_train = scale([i for i in y_train])
            scaled_constraint_upper = None
        rf.constraint_upper = scaled_constraint_upper
    else:
        rf.constraint_upper = constraint_upper

    logger.debug(f'X_train:\n{X_train}')
    logger.debug(f'y_train\n{y_train}')
    #if rf_params is None or gp_params.get('alpha') is None:
    # Find unique rows of X to avoid GP from breaking
    #ur = unique_rows(X_train)
    #rf.fit(X_train[ur], y_train[ur])
    #else:
    rf.fit(X_train, y_train)
    return rf