2017-09-27 40 views
0

我想在MultinomialNB(1)上进行随机化参数优化。现在我的参数有3个,而不是一个值,因为它是'class_prior',而且我有3个类。Scikit学习RandomizedSearchCV不适用于MultinomialNB中的class_prior

from sklearn.naive_bayes import MultinomialNB 
from sklearn.grid_search import RandomizedSearchCV 
from scipy.stats import uniform 

tuned_parameters = {'class_prior': [uniform.rvs(0,3), uniform.rvs(0,3), 
uniform.rvs(0,3)]} 
clf = RandomizedSearchCV(MultinomialNB(), tuned_parameters, cv=3, 
scoring='f1_micro', n_iter=10) 

然而,错误日志的样子:

... 
File "/home/mark/Virtualenvs/python3env2/lib/python3.5/site- 
packages/sklearn/naive_bayes.py", line 607, in fit 
self._update_class_log_prior(class_prior=class_prior) 
File "/home/mark/Virtualenvs/python3env2/lib/python3.5/site- 
packages/sklearn/naive_bayes.py", line 455, in _update_class_log_prior 
if len(class_prior) != n_classes: 
TypeError: object of type 'numpy.float64' has no len() 

也试图消除.rvs - >

TypeError: object of type 'rv_frozen' has no len() 

是不可能RandomizeSearch,拥有3个部件的变量,即3个class_priors?

(1)http://scikit-learn.org/stable/modules/grid_search.html

回答

2

是其可能的。这样做:

tuned_parameters = {'class_prior': [[uniform.rvs(0,3), uniform.rvs(0,3), 
uniform.rvs(0,3)]]} 

请注意值周围的额外方括号。 原因是,要由RandomizedSearchCV(或GridSearchCV)调整的参数应该被包装在一个列表中,每次都会尝试一个元素。将保留产生最高分数(或最低损失情况下)的元素组合。

例如参见SVC的参数调谐这个简单的代码:

parameters = {'kernel':['linear', 'rbf'], 'C':[1, 10]} 

这将被扩展成总共4个值的置换象下面这样:

Option1:- 'kernel':'linear', 'C':1 
Option2:- 'kernel':'linear', 'C':10 
Option3:- 'kernel':'rbf', 'C':1 
Option4:- 'kernel':'rbf', 'C':10 

这意味着估计器将适合4次(每次使用上面的不同选项),然后保留最佳评估者。

在你的情况下,根据documentation of MultinomialNBclass_prior是类的概率数组。

因此理想情况下,应扩大到这样的:

选项一: 'class_prior':[uniform.rvs(0,3),uniform.rvs(0,3),uniform.rvs(0,3 )]

但在RandomizedSearhCV(其中没有关于class_prior的类型的信息),将像扩展:

Option1: 'class_prior': uniform.rvs(0,3) 
Option2: 'class_prior': uniform.rvs(0,3) 
Option3: 'class_prior': uniform.rvs(0,3) 

这将在随后呈现给MultinomialNB并且由于uniform.rvs()输出是浮点而不是一个列表,它不会有len(),因此错误。

对于这一点,你需要使用双括号,以便正确的扩展像下面做:

Option1: 'class_prior': [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)] 

但现在也有一个问题。由于扩展导致了一个选项,很明显,无论分数是多少(因为我们没有其他选择)。

另外,RandomizedSearchCV会抛出一个错误,因为你已经指定了n_iter=10,并且选择的数量应该多于(在我们的例子中,它是单一选择)。

所以,你需要改变你的tuned_parameters这样的:

tuned_parameters = {'class_prior': [[uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)], 
            [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)], 
            [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)], 
            [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)], 
            [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)], 
            ... 
            ... 
            ... ]} 

至少n_iter倍。