决策树的分类报告参数(精度、召回率、f1 分数、支持)为 1.0

Posted

技术标签:

【中文标题】决策树的分类报告参数(精度、召回率、f1 分数、支持)为 1.0【英文标题】:classification_report parameters for decision trees (precision, recall, f1-score, support) coming as 1.0 【发布时间】:2020-01-21 03:49:16 【问题描述】:

我有一个包含 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 non-null int64)

性别(260616 非空对象)

类别(260616 非空对象)

子类别(260616 非空对象)

子品牌(260616 非空对象)

季节(260616 个非空对象)

FC_Type(260616 非空对象)

Order_Month(260616 非空 int64)

OLSC_Month(260616 非空 int64)

OLSC_Hour (260616 non-null int64)

Assignment_Hour (260616 non-null int64)

Assignment_Day_of_the_week(260616 个非空对象)

A2MPF (260616 non-null float64)

OLSC_Status(260616 非空对象)

OLSC_FC_Name 有 540 个唯一值和大约 26 个品牌值。

OLSC_Status 有两个值,也是我的分类因变量。

Here is the image of OLSC Status values mix in test and training set.

我选择了决策树模型作为开始,看看我是否能看到任何有意义的结果来提升一个档次。

我使用 Label Encoder 对所有分类变量进行编码,将 OLSC_Status 数据类型设为“类别”,以 70:30 的比例拆分测试列车,并使用 DecisionTreeClassifier 编写算法代码。

但是准确率、召回率、f1-score、支持度的分数都是 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())

Here is the image with the final decision tree

【问题讨论】:

我使用标签编码器将分类变量转换为数字标签。 le = preprocessing.LabelEncoder() df_categorical.apply(le.fit_transform) 检查feature_importances_ ,可能是一个变量可以正确分类您的数据。 【参考方案1】:

您能告诉我们更多目标值是多少吗?对于分类问题,您可以使用 LGBM,这有望给您带来更好的结果,并尝试对变量进行编码,而不是 LabelEncoder 使用 OneHotEncoder。如果您有 8 个类别,LabelEncoder 将更加重视 8 而不是 0。您可以进行更多调整正在更改 max_depth 的值或更小,然后查看结果。 希望对你有帮助!

【讨论】:

以上是关于决策树的分类报告参数(精度、召回率、f1 分数、支持)为 1.0的主要内容,如果未能解决你的问题,请参考以下文章

你能解释一下提供的例子中的分类报告(召回率和精度)吗?

第一次预测的精度、F 分数和召回率高

python实现计算精度召回率和F1值

F1 小于 Scikit-learn 中的精度和召回率

计算 rpart 包结果的精度、召回率、F1 值

一次性计算精度、召回率和 F 分数 - python