Scikit learn Scikit Learn RandomizedSearchCV不适用于多项式中的前一类课程nb

Scikit learn Scikit Learn RandomizedSearchCV不适用于多项式中的前一类课程nb,scikit-learn,naivebayes,grid-search,Scikit Learn,Naivebayes,Grid Search,我试图在多项式nb(1)上进行随机参数优化。现在我的参数有3个而不是一个值,因为它是'class_prior',我有3个类 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), unif

我试图在多项式nb(1)上进行随机参数优化。现在我的参数有3个而不是一个值,因为它是'class_prior',我有3个类

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-->

是否不可能随机搜索一个包含3个成分的变量,即3个类的先验值


(1) 是的,这是可能的。这样做:

tuned_parameters = {'class_prior': [[uniform.rvs(0,3), uniform.rvs(0,3), 
uniform.rvs(0,3)]]}
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)],
                                    ...
                                    ...
                                    ... ]}
请注意,这些值周围有额外的方括号。 原因是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
Option1: 'class_prior': [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)]
这意味着估计值将拟合4次(每次使用上述不同的选项),然后保留最佳估计值

在您的例子中,根据
类,prior
是类的概率数组

因此,理想情况下,应将其扩展为:

tuned_parameters = {'class_prior': [[uniform.rvs(0,3), uniform.rvs(0,3), 
uniform.rvs(0,3)]]}
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)],
                                    ...
                                    ...
                                    ... ]}
选项1:‘优先等级’:[uniform.rvs(0,3)、uniform.rvs(0,3)、uniform.rvs(0,3)]

但在RandomizedSearcv中(没有关于之前类的类型的信息),它将扩展为:

Option1: 'class_prior': uniform.rvs(0,3)
Option2: 'class_prior': uniform.rvs(0,3)
Option3: 'class_prior': uniform.rvs(0,3)
然后将其呈现给多项式nb,因为
uniform.rvs()
的输出是一个浮点而不是一个列表,所以它不会有
len()
,因此也不会有错误

为此,需要使用双方括号,以便按如下方式进行正确的展开:

Option1:- 'kernel':'linear', 'C':1
Option2:- 'kernel':'linear', 'C':10
Option3:- 'kernel':'rbf', 'C':1
Option4:- 'kernel':'rbf', 'C':10
Option1: 'class_prior': [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)]
但现在也有一个问题。因为扩展导致了一个选项,所以很明显,无论分数是多少,都会选择它(因为我们没有其他选择)

此外,RandomizedSearchCV将抛出一个错误,因为您指定了
n_iter=10
,并且选择的数量应该超过这个数量(在我们的例子中,这是一个单一的选择)

因此,您需要像这样更改
调优的_参数

tuned_parameters = {'class_prior': [[uniform.rvs(0,3), uniform.rvs(0,3), 
uniform.rvs(0,3)]]}
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\u iter
次。

是的,这是可能的。这样做:

tuned_parameters = {'class_prior': [[uniform.rvs(0,3), uniform.rvs(0,3), 
uniform.rvs(0,3)]]}
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)],
                                    ...
                                    ...
                                    ... ]}
请注意,这些值周围有额外的方括号。 原因是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
Option1: 'class_prior': [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)]
这意味着估计值将拟合4次(每次使用上述不同的选项),然后保留最佳估计值

在您的例子中,根据
类,prior
是类的概率数组

因此,理想情况下,应将其扩展为:

tuned_parameters = {'class_prior': [[uniform.rvs(0,3), uniform.rvs(0,3), 
uniform.rvs(0,3)]]}
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)],
                                    ...
                                    ...
                                    ... ]}
选项1:‘优先等级’:[uniform.rvs(0,3)、uniform.rvs(0,3)、uniform.rvs(0,3)]

但在RandomizedSearcv中(没有关于之前类的类型的信息),它将扩展为:

Option1: 'class_prior': uniform.rvs(0,3)
Option2: 'class_prior': uniform.rvs(0,3)
Option3: 'class_prior': uniform.rvs(0,3)
然后将其呈现给多项式nb,因为
uniform.rvs()
的输出是一个浮点而不是一个列表,所以它不会有
len()
,因此也不会有错误

为此,需要使用双方括号,以便按如下方式进行正确的展开:

Option1:- 'kernel':'linear', 'C':1
Option2:- 'kernel':'linear', 'C':10
Option3:- 'kernel':'rbf', 'C':1
Option4:- 'kernel':'rbf', 'C':10
Option1: 'class_prior': [uniform.rvs(0,3), uniform.rvs(0,3), uniform.rvs(0,3)]
但现在也有一个问题。因为扩展导致了一个选项,所以很明显,无论分数是多少,都会选择它(因为我们没有其他选择)

此外,RandomizedSearchCV将抛出一个错误,因为您指定了
n_iter=10
,并且选择的数量应该超过这个数量(在我们的例子中,这是一个单一的选择)

因此,您需要像这样更改
调优的_参数

tuned_parameters = {'class_prior': [[uniform.rvs(0,3), uniform.rvs(0,3), 
uniform.rvs(0,3)]]}
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\u iter