Я новичок в ML и пытаюсь запустить модель на основе дерева решений.

Я пробовал ниже

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.

Можете помочь мне с этим, как я могу исправить эту ошибку?

0
The Great 26 Янв 2022 в 16:28

2 ответа

Лучший ответ

Итак, перед вами стоят две проблемы.

Во-первых

Ссылаясь на

FutureWarning: передать критерий = {'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 еще не установлен. Вызовите «подгонку» с соответствующими аргументами перед использованием этой оценки.

Здесь вы можете узнать об обязательных шаг установки в 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_) не требуется.

1
Robin 26 Янв 2022 в 18:44
Спасибо, проголосовал за привет
 – 
The Great
26 Янв 2022 в 16:53
params = dict(max_depth=[2,3,4], min_samples_split=[2,3,5,10]) - это именно то, что использовал OP, а clf = GridSearchCV(clf_dt, param_grid=**params, scoring='f1') - недопустимый синтаксис.
 – 
a_guest
26 Янв 2022 в 17:06

Если вы выберете best_params_, вам придется переоборудовать модель с этими параметрами. Обратите внимание, что они должны быть распакованы при передаче в модель:

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

Однако вы также можете использовать атрибут best_estimator_ для прямого доступа к лучшей модели:

clf_dt = clf.best_estimator_
1
a_guest 26 Янв 2022 в 16:43
Спасибо проголосовали. Но я получил эту ошибку `AttributeError: объект GridSearchCV не имеет атрибута 'tree_'`
 – 
The Great
26 Янв 2022 в 16:47
Но я уже импортировал дерево из sklearn
 – 
The Great
26 Янв 2022 в 16:47
Где именно вы пытаетесь получить доступ к clf.tree_?
 – 
a_guest
26 Янв 2022 в 16:48
Спасибо, теперь сработало. Я допустил ошибку, сославшись на неверный clf вместо clf_dt
 – 
The Great
26 Янв 2022 в 16:52