根据我阅读的文档,可以使用伪分类器来测试分类算法。
这个分类器作为一个简单的基线很有用,可以与其他分类器进行比较(真实的)分类器。不要把它用于实际问题。
当伪分类器使用分层方法时,它会做什么。我知道文档摘要上说:
通过尊重训练集的类生成预测分配
有人能给我一个更理论的解释,为什么这是分类器性能的证明吗?。
伪分类器为您提供了"基线"性能的衡量标准,即即使只是猜测,也应该达到的成功率。
假设您希望确定给定对象是否拥有某个属性。如果您分析了大量这些对象,并发现90%的对象包含目标属性,那么猜测该对象的每个未来实例都具有目标属性,则猜测正确的可能性为90%。以这种方式构建您的猜测相当于在您引用的文档中使用most_frequent
方法。
由于许多机器学习任务试图提高(例如)分类任务的成功率,因此评估基线成功率可以为分类器应该执行的最小值提供下限值。在上面讨论的假设中,您希望您的分类器获得90%以上的准确率,因为90%是即使是"伪"分类器也能获得的成功率。
如果使用上述数据训练具有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]) )
当正类为少数(即不平衡类)时,伪分类器的主要动机是F-score。该分类器用于实际分类器的健全性测试。实际上,伪分类器完全忽略了输入数据。在"最频繁"方法的情况下,它会检查最频繁标签的出现情况。
使用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_frequency:的准确性
>>>
>>> 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%。所以这更好。