scikit-learn 虚拟分类器的理论基础是啥?
Posted
技术标签:
【中文标题】scikit-learn 虚拟分类器的理论基础是啥?【英文标题】:What is the theorical foundation for scikit-learn dummy classifier?scikit-learn 虚拟分类器的理论基础是什么? 【发布时间】:2015-06-09 02:51:57 【问题描述】:documentation 我读到一个虚拟分类器可用于根据分类算法对其进行测试。
此分类器可用作与其他分类器进行比较的简单基线 (真实的)分类器。不要将其用于实际问题。
虚拟分类器在使用分层方法时会做什么。我知道文档说:
通过尊重训练集的类别来生成预测 分布。
谁能给我一个更理论的解释,说明为什么这是分类器性能的证明?。
【问题讨论】:
【参考方案1】:虚拟分类器为您提供“基线”性能的衡量标准——即即使只是猜测,也应该期望达到的成功率。
假设您希望确定给定对象是否具有某种属性。如果您分析了大量这些对象并发现其中 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]) )
【讨论】:
感谢您的解释。那么分层方法呢?这种方法的基础是什么?有什么参考吗?。 我已经详细说明并添加了一些代码来说明。我希望这会有所帮助! 太棒了。谢谢你的解释! 我的荣幸。我很高兴它有所帮助。uniform
是如何工作的?无论训练集还是测试集的分布,它是否只是以相等的概率输出 0 或 1?【参考方案2】:
Dummy Classifier 的一个主要动机是 F-score,当正类占少数(即不平衡类)时。该分类器用于实际分类器的健全性测试。实际上,虚拟分类器完全忽略了输入数据。在“最频繁”方法的情况下,它检查最频繁标签的出现。
【讨论】:
【参考方案3】:使用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%。所以这个比较好。
【讨论】:
这并没有提供问题的答案,这是关于它背后的理论;欢迎演示,但它们应伴随所要求的理论方面,而不是单独提供。以上是关于scikit-learn 虚拟分类器的理论基础是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 scikit-learn 中获得二元概率分类器的最大准确度
如何获得 scikit-learn SVM 分类器的所有 alpha 值?
scikit-learn 的 VotingClassifier 中使用的分类器是啥?
scikit-learn 中为文本分类排列文本数据的标准方法是啥?
在 scikit-learn 库中使用 sgd 求解器的 SGDClassifier 与 LogisticRegression