Невозможно интерпретировать дерево решений при использовании class_weights - PullRequest
1 голос
/ 22 марта 2019

Я работаю с несбалансированным набором данных. Я использую дерево решений (scikit-learn) для построения модели.
Для объяснения моей проблемы я взял набор данных радужной оболочки.

Когда я установил class_weight = Нет , я понял, как дерево назначает оценки вероятности, когда я использую Forex_Proba.
Когда я устанавливаю class_weight = 'сбалансированный' , я знаю, что он использует целевое значение для расчета весов классов, но я не могу понять, как дерево назначает оценки вероятности.

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 = 'сбалансированный' . Я получаю дерево ниже.

# 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]))

Я не могу понять (придумать формулу), как дерево назначает эти вероятности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...