Параметрыification_report для деревьев решений (точность, отзыв, f1-оценка, поддержка), приходящаяся на 1,0 - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть датафрейм с 21 столбцом и 260616 строками.Я хотел построить модель классификации дерева решений для переменной состояния.Я очистил данные и превратил все переменные в правильные типы данных.Ниже приводится сводка всех столбцов в данных -

Столбцы данных (всего 21 столбец):

Бренд (260616 ненулевой объект)

Order_Line_Id (260616 ненулевой объект)

Order_Type (260616 ненулевой объект)

OLSC_FC_Name (260616 ненулевой объект)

FC_Id (260616 ненулевой объект)

OLSC_Day_Of_the_week (260616 ненулевой объект)

OLSAC_Reason (260616 ненулевой объект)

Inv_Qty (260616 ненулевой int64)

Пол (260616 ненулевой объект)

Категория (260616 ненулевой объект)

Подкатегория (260616 ненулевой объект)

SubBrand (260616 ненулевой объект)

Сезон (260616 ненулевой объект)

FC_Type (260616 ненулевой объект)

Order_Month (260616 ненулевой int64)

OLSC_Month (260616 ненулевой int64)

OLSC_Hour (260616 ненулевой int64)

Assignment_Hour (260616 ненулевой int64)

Assignment_Day_of_the_week (260616 ненулевой объект)

A2MPF (260616 ненулевой float64)

OLSC_Status (260616 ненулевой объект)

Я выбрал модель дерева решений в качестве начала, чтобы посмотреть, смогу ли я увидеть какой-либо значимый результат, чтобы поднять его на отметку.

Я закодировал все категориальные переменные, используя Label Encoder, сделал OLSC_Statusтип данных как «категория», разделить тестовую последовательность с соотношением 70:30 и записать код алгоритма с DecisionTreeClassifier.

Но оценки за точность, напомним, f1-оценка, поддержка были равны 1.0, что странно.

Дерево получило только два уровня.

И это совершенно неправильно.Мне нужна помощь в понимании, что я делаю не так?Кроме того, какой алгоритм является наиболее оптимальным для такой проблемы.

Ниже приведен код для алгоритма дерева решений, который я использовал.

# Splitting the data into train and test
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.30, 
                                                    random_state = 99)
X_train.head()

y_train.value_counts()

y_test.value_counts()

# Importing decision tree classifier from sklearn library
from sklearn.tree import DecisionTreeClassifier

# Fitting the decision tree with default hyperparameters, apart from
# max_depth which is 5 so that we can plot and read the tree.
dt_default = DecisionTreeClassifier(max_depth=10)
dt_default.fit(X_train, y_train)

# Let's check the evaluation metrics of our default model

# Importing classification report and confusion matrix from sklearn metrics
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

# Making predictions
y_pred_default = dt_default.predict(X_test)

# Printing classification report
print(classification_report(y_test, y_pred_default))

# Printing confusion matrix and accuracy
print(confusion_matrix(y_test,y_pred_default))
print(accuracy_score(y_test,y_pred_default))

# Importing required packages for visualization
from IPython.display import Image  
from sklearn.externals.six import StringIO  
from sklearn.tree import export_graphviz
import pydotplus, graphviz

# Putting features
features = list(df_ca.columns[1:])
features

# plotting tree with max_depth=10
dot_data = StringIO()  
export_graphviz(dt_default, out_file=dot_data,
                feature_names=features, filled=True,rounded=True)

graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
Image(graph.create_png())

Вотизображение с окончательным деревом решений

1 Ответ

0 голосов
/ 20 сентября 2019

Можете ли вы рассказать нам больше, что является целевым значением?Для классификации проблемы вы можете использовать LGBM, который, мы надеемся, даст вам лучший результат, и попытаться закодировать переменную не так, как LabelEncoder, вместо этого использовать OneHotEncoder. Если у вас есть 8 категорий, LabelEncoder придаст больше значения 8, чем 0. Еще одна настройка, которую вы можете сделатьменяет значение max_depth или меньше, а затем увидеть результат.Надеюсь, это поможет!

...