scikit-learn 虚拟分类器的理论基础是什么?

What is the theorical foundation for scikit-learn dummy classifier?

通过documentation,我读到可以使用虚拟分类器针对分类算法对其进行测试。

This classifier is useful as a simple baseline to compare with other (real) classifiers. Do not use it for real problems.

虚拟分类器在使用分层方法时做了什么。我知道文档说:

generates predictions by respecting the training set’s class distribution.

谁能给我一个更理论化的解释,说明为什么这是分类器性能的证明?

虚拟分类器可以衡量 "baseline" 性能——即即使只是猜测,也应该期望达到的成功率。

假设您希望确定给定对象是否拥有某个 属性。如果您已经分析了大量这些对象并发现 90% 包含目标 属性,那么猜测该对象的每个未来实例都拥有目标 属性 会给您 90% 的猜测可能性正确。以这种方式构建您的猜测等同于在您引用的文档中使用 most_frequent 方法。

由于许多机器学习任务试图提高(例如)分类任务的成功率,因此评估基线成功率可以为一个分类器应该超越的最小值提供一个底值。在上面讨论的假设中,您希望您的分类器获得超过 90% 的准确率,因为 90% 是甚至 "dummy" 个分类器可用的成功率。

如果使用上述数据训练具有 stratified 参数的虚拟分类器,该分类器将预测它遇到的每个对象都有 90% 的概率拥有目标 属性。这不同于使用 most_frequent 参数训练虚拟分类器,因为后者会猜测 所有 未来对象拥有目标 属性。下面是一些代码来说明:

from sklearn.dummy import DummyClassifier
import numpy as np

two_dimensional_values = []
class_labels           = []

for i in xrange(90):
    two_dimensional_values.append( [1,1] )
    class_labels.append(1)

for i in xrange(10):
    two_dimensional_values.append( [0,0] )
    class_labels.append(0)

#now 90% of the training data contains the target property
X = np.array( two_dimensional_values )
y = np.array( class_labels )

#train a dummy classifier to make predictions based on the most_frequent class value
dummy_classifier = DummyClassifier(strategy="most_frequent")
dummy_classifier.fit( X,y )

#this produces 100 predictions that say "1"
for i in two_dimensional_values:
    print( dummy_classifier.predict( [i]) )

#train a dummy classifier to make predictions based on the class values
new_dummy_classifier = DummyClassifier(strategy="stratified")
new_dummy_classifier.fit( X,y )

#this produces roughly 90 guesses that say "1" and roughly 10 guesses that say "0"
for i in two_dimensional_values:
    print( new_dummy_classifier.predict( [i]) )

Dummy Classifier 的一个主要动机是 F 分数,当正面 class 占少数(即不平衡 classes)。此 classifier 用于实际 classifier 的健全性测试。实际上,dummy classifier 完全忽略了输入数据。在 'most frequent' 方法的情况下,它检查最频繁标签的出现。

使用Doc为了说明DummyClassifier,首先让我们创建一个不平衡的数据集:

>>>
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> y[y != 1] = -1
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

接下来,让我们比较一下SVC和most_frequent的准确率:

>>>
>>> from sklearn.dummy import DummyClassifier
>>> from sklearn.svm import SVC
>>> clf = SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test) 
0.63...

>>> clf = DummyClassifier(strategy='most_frequent',random_state=0)
>>> clf.fit(X_train, y_train)
DummyClassifier(constant=None, random_state=0, strategy='most_frequent')
>>> clf.score(X_test, y_test)  
0.57...

我们看到 SVC 并不比虚拟分类器好多少。现在,让我们更改内核:

>>>
>>> clf = SVC(gamma='scale', kernel='rbf', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)  
0.97...

我们看到准确率提高到几乎 100%。所以这样更好。