Вопрос или проблема
Я надеялся настроить мою модель decisiontree, однако я постоянно сталкиваюсь с этой ошибкой:
TypeError: DecisionTreeClassifier() получил неожиданный аргумент ‘criterion’
вот что я попытался сделать:
def randomsearch():
data = pd.read_csv('test_data.csv', delimiter=",")
x = data.iloc[:, :70]
y = data['class'].values
param_dist = {"max_depth": [3, None],
"max_features": randint(1, 9),
"min_samples_leaf": randint(1, 9),
"criterion": ["gini", "entropy"]}
tree = DecisionTreeClassifier()
tree_cv = RandomizedSearchCV(tree, param_dist, cv=5)
tree_cv.fit(x,y)
print("Подобранные параметры Decision Tree: {}".format(tree_cv.best_params_))
print("Лучший результат: {}".format(tree_cv.best_score_))
Я ожидал получить лучшие параметры для моего набора данных. Эта ошибка кажется странной, есть ли причины, почему она возникает, и как ее обойти?
импорты:
import pandas as pd
from sklearn.model_selection import KFold
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.metrics import classification_report
from random import randint
import pandas as pd
import numpy as np
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split , cross_val_score , RandomizedSearchCV,GridSearchCV,RepeatedStratifiedKFold
from sklearn.pipeline import make_pipeline
from sklearn import preprocessing
from scipy.stats import loguniform
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn import svm
from sklearn.model_selection import LeaveOneOut
import pickle
Параметр ‘criterion’ выглядит хорошо, но проблема, похоже, в параметрах ‘max_features’ и ‘min_samples_leaf’, потому что вы используете одно целое число, а не итерируемый объект. Попробуйте добавить значения в список, например так:
param_dist = {"max_depth": [3, None],
"max_features": [randint(1, 9)],
"min_samples_leaf": [randint(1, 9)],
"criterion": ["gini", "entropy"]}
Ответ или решение
Ваша проблема с гипертюнингом модели DecisionTreeClassifier вполне может быть связана с ошибкой, которая вызывает TypeError: "DecisionTreeClassifier() got an unexpected keyword argument ‘criterion’". Чтобы понять причину, давайте подробнее рассмотрим вашу реализацию и различные аспекты этого вопроса.
Теория
В машинном обучении гиперпараметры — это параметры, которые определяются прежде начала обучения модели. Их настройка (гипертюнинг) помогает улучшить производительность модели без необходимости изменения самого алгоритма. RandomizedSearchCV — это один из способов автоматизировать процесс выбора гиперпараметров для большей эффективности и точности.
DecisionTreeClassifier из библиотеки scikit-learn принимает различные гиперпараметры, среди которых criterion
, max_depth
, max_features
, и min_samples_leaf
. Каждый из этих параметров играет важную роль в работе модели:
- criterion: определяется метод оценки качества разбиения. Обычно используются варианты "gini" или "entropy".
- max_depth: это максимальная глубина дерева. Ограничение этого параметра помогает избежать переобучения дерева на тренировочных данных.
- max_features: количество признаков, которое используется для выбора лучшего разбиения.
- min_samples_leaf: минимальное количество семплов, необходимых в листе. Это также помогает контролировать переобучение.
Пример
Исходя из предоставленного вами кода, вы пытаетесь настроить вашу модель, используя RandomizedSearchCV, передавая в него параметры, включая criterion
. Однако указывание значений max_features
и min_samples_leaf
в неподходящих формах может вызывать ошибки не только в понимании кода, но и в плане неправильной работы алгоритма, если взять за воспринимаемое, что ошибка в criterion
— ложная.
Ваш код имеет следующую структуру:
from sklearn.model_selection import RandomizedSearchCV
from sklearn.tree import DecisionTreeClassifier
from scipy.stats import randint
def randomsearch():
data = pd.read_csv('test_data.csv', delimiter=",")
x = data.iloc[:, :70]
y = data['class'].values
param_dist = {
"max_depth": [3, None],
"max_features": randint(1, 9), # Это необходимо обернуть в список []
"min_samples_leaf": randint(1, 9), # Это также обернуть в список []
"criterion": ["gini", "entropy"]
}
tree = DecisionTreeClassifier()
tree_cv = RandomizedSearchCV(tree, param_dist, cv=5)
tree_cv.fit(x, y)
print("Tuned Decision Tree Parameters: {}".format(tree_cv.best_params_))
print("Best score is {}".format(tree_cv.best_score_))
Возможно, ошибка связана с ошибочной передачей параметров, и criterion
здесь не является причиной. Как вы справедливо отметили, проблема может заключаться в параметрах, которые принимают значения из распределий randint
. Параметры max_features
и min_samples_leaf
должны быть в форме итерируемых объектов (например, списки или другие формы), так как RandomizedSearchCV ожидает, что будет выборка из какого-то набора значений.
Применение
Теперь давайте рассмотрим, что вы можете сделать для решения этой проблемы:
- Изменение формата параметров распределений. Убедитесь, что
randint
или другие распределения, будут обернуты как минимум в списки:
param_dist = {
"max_depth": [3, None],
"max_features": [randint(1, 9)],
"min_samples_leaf": [randint(1, 9)],
"criterion": ["gini", "entropy"]
}
-
Проверка на импорт. Если ошибка всё еще возникает, убедитесь, что все импорты выполнены корректно и версии библиотек такие, где их методы поддерживают указанные параметры. Возможно необходимо обновить библиотеки или проверить код на предмет устаревших функций.
-
Печать отладки. Для большей уверенности можно внедрить промежуточную печать значений перед их использованием в методах, что позволит убедиться в их корректности (типах и содержаниях), которые передаются в RandomizedSearchCV.
-
Документация. Не забывайте обращаться к официальной документации библиотеки, чтобы убедиться в актуальности используемых параметров и их значениях; так можно избежать ошибок из-за изменений в API библиотеки.
Такие шаги должны помочь устранить возникшую проблему и правильно выполнить гипертюнинг вашей модели DecisionTreeClassifier с помощью RandomizedSearchCV. Помните, что корректное определение работы каждого параметра влияет на общий успех применения модели в реальных условиях.