python - 带有 RandomizedSearchCV 的 Sklearn OneClassSVM:“ValueError:‘f’不在列表中”
问题描述
我正在尝试训练一个用于异常检测的一类 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
我试图追查错误的原因,但我仍然无法弄清楚。
解决方案
问题在于您的param_distributions
. 正如RandomizedSearchCV的文档所述:
param_distributions : dict 字典,参数名称(字符串)作为键和分布或要尝试的参数列表。发行版必须提供 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 行看到一个在可用内核列表中查找内核的检查。这就是错误的实际来源。
推荐阅读
- ascii - ADFV2 中的特殊字符 (¿) 编码为 (?) 问题
- java - Java String 和 byte[] 转换疯狂
- scala - 如何使用 scala 宏生成顶级类/对象
- node.js - 函数返回的 Jest 模拟值
- django - 无法将关键字“用户名”解析为字段。选项有:bio、blog、description、id、image、speciality、status、user、user_id
- django - 从 Django 模板上传到模型的图像不起作用
- linux - 如何在多行列表中转换用逗号分隔的单行中的多个单词
- active-directory - Window AD 的 LDAP 查询
- css - 如何在可能的右滚动条旁边浮动元素?
- javascript - 我正在尝试使用“npx/npm create-react-app hello”命令创建一个反应应用程序,并得到了整个消息