决策树的分类报告参数(精度、召回率、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的主要内容,如果未能解决你的问题,请参考以下文章