结合 GridSearchCV 和 StackingClassifier
Combine GridSearchCV and StackingClassifier
我想用StackingClassifier组合一些分类器,然后用GridSearchCV优化参数:
clf1 = RandomForestClassifier()
clf2 = LogisticRegression()
dt = DecisionTreeClassifier()
sclf = StackingClassifier(estimators=[clf1, clf2],final_estimator=dt)
params = {'randomforestclassifier__n_estimators': [10, 50],
'logisticregression__C': [1,2,3]}
grid = GridSearchCV(estimator=sclf, param_grid=params, cv=5)
grid.fit(x, y)
但这是一个错误:
'RandomForestClassifier' object has no attribute 'estimators_'
我用过n_estimators
。为什么它警告我没有 estimators_
?
一般GridSearchCV都是针对单模型的,所以我只需要将单模型的参数名写在dict中即可。
我参考了这个页面https://groups.google.com/d/topic/mlxtend/5GhZNwgmtSg但是它使用了早期版本的参数。即使我更改了新参数,它也不起作用。
顺便说一句,我在哪里可以了解到这些参数的命名规则的细节?
经过一些尝试,也许我找到了一个可用的解决方案。
解决这个问题的关键是利用get_params()
知道StackingClassifier的参数
我用另一种方式创建sclf:
clf1 = RandomForestClassifier()
clf2 = LogisticRegression()
dt = DecisionTreeClassifier()
estimators = [('rf', clf1),
('lr', clf2)]
sclf = StackingClassifier(estimators=estimators,final_estimator=dt)
params = {'rf__n_estimators': list(range(100,1000,100)),
'lr__C': list(range(1,10,1))}
grid = GridSearchCV(estimator=sclf, param_grid=params,verbose=2, cv=5,n_jobs=-1)
grid.fit(x, y)
这样,我可以命名每个基本分类器,然后用它们的名字设置参数。
首先,estimators
需要是一个 list,其中包含 tuples 中的模型,并具有相应的分配 姓名.
estimators = [('model1', model()), # model() named model1 by myself
('model2', model2())] # model2() named model2 by myself
接下来,您需要使用 sclf.get_params()
中出现的名称。
此外,该名称与您在上述 estimators
列表中为特定型号指定的名称相同。所以,在这里你需要的 model1 参数:
params = {'model1__n_estimators': [5,10]} # model1__SOME_PARAM
工作玩具示例:
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import StackingClassifier
from sklearn.model_selection import GridSearchCV
X, y = make_classification(n_samples=1000, n_features=4,
n_informative=2, n_redundant=0,
random_state=0, shuffle=False)
estimators = [('rf', RandomForestClassifier(n_estimators=10, random_state=42)),
('logreg', LogisticRegression())]
sclf = StackingClassifier(estimators= estimators , final_estimator=DecisionTreeClassifier())
params = {'rf__n_estimators': [5,10]}
grid = GridSearchCV(estimator=sclf, param_grid=params, cv=5)
grid.fit(X, y)
我想用StackingClassifier组合一些分类器,然后用GridSearchCV优化参数:
clf1 = RandomForestClassifier()
clf2 = LogisticRegression()
dt = DecisionTreeClassifier()
sclf = StackingClassifier(estimators=[clf1, clf2],final_estimator=dt)
params = {'randomforestclassifier__n_estimators': [10, 50],
'logisticregression__C': [1,2,3]}
grid = GridSearchCV(estimator=sclf, param_grid=params, cv=5)
grid.fit(x, y)
但这是一个错误:
'RandomForestClassifier' object has no attribute 'estimators_'
我用过n_estimators
。为什么它警告我没有 estimators_
?
一般GridSearchCV都是针对单模型的,所以我只需要将单模型的参数名写在dict中即可。
我参考了这个页面https://groups.google.com/d/topic/mlxtend/5GhZNwgmtSg但是它使用了早期版本的参数。即使我更改了新参数,它也不起作用。
顺便说一句,我在哪里可以了解到这些参数的命名规则的细节?
经过一些尝试,也许我找到了一个可用的解决方案。
解决这个问题的关键是利用get_params()
知道StackingClassifier的参数
我用另一种方式创建sclf:
clf1 = RandomForestClassifier()
clf2 = LogisticRegression()
dt = DecisionTreeClassifier()
estimators = [('rf', clf1),
('lr', clf2)]
sclf = StackingClassifier(estimators=estimators,final_estimator=dt)
params = {'rf__n_estimators': list(range(100,1000,100)),
'lr__C': list(range(1,10,1))}
grid = GridSearchCV(estimator=sclf, param_grid=params,verbose=2, cv=5,n_jobs=-1)
grid.fit(x, y)
这样,我可以命名每个基本分类器,然后用它们的名字设置参数。
首先,estimators
需要是一个 list,其中包含 tuples 中的模型,并具有相应的分配 姓名.
estimators = [('model1', model()), # model() named model1 by myself
('model2', model2())] # model2() named model2 by myself
接下来,您需要使用 sclf.get_params()
中出现的名称。
此外,该名称与您在上述 estimators
列表中为特定型号指定的名称相同。所以,在这里你需要的 model1 参数:
params = {'model1__n_estimators': [5,10]} # model1__SOME_PARAM
工作玩具示例:
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import StackingClassifier
from sklearn.model_selection import GridSearchCV
X, y = make_classification(n_samples=1000, n_features=4,
n_informative=2, n_redundant=0,
random_state=0, shuffle=False)
estimators = [('rf', RandomForestClassifier(n_estimators=10, random_state=42)),
('logreg', LogisticRegression())]
sclf = StackingClassifier(estimators= estimators , final_estimator=DecisionTreeClassifier())
params = {'rf__n_estimators': [5,10]}
grid = GridSearchCV(estimator=sclf, param_grid=params, cv=5)
grid.fit(X, y)