Я получил следующую ошибку: у объекта ‘DataFrame’ нет атрибута ‘data’. Можете помочь, пожалуйста?

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

У меня есть следующая ошибка: AttributeError: 'DataFrame' object has no attribute 'feature_names'

Буду признателен за вашу помощь

from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn import tree
from sklearn.datasets import load_wine
from IPython.display import SVG
from graphviz import Source
from IPython.display import display                               
from ipywidgets import interactive
import pandas as pd

df1 = pd.read_csv("/Users/dean/Desktop/AI TECNOMATIX EXCEL/cartest1.csv")
#print(df1)
inputs = df1.drop('StatNumOut',axis="columns")
target = df1['StatNumOut']
from sklearn.preprocessing import LabelEncoder
le_company = LabelEncoder()
le_job = LabelEncoder()
le_degree = LabelEncoder()
inputs['name_n'] = le_company.fit_transform(inputs['name'])
inputs['MachineAvailability_n'] = le_company.fit_transform(inputs['MachineAvailability'])
inputs['MachineExitLocked_n'] = le_job.fit_transform(
    inputs['MachineExitLocked'])
inputs['MachineEntranceLocked_n'] = le_degree.fit_transform(
    inputs['MachineEntranceLocked'])
inputs['MachineMTTR_n'] = le_degree.fit_transform(inputs['MachineMTTR'])
inputs['StatNumIn_n'] = le_degree.fit_transform(inputs['StatNumIn'])
inputs_n = inputs.drop(['name',
                        'MachineAvailability',
                        'MachineEntranceLocked',
                        'MachineExitLocked',
                        'MachineMTTR',
                        'StatNumIn'],
                       axis="columns")
inputs_n
target

model.score(inputs_n,target)

labels = df1.feature_names
def plot_tree(crit, split, depth, min_split, min_leaf=0.2):
    estimator = DecisionTreeClassifier(random_state = 0 
       , criterion = crit
       , splitter = split
       , max_depth = depth
       , min_samples_split=min_split
       , min_samples_leaf=min_leaf)
    estimator.fit(inputs_n, target)
    graph = Source(tree.export_graphviz(estimator
       , out_file=None
       , feature_names=labels
       , class_names=['0', '1', '2']
       , filled = True))

    display(SVG(graph.pipe(format="svg")))
    return estimator

inter=interactive(plot_tree,
                  crit = ["gini", "entropy"],
                  split = ["best", "random"],
                  depth=[1,2,3,4],
                  min_split=(0.1,1),
                  min_leaf=(0.1,0.5))
display(inter)
```

Как указано в сообщении об ошибке, объект pandas.DataFrame не имеет атрибута с именем feature names. Вероятно, вы имели в виду что-то вроде df1.columns.

метка не определена, результат получается
при использовании
feature_names=labels[:-1]

.

Ответ или решение

Ошибка, с которой вы столкнулись, связана с тем, что вы пытаетесь получить атрибут feature_names у объекта DataFrame pandas. Ваша строка кода:

labels = df1.feature_names

вызывает ошибку, поскольку pandas DataFrame не имеет атрибута feature_names. Вместо этого, если вам нужно получить названия столбцов вашего DataFrame, вы можете использовать метод .columns. Таким образом, правильный код должен выглядеть следующим образом:

labels = inputs_n.columns.tolist()

Это создаст список названий всех столбцов в вашем преобразованном DataFrame inputs_n, который вы можете использовать в функции plot_tree для построения дерева решений.

Предложения по коду:

  1. Измените строку определения labels на следующую:

    labels = inputs_n.columns.tolist()
  2. Убедитесь, что вы передаете правильный массив классов в аргумент class_names. В вашем случае это может быть вывод уникальных значений из столбца target, например:

    class_names = target.unique().astype(str)
  3. После внесения изменений ваш код должен выглядеть так:

    labels = inputs_n.columns.tolist()
    class_names = target.unique().astype(str)
    
    graph = Source(tree.export_graphviz(estimator,
                                        out_file=None,
                                        feature_names=labels,
                                        class_names=class_names,
                                        filled=True))

Дополнительные рекомендации:

  • Убедитесь, что типы данных в вашем DataFrame корректны. Например, если ваши целевые значения (значения в target) являются строками, необходимо преобразовать их в числовые значения или использовать метод LabelEncoder для соответствующих категорий.
  • Постарайтесь избегать глобальных переменных и старайтесь передавать все необходимые данные через аргументы функций. Это улучшит читаемость вашего кода и упростит его отладку.

Следуя этим шагам, вы сможете избежать ошибки AttributeError и правильно визуализировать ваше дерево решений с использованием библиотеки graphviz. Это повысит качество вашего анализа данных и сделает ваш код более надежным.

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

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