NotFittedError:此 DecisionTreeClassifier 实例尚未安装

问题描述 投票:0回答:2

我正在尝试运行基于决策树的模型。我尝试了以下方法:

X = df[['Quantity']]
y = df[['label']]
params = {'max_depth':[2,3,4], 'min_samples_split':[2,3,5,10]}
clf_dt = DecisionTreeClassifier()
clf = GridSearchCV(clf_dt, param_grid=params, scoring='f1')
clf.fit(X, y)
clf_dt = DecisionTreeClassifier(clf.best_params_)

并收到这里提到的警告

FutureWarning: Pass criterion={'max_depth': 2, 'min_samples_split': 2} as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
  warnings.warn(f"Pass {args_msg} as keyword args. From version "

后来,我尝试运行下面的代码并出现错误(但我已经使用

.fit()
拟合模型)

from sklearn import tree
tree.plot_tree(clf_dt, filled=True, feature_names = list(X.columns), class_names=['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'])

NotFittedError: This DecisionTreeClassifier instance is not fitted yet. Call 
'fit' with appropriate arguments before using this estimator.

我该如何解决这个问题?

python machine-learning scikit-learn classification decision-tree
2个回答
4
投票

如果您选择

best_params_
,则必须使用这些参数重新拟合模型。请注意,这些在传递给模型时应该被解压:

clf_dt = DecisionTreeClassifier(**clf.best_params_)
clf_dt.fit(X, y)

但是,您也可以使用

best_estimator_
属性来直接访问最佳模型:

clf_dt = clf.best_estimator_

1
投票

所以您面临两个问题。

首先

参考

FutureWarning:传递 criteria={'max_depth': 2, 'min_samples_split': 2} 作为关键字参数。从版本 1.0(0.25 的重命名)开始,将这些作为位置参数传递将导致错误

您可以在创建

dict
时尝试使用
params
类构造函数:

params = dict(max_depth=[2,3,4], min_samples_split=[2,3,5,10])

但是这个警告看起来很奇怪,而且它没有发生在我身上。

其次

参考

NotFittedError:此 DecisionTreeClassifier 实例尚未安装。在使用此估计器之前,请使用适当的参数调用“fit”。

在这里您可以了解sklearn中的强制拟合步骤。但正如您所说,您只是在第一个代码示例中这样做了。你的问题是使用

clf_dt = DecisionTreeClassifier(clf.best_params_)

您创建了一个新的

DecisionTreeClassifier
类,因此当您调用时不适合

tree.plot_tree(clf_dt ...)

当你打电话时

clf = GridSearchCV(clf_dt, param_grid=params, scoring='f1')

sklearn 根据您的情况自动将最佳估计器分配给

clf
。所以只需使用这个变量:) 以下步骤
clf_dt = DecisionTreeClassifier(clf.best_params_)
不是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.