Я новичок в 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.
Можете помочь мне с этим, как я могу исправить эту ошибку?
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_)
не требуется.
Если вы выберете best_params_
, вам придется переоборудовать модель с этими параметрами. Обратите внимание, что они должны быть распакованы при передаче в модель:
clf_dt = DecisionTreeClassifier(**clf.best_params_)
clf_dt.fit(X, y)
Однако вы также можете использовать атрибут best_estimator_
для прямого доступа к лучшей модели:
clf_dt = clf.best_estimator_
clf.tree_
?
clf
вместо clf_dt
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.
params = dict(max_depth=[2,3,4], min_samples_split=[2,3,5,10])
- это именно то, что использовал OP, аclf = GridSearchCV(clf_dt, param_grid=**params, scoring='f1')
- недопустимый синтаксис.