理解使用RandomForestClassifier的TreeInterpreter的输出

我已经应用了随机森林分类器来获取数据集中特定行贡献的特征。然而,我得到了两个特征值,而不是一个。我不太确定为什么会这样。以下是我的代码。

import numpy as npimport pandas as pdfrom sklearn.datasets import make_classificationfrom sklearn.ensemble import RandomForestClassifierfrom treeinterpreter import treeinterpreter as tifrom treeinterpreter import treeinterpreter as tiX, y = make_classification(n_samples=1000,                           n_features=6,                           n_informative=3,                           n_classes=2,                           random_state=0,                           shuffle=False)# Creating a dataFramedf = pd.DataFrame({'Feature 1':X[:,0],                                  'Feature 2':X[:,1],                                  'Feature 3':X[:,2],                                  'Feature 4':X[:,3],                                  'Feature 5':X[:,4],                                  'Feature 6':X[:,5],                                  'Class':y})y_train = df['Class']X_train = df.drop('Class',axis = 1)rf = RandomForestClassifier(n_estimators=50,                               random_state=0)rf.fit(X_train, y_train)print ("-"*20) importances = rf.feature_importances_indices = X_train.columnsinstances = X_train.loc[[60]]print(rf.predict(instances))print ("-"*20) prediction, biases, contributions = ti.predict(rf, instances)for i in range(len(instances)):    print ("Instance", i)    print ("-"*20)     print ("Bias (trainset mean)", biases[i])    print ("-"*20)     print ("Feature contributions:")    print ("-"*20)     for c, feature in sorted(zip(contributions[i],                                  indices),                              key=lambda x: ~abs(x[0].any())):        print (feature, np.round(c, 3))    print ("-"*20) 

这是我的代码的输出。有人能解释为什么偏差和特征输出两个值而不是一个吗?

--------------------[0]--------------------Instance 0--------------------Bias (trainset mean) [ 0.49854  0.50146]--------------------Feature contributions:--------------------Feature 1 [ 0.16 -0.16]Feature 2 [-0.024  0.024]Feature 3 [-0.154  0.154]Feature 4 [ 0.172 -0.172]Feature 5 [ 0.029 -0.029]Feature 6 [ 0.019 -0.019]

回答:

你得到长度为2的偏差和特征贡献数组的原因非常简单,因为你有一个2类分类问题。

正如包创建者在这篇博客文章中清楚解释的,在鸢尾花数据集的3类情况下,你会得到长度为3的数组(即每个类一个数组元素):

from treeinterpreter import treeinterpreter as tiimport numpy as npfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_irisiris = load_iris()rf = RandomForestClassifier(max_depth = 4)idx = range(len(iris.target))np.random.shuffle(idx)rf.fit(iris.data[idx][:100], iris.target[idx][:100])prediction, bias, contributions = ti.predict(rf, instance)print "Prediction", predictionprint "Bias (trainset prior)", biasprint "Feature contributions:"for c, feature in zip(contributions[0],                              iris.feature_names):    print feature, c

这将给出:

Prediction [[ 0. 0.9 0.1]]Bias (trainset prior) [[ 0.36 0.262 0.378]]Feature contributions:sepal length (cm) [-0.1228614 0.07971035 0.04315104]sepal width (cm) [ 0. -0.01352012 0.01352012]petal length (cm) [-0.11716058 0.24709886 -0.12993828]petal width (cm) [-0.11997802 0.32471091 -0.20473289]

公式

prediction = bias + feature_1_contribution + ... + feature_n_contribution

来自TreeInterpreter适用于分类问题中的每个类;因此,对于k类分类问题,相应的数组将长度为k(在你的例子中k=2,而对于鸢尾花数据集k=3)。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注