Вопрос или проблема
У меня есть следующая ошибка: 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
для построения дерева решений.
Предложения по коду:
-
Измените строку определения
labels
на следующую:labels = inputs_n.columns.tolist()
-
Убедитесь, что вы передаете правильный массив классов в аргумент
class_names
. В вашем случае это может быть вывод уникальных значений из столбцаtarget
, например:class_names = target.unique().astype(str)
-
После внесения изменений ваш код должен выглядеть так:
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
. Это повысит качество вашего анализа данных и сделает ваш код более надежным.