使用 sklearn BaseEstimator
接口(interface)包装现有模型以兼容 gridsearchCV 的最佳方法是什么?我的模型既没有 set_param 也没有 get_params。我的方法如下:
class Wrapper(BaseEstimator):
def __init__(param1, param2):
self.model = ModelClass(param1, param2)
def fit(data):
self.model.fit(data)
return self
def predict(data):
return self.model.predict(data)
def get_params(self, deep=True): # ?
return self.model.__dict__
def set_params(self, **parameters): # ?, have I to recreate model?
for parameter, value in parameters.items():
setattr(self.model, parameter, value)
return self
最佳答案
在get_params
方法中,您可以使用__dict__
属性返回Wrapper实例的参数字典。这将允许 GridSearchCV 访问 Wrapper 实例的参数并使用它们进行超参数调整。
不要忘记在 __init__
下添加 self.param1 = param1
和 self.param2 = param2
以允许访问 get 和 set .
class Wrapper(BaseEstimator):
def __init__(self, param1, param2):
self.param1 = param1
self.param2 = param2
self.model = ModelClass(param1, param2)
def fit(self, data):
self.model.fit(data)
return self
def predict(self, data):
return self.model.predict(data)
def score(self, data):
return self.model.score(data)
def get_params(self, deep=True):
return {'param1': self.param1, 'param2': self.param2}
def set_params(self, **parameters):
self.param1 = parameters.get('param1', self.param1)
self.param2 = parameters.get('param2', self.param2)
self.model = ModelClass(self.param1, self.param2)
return self
使用GridsearchCV
的示例:
from sklearn.model_selection import GridSearchCV
param_grid = {'param1': [1, 10, 100], 'param2': [0.01, 0.1, 1]}
model = Wrapper()
grid_search = GridSearchCV(estimator=model, param_grid=param_grid)
grid_search.fit(X_train, y_train)
test_score = grid_search.score(X_test, y_test)
print(f'Test score: {test_score:.2f}')
关于python - 使用 sklearn 接口(interface)包裹模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74852797/