使用 class_weights 时无法解释决策树

数据挖掘 机器学习 Python scikit-学习 预测建模 决策树
2022-02-10 13:18:39

我正在使用不平衡的数据集。我正在使用决策树(scikit-learn)来构建模型。
为了解释我的问题,我使用了 iris 数据集。

当我设置class_weight=None时,我了解了当我使用 predict_proba 时树是如何分配概率分数的。
当我设置class_weight='balanced'时,我知道它使用目标值来计算类权重,但我无法理解树是如何分配概率分数的。

import sklearn.datasets as datasets
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

from sklearn.externals.six import StringIO  
from IPython.display import Image  
from sklearn.tree import export_graphviz
import pydotplus

iris=datasets.load_iris()
df=pd.DataFrame(iris.data, columns=iris.feature_names)
y=iris.target

X_train, X_test, y_train, y_test = train_test_split(df, y, test_size=0.33, random_state=1)

# class_weight=None
dtree=DecisionTreeClassifier(max_depth=2)
dtree.fit(X_train,y_train)

dot_data = StringIO()
export_graphviz(dtree, out_file=dot_data, filled=True, rounded=True, special_characters=True, feature_names=X_train.columns)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
Image(graph.create_png()) # I use jupyter-notebook for visualizing the image

当 class_weight=None 时的树

# printing unique probabilities in each class
probas = dtree.predict_proba(X_train)
print(np.unique(probas[:,0]))
print(np.unique(probas[:,1]))
print(np.unique(probas[:,2]))

# ratio for calculating probabilities
print(0/33, 0/34, 33/33)
print(0/33, 1/34, 30/33)
print(0/33, 3/33, 33/34)

树分配的概率和我的比率(通过查看树图像确定)是匹配的。

当我使用选项时class_weights='balanced'我得到下面的树。

# class_weight='balanced' 
dtree_balanced=DecisionTreeClassifier(max_depth=2, class_weight='balanced')
dtree_balanced.fit(X_train,y_train)

dot_data = StringIO()
export_graphviz(dtree_balanced, out_file=dot_data,filled=True, rounded=True, special_characters=True, feature_names=X_train.columns)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
Image(graph.create_png())

当 class_weight='balanced' 时的树

我正在使用以下代码打印唯一概率

probas = dtree_balanced.predict_proba(X_train)
print(np.unique(probas[:,0]))
print(np.unique(probas[:,1]))
print(np.unique(probas[:,2]))

我无法理解(想出一个公式)树是如何分配这些概率的。

1个回答

我们应该考虑两点。一、class_weight='balanced'不改变一个类的实际样本数,只改变类的权重wci被改变。二、类的[un-normalized]概率ci在每个节点计算为

wcix(来自的样本数ci在那个节点/大小ci)

例如,在平衡模式下,[未归一化的]概率c3在绿叶中计算为

33.3¯%×(3/36)2.778%

相比36%×(3/36)=3%在不平衡模式下。

平衡模式下的概率(归一化)为:

100×2.778/(2.778+32.258)%=7.9289%

备注“概率”一词不适用于除根节点之外的每个孤立节点。这是用于对叶子内的数据点进行分类的概率的未归一化版本,尽管比较不需要归一化。但是,该概念适用于同一级别的节点的聚合和上层的叶子(即所有样本的集合)。