【问题标题】:Sklearn OneClassSVM with RandomizedSearchCV: "ValueError: 'f' is not in list"带有 RandomizedSearchCV 的 Sklearn OneClassSVM:“ValueError:‘f’不在列表中”
【发布时间】:2019-06-18 00:40:03
【问题描述】:

我正在尝试训练一个用于异常检测的一类 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

我试图追查错误的原因,但我仍然无法弄清楚。

【问题讨论】:

    标签: python scikit-learn


    【解决方案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 行看到一个在可用内核列表中查找内核的检查。这就是错误的实际来源。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2022-11-10
      • 2017-07-11
      • 2017-03-06
      • 2019-11-28
      • 2015-03-26
      • 2019-08-18
      • 2020-08-10
      • 2020-07-14
      相关资源
      最近更新 更多