Как выполнить случайный поиск по сетке при выборе объектов из модели? - PullRequest
1 голос
/ 06 марта 2020

Я хочу выбрать функции, основанные на важности функций: случайный лес, усиление градиента и экстремальное усиление градиента. Я пытаюсь приспособить свои модели с использованием рандомизированного gridsearch, чтобы получить лучшие значения характеристик модели, но это дает мне ошибку, которую я не понимаю, вот мой код:

gbr = GradientBoostingRegressor(random_state=seed)
gbr_params = {
    "learning_rate": [0.001, 0.01, 0.1],
    "min_samples_split": [50, 100],
    "min_samples_leaf": [50, 100],
    "max_depth":[5, 10, 20]}

xgbr = xgboost.XGBRegressor(random_state=seed) 
xgbr_params = {  
    "learning_rate": [0.001, 0.01, 0.1],
    "min_samples_leaf": [50, 100],
    "max_depth":[5, 10, 20],
    'reg_alpha': [1.1, 1.2, 1.3],
    'reg_lambda': [1.1, 1.2, 1.3]}

rfr = RandomForestRegressor(random_state=seed)
rfr_params={'n_estimators':[100, 500, 1000], 
             'max_features':[10,14,18],
             'min_samples_split': [50, 100],
             'min_samples_leaf': [50, 100],} 

fs_xgbr = dcv.RandomizedSearchCV(xgbr, xgbr_params, cv=5, iid=False, n_jobs=-1)
fs_gbr = dcv.RandomizedSearchCV(gbr, gbr_params, cv=5,iid=False, n_jobs=-1)
fs_rfr = dcv.RandomizedSearchCV(rfr, rfr_params, cv=5,iid=False, n_jobs=-1)

fs_rfr.fit(X, Y)
model = SelectFromModel(fs_rfr, prefit=True)
X_rfr = model.transform(X)
print('rfr', X_rfr.shape)

В строке X_rfr = model.transform(X) выдает эту ошибку:

ValueError: The underlying estimator RandomizedSearchCV has no `coef_` or `feature_importances_` attribute. Either pass a fitted estimator to SelectFromModel or call fit before calling transform.

Я не программист и не нашел другого решения для решения этой проблемы, не возможно ли использовать feature_importances_ модели с ее лучшими параметрами, определенными рандомизированный поиск?

1 Ответ

1 голос
/ 06 марта 2020

Вместо перехода к SelectFromModel fs_rfr, который является объектом типа RandomizedSearchCV, передайте наилучшую оценку, как fs_rfr.best_estimator_

Доказательство

import xgboost
from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import RandomizedSearchCV
from sklearn.feature_selection import SelectFromModel

seed=42

gbr = GradientBoostingRegressor(random_state=seed)
gbr_params = {
    "learning_rate": [0.001, 0.01, 0.1],
    "min_samples_split": [50, 100],
    "min_samples_leaf": [50, 100],
    "max_depth":[5, 10, 20]}

xgbr = xgboost.XGBRegressor(random_state=seed) 
xgbr_params = {  
    "learning_rate": [0.001, 0.01, 0.1],
    "min_samples_leaf": [50, 100],
    "max_depth":[5, 10, 20],
    'reg_alpha': [1.1, 1.2, 1.3],
    'reg_lambda': [1.1, 1.2, 1.3]}

rfr = RandomForestRegressor(random_state=seed)
rfr_params={'n_estimators':[100, 500, 1000], 
             'max_features':[10,14,18],
             'min_samples_split': [50, 100],
             'min_samples_leaf': [50, 100],} 

fs_xgbr = RandomizedSearchCV(xgbr, xgbr_params, cv=5, iid=False, n_jobs=-1)
fs_gbr = RandomizedSearchCV(gbr, gbr_params, cv=5,iid=False, n_jobs=-1)
fs_rfr = RandomizedSearchCV(rfr, rfr_params, cv=5,iid=False, n_jobs=-1)

X, y = make_regression(1000,10)

fs_xgbr.fit(X, y)
fs_gbr.fit(X, y)
fs_rfr.fit(X, y)

model = SelectFromModel(fs_rfr.best_estimator_, prefit=True)
X_rfr = model.transform(X)
print('rfr', X_rfr.shape)

model = SelectFromModel(fs_xgbr.best_estimator_, prefit=True)
X_xgbr = model.transform(X)
print('xgbr', X_xgbr.shape)

model = SelectFromModel(fs_gbr.best_estimator_, prefit=True)
X_gbr = model.transform(X)
print('gbr', X_gbr.shape)

rfr (1000, 3)
xgbr (1000, 3)
gbr (1000, 4)
...