如何计算 DecisionTreeClassifier 的 0-1 确定性分数?

Posted

技术标签:

【中文标题】如何计算 DecisionTreeClassifier 的 0-1 确定性分数?【英文标题】:How to calculate an 0-1 certainty score for DecisionTreeClassifier? 【发布时间】:2019-10-14 23:53:51 【问题描述】:

数据集 0-9 列:浮动特征(产品的参数) 10 列:int 标签(产品)

目标

    计算标签的 0-1 分类确定性分数(这是我当前的代码应该做的)

    为每行的每个“product_name”(300 列)计算相同的确定性分数(22'000)

错误我使用 sklearn.tree.DecisionTreeClassifier。 我正在尝试使用“predict_proba”,但它给出了一个错误。

Python 代码

data_train = pd.read_csv('data.csv')
features = data_train.columns[:-1]
labels = data_train.columns[-1]
x_features = data_train[features]
x_label = data_train[labels]
X_train, X_test, y_train, y_test = train_test_split(x_features, x_label, random_state=0)
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

clf = DecisionTreeClassifier(max_depth=3).fit(X_train, y_train)
class_probabilitiesDec = clf.predict_proba(y_train) 
#ERORR: ValueError: Number of features of the model must match the input. Model n_features is 10 and input n_features is 16722 


print('Decision Tree Classification Accuracy Training Score (max_depth=3): :.2f'.format(clf.score(X_train, y_train)*100) + ('%'))
print('Decision Tree Classification Accuracy Test Score (max_depth=3): :.2f'.format(clf.score(X_test, y_test)*100) + ('%'))

print(class_probabilitiesDec[:10])
# if I use X_tranin than it jsut prints out a buch of 41 element vectors: [[ 0.00490808  0.00765327  0.01123035  0.00332751  0.00665502  0.00357707
   0.05182597  0.03169453  0.04267532  0.02761833  0.01988187  0.01281091
   0.02936528  0.03934781  0.02329257  0.02961484  0.0353548   0.02503951
   0.03577073  0.04700108  0.07661592  0.04433907  0.03019715  0.02196157
   0.0108976   0.0074869   0.0291989   0.03951418  0.01372598  0.0176358
   0.02345895  0.0169703   0.02487314  0.01813493  0.0482489   0.01988187
   0.03252641  0.01572249  0.01455786  0.00457533  0.00083188]
 [....

特征(列)

(最后一列是标签) 0 1 1 1 1.0 1462293561 1462293561 0 0 0.0 0.0 1 1 2 2 2 8.0 1460211580 1461091152 1 1 0.0 0.0 2 2 3 3 3 1.0 1469869039 1470560880 1 1 0.0 0.0 3 3 4 4 4 1.0 1461482675 1461482675 0 0 0.0 0.0 4 4 5 5 5 5.0 1462173043 1462386863 1 1 0.0 0.0 5

分类列(300 列项目)

标题行:apple gameboy 电池 .... 第一行得分:0.763 0.346 0.345 .... 第二行得分:0.256 0.732 0.935 ....

ex.:当某人对猫 VS 进行图像分类时使用的相似分数。狗和分类给出置信度分数。

【问题讨论】:

什么叫 0-1 确定性分数? 0 到 1 之间的实数 例如:0.753 或 0.001 predict_proba 会这样,有什么问题? 正如我所提到的,我正在使用 predict_proba,我不确定要使用什么,但我有明确的目标。计算每行中每个“product_name”(300 列)的确定性分数(22'000) 抱歉,我还是不明白实际的问题是什么,你需要弄清楚,否则没人能回答你的问题。如果您有错误,您必须将它们包含在您的问题中。 【参考方案1】:

您无法预测标签出现的概率。

predict_proba 从您的 X 数据中预测每个标签的概率,因此:

class_probabilitiesDec = clf.predict_proba(X_test) 

您发布的内容为“当我使用 X_train 时”:

[[ 0.00490808  0.00765327  0.01123035  0.00332751  0.00665502  0.00357707
   0.05182597  0.03169453  0.04267532  0.02761833  0.01988187  0.01281091
   0.02936528  0.03934781  0.02329257  0.02961484  0.0353548   0.02503951
   0.03577073  0.04700108  0.07661592  0.04433907  0.03019715  0.02196157
   0.0108976   0.0074869   0.0291989   0.03951418  0.01372598  0.0176358
   0.02345895  0.0169703   0.02487314  0.01813493  0.0482489   0.01988187
   0.03252641  0.01572249  0.01455786  0.00457533  0.00083188]

是每个可能标签为真的概率的列表。

编辑

阅读您的 cmets 后,预测 proba 正是您想要的。

让我们举个例子。在下面的代码中,我们有一个包含 3 个类的分类器:11、12 或 13。

如果输入为 1,分类器应预测为 11

如果输入是 2,分类器应该预测 12

...

如果输入是 7,分类器应该预测 13

clf = DecisionTreeClassifier()
clf.fit([[1],[2],[3],[4],[5],[6],[7]], [[11],[12],[13],[13],[12],[11],[13]])

现在,如果您有单行的测试数据,例如5 比分类器应该预测的 12 多。所以让我们试试吧。

clf.predict([[5]])

瞧:结果是array([12])

如果我们想要一个概率,那么预测 proba 是要走的路:

clf.predict_proba([[5]])

我们得到[array([0., 1., 0.])]

在这种情况下,数组[0., 1., 0.] 表示:

第 11 类的概率为 0%

12 类的概率为 100%

第 13 类的概率为 0%

如果我是正确的,那正是你想要的。 您甚至可以将其映射到您的类的名称:

probabilities = clf.predict_proba([[5]])[0]
clf.classes_[i] : probabilities[i] for i in range(len(probabilities))

它为您提供了一个包含类名概率的字典:

11: 0.0, 12: 1.0, 13: 0.0

现在,在您的情况下,您的类比 [11,12,13] 多得多,因此数组变得更长。并且对于数据集中的每一行 predict_proba 创建一个数组,因此对于多于一行的数据,您的输出变成一个矩阵。

【讨论】:

不如为每行的每个“product_name”(300 列)计算 0-1 确定性分数(22'000) 试试 clf.predict(X_test) 它给了我一大堆数组([21, 7, 21, 21, 7,... 看起来与标签和特征都不相似的东西。 21 是您的第一个数据行的结果,7 是您的第二个数据行的结果。因此,在您的第一行数据中,21 为 True,其余可能的标签为 False。希望它有所帮助,否则尝试发布一个带有小数据集、输入和预期输出的示例 我需要为每行(22'000)的每个“product_name”(300 列)计算 0-1 确定性分数

以上是关于如何计算 DecisionTreeClassifier 的 0-1 确定性分数?的主要内容,如果未能解决你的问题,请参考以下文章

计算机快速计算,2^N是如何实现的?

如何打开、关闭计算机的9090端口?

如何进行两台计算机并行计算

无论计算模式如何,您将如何编写手动计算的 excel udf?

如何计算Flink集群规模:信封背计算法

Java如何取得计算机硬件信息么