- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我做了一个分析,试图查看 SVC 中训练时间和最大迭代之间的关系。我使用的数据是一些随机生成的数字,我根据 SVC 拟合的 max_iter 绘制了训练时间。我检查了日志,每个二进制分类器都达到了 max_iter(我输出了所有控制台日志,这些日志显示了每个二进制分类器的详细警告并对其进行了计数)。但是,我假设训练时间与迭代严格线性,但实际上,在训练数据有很多标签的情况下,例如说 40,那么情节不显示它是线性的。
似乎随着最大迭代次数的增加,每次迭代所需的时间比以前略少。而如果我们将 label_size 更改为 2(这意味着每个拟合仅包含 1 个二元分类器),则该线是直的。
是什么导致这种情况发生?
这是我的源代码:
# -*- coding: utf-8 -*-
import numpy as np
from sklearn.svm import SVC
import time
import pandas as pd
def main(row_size, label_size):
np.random.seed(2019)
y = np.array([i for i in range(label_size) for j in range(row_size
/ label_size)])
if len(y) < row_size:
y = np.append(y, [y[-1]] * (row_size - len(y)))
X = np.random.rand(row_size, 300)
print X.shape, y.shape
return (X, y)
def train_svm(X, y, max_iter):
best_params = {'C': 1}
clf = SVC(
C=best_params['C'],
kernel=str('linear'),
probability=False,
class_weight='balanced',
max_iter=max_iter,
random_state=2018,
verbose=True,
)
start = time.time()
clf.fit(X, y)
end = time.time()
return end - start
if __name__ == '__main__':
row_size = 20000
m_iter = range(10, 401, 20)
label_size = [40]
data = {
'label_size': [],
'max_iter': [],
'row_size': [],
'time': [],
}
for it in m_iter:
for l in label_size:
(X, y) = main(row_size, l)
t = train_svm(X, y, max_iter=it)
data['label_size'].append(l)
data['max_iter'].append(it)
data['row_size'].append(row_size)
data['time'].append(t)
df = pd.DataFrame(data)
df.to_csv('svc_iter.csv', index=None)
最佳答案
好吧,“ 非常微小的变化 ”可能有很多原因。 Scikit-Learn 不是 native 运行的,它是建立在不同的库上的,它可能会使用大量的优化器……等等!
此外,你的第一张图是 非常接近线性!
尽管如此,促成这些微小变化的一个重要的合理因素是 分解方法在支持向量机中。
分类任务分解方法的思想是将一个复杂的分类任务分解为几个更简单、更易于管理的子任务,这些子任务可以使用现有的归纳方法解决,然后将它们的解决方案结合在一起以解决原始问题。
该方法是一个迭代过程,在每次迭代中只有少数变量被更新。
有关数学方法的更多详细信息,请参阅 this paper, section 6.2 The Decomposition Method. .
此外,具体来说,SVM 实现了两个技巧,称为 收缩和 缓存 为分解方法。
α
SVM 对偶问题可能包含一些有界元素(即 αi = 0 或 C)。这些元素可能在分解迭代的中间已经有界。为了节省训练时间,收缩技术尝试识别并移除一些有界元素,因此解决了一个较小的优化问题。 shrinking
在
sklearn SVC设置为
True
,保持原样,产生以下输出:
shrinking
明确给
False
如下:
clf = SVC(
C=best_params['C'],
kernel=str('linear'),
probability=False,
class_weight='balanced',
max_iter=max_iter,
random_state=2018,
verbose=True,
shrinking=False
)
libsvm
库来处理所有计算。这个库是用
包装的C 和
Cython ,您对
maximum iterations
之间关系的“线性”的定义会有更高的容忍度。和
time
.另外,
here是关于为什么算法可能不会每次都给出完全相同的精确确定运行时间的很酷的讨论。
cache_size
除了
shrinking=False
之外,参数为一个非常小的数字(因为零是 Not Acceptable 并且会引发错误) ,导致
max_iter
之间非常接近线性模式和
time
:
clf = SVC(
C=best_params['C'],
kernel=str('linear'),
probability=False,
class_weight='balanced',
max_iter=max_iter,
random_state=2018,
verbose=False,
shrinking=False,
cache_size = 0.000000001
)
verbose=True
,您可以通过
ConvergenceWarning
检查它是否达到了最大迭代次数。 ,因此您可以将这些警告重定向到一个文件,并且跟踪起来会容易百万倍,只需添加以下代码:
import warnings, sys
def customwarn(message, category, filename, lineno, file=None, line=None):
with open('warnings.txt', 'a') as the_file:
the_file.write(warnings.formatwarning(message, category, filename, lineno))
warnings.showwarning = customwarn
(X, y) = main(row_size, 40)
for it in m_iter:
....
....
libsvm
的内部使用。库来处理使用 C 和 Cython 包装的所有计算。
关于python - 在 Sklearn 的 SVC 中,当标签大小很大时,为什么训练时间与最大迭代不严格线性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52573507/
有没有一个简单的答案:为什么 GHC 这么大? OCaml:2MB Python:15MB SBCL:9MB OpenJRE - 26MB GHC:113MB 对“如果 Haskell 是正确的工具,
我发现我的 access_log 占用了我的大部分硬盘。它的大小超过 200 GB。我怎样才能重置它? 我在装有 Plesk 的 CentOS 服务器上使用 Apache 2.2.3。 谢谢你们 !
我正在使用 Java 中的 BeanShell 解释器来解决字符串计算问题。问题是我自己做了一些解释器无法完成的解析并将部分结果存储在 BigInteger 中。然后我将所有内容拼凑起来并交给解释器来
我在我的 android 项目中使用 OpenCV native 库。它是一个带有一个 CameraScreen 的 hello world 项目,它已经有 40mb。我怎样才能减少 apk 的大小,
我使用基于 Laravel 和 Vue.js 的 Laravue Dashboard,在在线服务器上运行,而不是本地主机,它是全新安装,没有进行任何编辑。 我的问题是: 运行 npm run watc
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我广泛使用了 Kendo DataSourceResult ToDataSourceResult(this IQueryable enumerable, DataSourceRequest reque
我使用 phonegap 构建 html\css 应用程序陪审团手机给我 div: 并且模拟器中的最小高度太大,我在底部看到黑线像这样: 如果我在 css 文件中更改 min-height: 736
以下工作正常但速度太慢。只需要知道B表中有匹配的记录,有什么技巧吗? (奇怪的是相反的搜索:找到不加入的记录(IS NULL)非常快) SELECT TableA.id FROM TableA
我正在使用 Vue.js,我的项目中只有 4 个组件。 我只导入了bootstrap、jquery 和lodash: import { map } from 'lodash'; import 'boo
我有 2 个字谜检测功能;一个使用排序和比较,另一个跟踪每个字母字符出现的次数。 这里假设传递给函数的两个字符串是相同的,第一个随机生成(未排序),第二个 = 给第一个,这样两个函数都“一路”执行并返
我正在尝试编写一个脚本,该脚本将通过 HTTP 同时下载最多 N 个文件。 我以前用过 AnyEvent::Worker::Pool管理阻塞任务池。我也用过 AnyEvent::HTTP结合AnyEv
我是一名优秀的程序员,十分优秀!