为什么我的 svm.SVC.fit( )(线性内核)运行这么长时间?

数据挖掘 scikit-学习 支持向量机
2022-02-22 11:00:27

我正在使用 sklearn.svm.SVC( ) 来训练和测试我的数据集。80% 用于训练,20% 用于测试。

这是我的 Python 代码:

data = pd.read_csv(trainPath, header=0)

X = data.iloc[:, 5:17].values
y = data.iloc[:, 17:18].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

print(X_train.dtype, y_train.dtype)  # float64 int64

clf = svm.SVC(kernel='linear').fit(X_train, y_train.ravel())
print('done')

y_pred = clf.predict(X_test)

print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
print("Precision:", metrics.precision_score(y_test, y_pred))
print("Recall:", metrics.recall_score(y_test, y_pred))
tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()
print(tn, fp, fn, tp)

对于 data.shape = 30,000 x 13,它运行大约 15 分钟。

对于 data.shape = 130,000 x 13,它运行超过 1 小时。

为什么运行这么长时间,我觉得不正常。

  • i5、2.8GHz、16.0 GB 内存
1个回答

来自 scikit-learn 文档:

该实现基于 libsvm。拟合时间至少与样本数量成二次方关系,超过数万个样本可能不切实际对于大型数据集,可以考虑使用 sklearn.linear_model.LinearSVC 或 sklearn.linear_model.SGDClassifier,可能在 sklearn.kernel_approximation.Nystroem 转换器之后。

哟可以改变

clf = svm.SVC(kernel='linear').fit(X_train, y_train.ravel())

经过

from sklearn.svm import LinearSVC
clf = LinearSVC(random_state=0, tol=1e-5)
clf.fit(X_train, y_train.ravel())