我正在使用graphviz绘制分类决策树。
在适应这些功能之前,我使用“ preprocessing.StandardScaler()”来缩放它们
因此,当我绘制决策树时,我会基于“转换后的值”对其进行绘制
有没有一种方法可以在对分类器进行绘制之前对其进行“逆变换”,以便决策树在节点上而不是在转换后的节点上绘制实际值?
是的,我已经尝试过scale.inverse_transform(rf_clf)....但当然不要烦恼...
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 :(得分:0)
您可以遍历树并自行设置节点阈值。
上面写着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]]
您生成的点文件将包含更新的值。不过,您将无法再使用带有缩放功能的树进行预测。
注意:阈值的值与不进行缩放时不完全相同,我不确定缩放器是否会对阈值产生这样的影响。