Estoy tratando de seleccionar las características de gradiente de impulsar el uso de arranque - realizar la bootstapping a través de la BaggingRegressor
en scikit-learn. No estoy seguro de que esto es posible o correcto, pero esto es lo que he intentado:
bag = BaggingRegressor(base_estimator=GradientBoostingRegressor(), bootstrap_features=True, random_state=seed)
bag.fit(X,Y)
model = SelectFromModel(bag, prefit=True, threshold='mean')
gbr_boot = model.transform(X)
print('gbr_boot', gbr_boot.shape)
Esto da el error:
ValueError: The underlying estimator BaggingRegressor has no `coef_` or `feature_importances_` attribute. Either pass a fitted estimator to SelectFromModel or call fit before calling transform.
No estoy seguro de cómo hacer frente a este error, pensé gradiente de impulsar da feature_importances_
. He intentado trabajar alrededor de él con:
bag = BaggingRegressor(base_estimator=GradientBoostingRegressor(), bootstrap_features=True, random_state=seed)
bag.fit(X,Y)
feature_importances = np.mean([
tree.feature_importances_ for tree in bag.estimators_
], axis=0)
threshold = np.mean(feature_importances)
temp=()
for i in feature_importances:
if i > threshold:
temp=temp + ((i),)
else:
temp=temp + (('null'),)
model_features=data.columns
feature = pd.DataFrame(np.array(model_features))
df = pd.DataFrame(temp)
df_total = pd.concat([feature, df], axis=1)
Esto parece tener éxito en dar características seleccionadas superando el umbral de importancia que he hecho, pero no estoy seguro de si estoy encontrando la verdadera función de selección de BaggingRegressor
la cual SelectFromModel
también se encuentra, o si (como el error scikit-learn implica para mí) no existe para este método. Para mayor claridad, la razón por la que estoy tratando de BaggingRegressor
arranque se debe al SelectFromModel
gradiente impulsar solos fluctuación en el número de características que haya seleccionado, y me leyó un papel (sección 7.1) diciendo bootstrapping puede reducir esta variación (tal como lo entendía, no lo creo tener un CS / estadísticas de fondo).
Hay que crear un envoltorio de BaggingRegressor
para este problema.
class MyBaggingRegressor(BaggingRegressor):
@property
def feature_importances_(self):
return self.regressor_.feature_importances_
@property
def coef_(self):
return self.regressor_.coef_
Hay un problema existente con respecto a esto en sklearn
aquí y el correspondiente PR .
Nota: usted no tiene que ir a por BaggingRegressor, si su base_estimator es GradientBoostingRegressor
.
utilizar el subsample
parámetro para lograr el mismo.
submuestra: flotador, opcional (por defecto = 1,0)
La fracción de muestras que se utiliza para el montaje de los alumnos de base individuales. Si es menor de 1,0 esto resulta en estocástico Gradiente Impulsar. interactúa submuestra con los n_estimators parámetros. La elección de submuestra <1.0 conduce a una reducción de la varianza y un aumento de sesgo.