Почему-то появляется странная ошибка при гипернастройке моей модели.

Вопрос или проблема

Я надеялся настроить мою модель 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 ожидает, что будет выборка из какого-то набора значений.

Применение

Теперь давайте рассмотрим, что вы можете сделать для решения этой проблемы:

  1. Изменение формата параметров распределений. Убедитесь, что randint или другие распределения, будут обернуты как минимум в списки:
param_dist = {
    "max_depth": [3, None],
    "max_features": [randint(1, 9)],
    "min_samples_leaf": [randint(1, 9)],
    "criterion": ["gini", "entropy"]
}
  1. Проверка на импорт. Если ошибка всё еще возникает, убедитесь, что все импорты выполнены корректно и версии библиотек такие, где их методы поддерживают указанные параметры. Возможно необходимо обновить библиотеки или проверить код на предмет устаревших функций.

  2. Печать отладки. Для большей уверенности можно внедрить промежуточную печать значений перед их использованием в методах, что позволит убедиться в их корректности (типах и содержаниях), которые передаются в RandomizedSearchCV.

  3. Документация. Не забывайте обращаться к официальной документации библиотеки, чтобы убедиться в актуальности используемых параметров и их значениях; так можно избежать ошибок из-за изменений в API библиотеки.

Такие шаги должны помочь устранить возникшую проблему и правильно выполнить гипертюнинг вашей модели DecisionTreeClassifier с помощью RandomizedSearchCV. Помните, что корректное определение работы каждого параметра влияет на общий успех применения модели в реальных условиях.

Оцените материал
Добавить комментарий

Капча загружается...