具有RandomizedSearchCV的Sklearn OneClassSVM:“ ValueError:'f'不在列表中”

时间:2019-05-02 14:34:39

标签: python scikit-learn

我正在尝试训练一类SVM以进行异常检测。我想使用随机搜索来调整模型。

我设置了模型参数的范围。但是,我收到此错误,但未能找到其原因。 ValueError:“ f”不在列表中

加载数据和相关库之后。我指定了SVM模型的详细信息,如下所示:

param_dist = {"kernel":"rbf",
              "gamma" : np.logspace(-9, 3, 13),
              "nu" : np.linspace(0.01, 0.99, 99)}
clf = svm.OneClassSVM()

clf_cv = RandomizedSearchCV(estimator  = clf, param_distributions = param_dist,  scoring = "accuracy")

值得注意的是,我的训练数据的大小为(500000,5)。

当我尝试训练模型时,

clf_cv.fit(Xtrain)

我收到以下错误


*My directory*\lib\site-packages\sklearn\svm\base.py in _dense_fit(self, X, y, sample_weight, solver_type, kernel, random_seed)
    252                 cache_size=self.cache_size, coef0=self.coef0,
    253                 gamma=self._gamma, epsilon=self.epsilon,
--> 254                 max_iter=self.max_iter, random_seed=random_seed)
    255 
    256         self._warn_from_fit_status()

sklearn\svm\libsvm.pyx in sklearn.svm.libsvm.fit()

ValueError: 'f' is not in list

我试图找出错误的原因,但仍然无法找出原因。

非常感谢。

1 个答案:

答案 0 :(得分:1)

问题出在您的param_distributions上。如RandomizedSearchCV的文档所述:

  

param_distributions:字典   以参数名称(字符串)为键的字典,并尝试使用分布或参数列表。发行版必须提供rvs方法进行采样(例如scipy.stats.distributions中的样本)。如果列出了列表,则会对其进行统一采样。

基本上,param_distributions中的所有值都必须是列表或rvs方法。因此,在这种情况下,kernel的值应为['rbf']而不是'rbf'

看到ValueError: 'f' is not in list的原因是字符串'rbf'被拆分为'r','b','f',并且在调用fit时将f传递为内核的值。在svm的内部,调用sklearn.svm.libsvm.fit。您可以在第170行看到的检查是在可用内核列表中查找内核。这就是错误的真正来源。