我做了一个分析,试图看到SVC中训练时间和最大迭代之间的关系.我使用的数据是一些随机生成的数字,我将训练时间与SVC拟合的max_iter相对应.我检查了日志,每个二进制分类器都已达到max_iter(我输出所有控制台日志,显示每个二进制分类器的详细警告并计算它们).然而,我假设训练时间与迭代严格线性,但实际上,在训练数据有许多标签的情况下,例如40,那么该图不显示它是线性的.

似乎最大迭代次数增加,每次迭代所花费的时间比以前少得多.如果我们将label_size更改为2(这意味着每个fit只包含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, …Run Code Online (Sandbox Code Playgroud) gs_clf = GridSearchCV(SVC(probability=False, class_weight='balanced', max_iter=100, random_state=2018, tol=1e-10),
param_grid={'C': [2, 5, 10] , 'kernel': 'linear'},
n_jobs=1,
refit=False,
cv=2,
scoring='f1_weighted',
verbose=1)
gs_clf.fit(X, y)
Run Code Online (Sandbox Code Playgroud)
这就是我使用Gridsearch和SVC来匹配数据的方法.基本上,我根据随机训练数据调整数据点的行数和标签数,并记录时间消耗.从理论上讲,似乎SVC(不linearSVC)linear内核使用OVO多类实现,计算复杂度为O(#samples*#class*iter).
以下是我遇到的两个问题:
log(#label)(粗略地)呈线性上升.与单一SVC培训相反,时间呈线性上升趋势#label.Gridsearch究竟在做什么?#label=2.但是当#label它很大时情况并非如此.什么时候#label=40,time(max_iter=200)没有那么不同time(max_iter=400).这不仅发生在gridsearch中,也发生在SVC上.我设置tol为非常小,希望适合总是达到最大迭代但似乎它不起作用.这背后的机制是什么?我正在使用sklearn == 0.18.1.谢谢!