Как построить графическое дерево решений с обратными преобразованиями (фактическими)?

Я использую Graphviz для построения дерева решений классификации.

прежде чем соответствовать функциям, я использую "preprocessing.StandardScaler()", чтобы масштабировать их

поэтому, когда я строю дерево решений, я строю его на основе "преобразованных значений"

Есть ли способ "inverse_trasform" классификатор, прежде чем строить его так, чтобы дерево решений отображало фактические значения в узлах, а не преобразованные?

да, я пробовал scale.inverse_transform (rf_clf) .... но, конечно, не теряю...

Импортируйте набор данных из sklearn.datasets

iris = datasets.load_iris()

Создать фрейм данных из словаря

species = [iris.target_names[x] for x in iris.target]
iris = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris['Species'] = species

преобразование в массивы

Features = np.array(iris[['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']])

levels = {'setosa':0, 'versicolor':1, 'virginica':2}
Labels =  np.array([levels[x] for x in iris['Species']])

расщепление

nr.seed(1115)
indx = range(Features.shape[0])
indx = ms.train_test_split(indx, test_size = 100)
X_train = Features[indx[0],:]
y_train = np.ravel(Labels[indx[0]])
X_test = Features[indx[1],:]
y_test = np.ravel(Labels[indx[1]])

масштабирование:

scale = preprocessing.StandardScaler()
scale.fit(X_train)
X_train = scale.transform(X_train)

примерка классификатора

rf_clf = tree.DecisionTreeClassifier() ###simple TREE
rf_clf.fit(X_train, y_train)*

построение дерева решений с графиком:

dot_data = tree.export_graphviz(rf_clf, out_file=None, 

             feature_names=['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'], 
             class_names=['setosa', 'versicolor', 'virginica'], 

                 filled=True, rounded=True,  
                 special_characters=True)

print(dot_data)

graph = graphviz.Source(dot_data)  
graph 

результаты первого узла - "Petal_width<= 0.53", а второй узел - "длина лепестка <= -0.788", что является отрицательным показателем реальной величины.

Я бы предпочел, чтобы дерево имело реальную стоимость в дюймах...

0 ответов

Вы можете пройти по дереву и самостоятельно установить значение порога узла.

Если вы рассмотрите этот пример для обхода дерева: https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html

Где говорится print("%snode=%s test node: go to node %s if X[:, %s] <= %s else to node %s."...Вы можете переписать порог и использовать функцию inverse_transform масштабатора для тестируемой функции.

transformed = np.empty(X_train.shape[1])
transformed[:] = np.nan
transformed[feature[i]] = threshold[i]
threshold[i] = scale.inverse_transform(transformed)[feature[i]]

Ваш сгенерированный точечный файл будет содержать обновленные значения. Однако вы больше не сможете использовать дерево для прогнозирования с масштабированными функциями.

Примечание: значение порога не совсем то же самое, что и без масштабирования, я не уверен, должен ли масштабатор влиять на порог таким образом.

Другие вопросы по тегам