使用class_weights时无法解释决策树

时间:2019-03-22 13:30:30

标签: python machine-learning scikit-learn decision-tree

我正在处理不平衡的数据集。我正在使用决策树(scikit-learn)建立模型。
为解释我的问题,我使用了虹膜数据集。

当我设置 class_weight = None 时,我了解了当我使用dict_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

tree when 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())

tree when 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]))

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

0 个答案:

没有答案
相关问题