在scikit-learn中,如果我从
RandomForestClassifer().estimators_
中提取了一个决策树,我能否手动更改其中的一些特征?我可以使用以下方式遍历它们:
for estimator in rfc.estimators_: for feature in estimator.tree_.feature:
但在这种情况下,我希望手动更改特征。我该如何操作呢?
回答:
如果我正确理解了您的问题,那么您是想更改随机森林中决策树的参数?我不太确定您为什么要这样做。
我将解决方案分为两部分
首先我们尝试更改决策树的参数
from sklearn.tree import DecisionTreeClassifierfrom sklearn.datasets import load_irisclf = DecisionTreeClassifier(random_state=0)iris = load_iris()clf.fit(iris.data,iris.target)#DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,# max_features=None, max_leaf_nodes=None,# min_impurity_decrease=0.0, min_impurity_split=None,# min_samples_leaf=1, min_samples_split=2,# min_weight_fraction_leaf=0.0, presort=False, random_state=0,# splitter='best')#现在提取参数parameters_dt = clf.get_params()#现在更改您想要的参数parameters_dt['max_depth'] = 3#现在创建一个新的分类器new_clf = DecisionTreeClassifier(**parameters_dt)#DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=2,# max_features=None, max_leaf_nodes=None,# min_impurity_decrease=0.0, min_impurity_split=None,# min_samples_leaf=1, min_samples_split=2,# min_weight_fraction_leaf=0.0, presort=False, random_state=0,# splitter='best')
现在让我们回到随机森林
from sklearn.ensemble import RandomForestClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.datasets import make_classificationX, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False)clf = RandomForestClassifier(max_depth=2, random_state=0)clf.fit(X, y)clf_list = clf.estimators_for idx in range(0,len(clf_list)): #获取随机森林中的当前决策树 estimator = clf_list[idx] #获取参数 temp_params = estimator.get_params() #更改您想要的参数 temp_params['max_depth'] = 3 #创建一个新的决策树 temp_decision_tree = DecisionTreeClassifier(**temp_params) #移除旧的决策树 clf.estimators_.pop(idx) #然后在当前位置插入新的决策树 clf.estimators_.insert(idx, temp_decision_tree)
注意:这可能不会产生您想要的效果。我的意思是,它可能不会产生您期望的精确分类器。