广义多类支持向量机
项目描述
GenSVM Python包
这是Gerrit J.J. van den Burg和Patrick J.F. Groenen开发的GenSVM多类分类器的Python包。
有用链接
- GitHub上的PyGenSVM
- PyPI上的PyGenSVM
- 包文档
- 期刊论文: GenSVM:广义多类支持向量机 JMLR, 17(225):1−42, 2016。
- 还有一个R包
- 或者您可以直接使用C库
安装
在 安装GenSVM之前,需要一个有效的NumPy安装。因此,可以使用以下命令安装GenSVM:
$ pip install numpy && pip install gensvm
如果您遇到任何错误,请在GitHub上创建一个问题。不要犹豫,您正在帮助使这个项目变得更好!
引用
如果您在研究中使用了这个包,请引用这篇论文,例如使用以下BibTeX条目:
@article{JMLR:v17:14-526,
author = {{van den Burg}, G. J. J. and Groenen, P. J. F.},
title = {{GenSVM}: A Generalized Multiclass Support Vector Machine},
journal = {Journal of Machine Learning Research},
year = {2016},
volume = {17},
number = {225},
pages = {1-42},
url = {http://jmlr.org/papers/v17/14-526.html}
}
使用
该包包含两个类来拟合GenSVM模型:GenSVM和GenSVMGridSearchCV。这些类分别拟合单个GenSVM模型或拟合一系列模型进行参数网格搜索。这些类的接口与Scikit-Learn中的分类器接口相同,因此熟悉Scikit-Learn的用户应该没有使用这个包的问题。以下我们将展示一些在实际中使用GenSVM分类器和GenSVMGridSearchCV类的示例。
在示例中,我们假设已经按照以下方式从Scikit-Learn加载了iris数据集
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.preprocessing import MaxAbsScaler
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y)
>>> scaler = MaxAbsScaler().fit(X_train)
>>> X_train, X_test = scaler.transform(X_train), scaler.transform(X_test)
请注意,我们使用MaxAbsScaler函数进行数据缩放。该函数将数据矩阵的列缩放到[-1, 1]
范围内,而不破坏稀疏性。对数据集进行缩放可以显著影响GenSVM的计算时间,通常建议对SVM进行缩放。
示例1:拟合单个GenSVM模型
让我们先在训练数据上拟合最基础的GenSVM模型。
>>> from gensvm import GenSVM
>>> clf = GenSVM()
>>> clf.fit(X_train, y_train)
GenSVM(coef=0.0, degree=2.0, epsilon=1e-06, gamma='auto', kappa=0.0,
kernel='linear', kernel_eigen_cutoff=1e-08, lmd=1e-05,
max_iter=100000000.0, p=1.0, random_state=None, verbose=0,
weights='unit')
模型拟合后,我们可以预测测试数据集。
>>> y_pred = clf.predict(X_test)
接下来,我们可以计算预测的评分。GenSVM类有一个score
方法,可以计算预测的准确率。在GenSVM论文中,经常使用调整后的Rand指数来比较性能。下面展示了这两种选项(具体结果可能因训练/测试集的划分而异)。
>>> clf.score(X_test, y_test)
1.0
>>> from sklearn.metrics import adjusted_rand_score
>>> adjusted_rand_score(clf.predict(X_test), y_test)
1.0
我们可以尝试通过更改模型参数再次执行此操作,例如,我们可以启用可打印详细信息的模式并使用GenSVM模型中的欧几里得范数,通过设置p = 2
实现。
>>> clf2 = GenSVM(verbose=True, p=2)
>>> clf2.fit(X_train, y_train)
Starting main loop.
Dataset:
n = 112
m = 4
K = 3
Parameters:
kappa = 0.000000
p = 2.000000
lambda = 0.0000100000000000
epsilon = 1e-06
iter = 0, L = 3.4499531579689533, Lbar = 7.3369415851139745, reldiff = 1.1266786095824437
...
Optimization finished, iter = 4046, loss = 0.0230726364692517, rel. diff. = 0.0000009998645783
Number of support vectors: 9
GenSVM(coef=0.0, degree=2.0, epsilon=1e-06, gamma='auto', kappa=0.0,
kernel='linear', kernel_eigen_cutoff=1e-08, lmd=1e-05,
max_iter=100000000.0, p=2, random_state=None, verbose=True,
weights='unit')
有关可以在GenSVM模型中调整的其他参数,请参阅GenSVM。
示例2:使用“预热启动”拟合GenSVM模型
GenSVM分类器的一个关键特性是,通过使用所谓的“预热启动”,可以加速训练过程。这样,优化可以从比随机起始位置更接近最终解决方案的位置开始。为此,GenSVM类的fit
方法有一个可选的seed_V
参数。下面我们将展示如何使用它。
我们从模型中的epsilon
参数的相对较大值开始。这是决定优化持续时间的停止参数(因此也决定了拟合的精确度)。
>>> clf1 = GenSVM(epsilon=1e-3)
>>> clf1.fit(X_train, y_train)
...
>>> clf1.n_iter_
163
n_iter_
属性告诉我们模型进行了多少次迭代。现在,我们可以使用此模型的解决方案来启动下一个模型的训练。
>>> clf2 = GenSVM(epsilon=1e-8)
>>> clf2.fit(X_train, y_train, seed_V=clf1.combined_coef_)
...
>>> clf2.n_iter_
3196
将此与具有相同停止参数但没有预热启动的模型进行比较。
>>> clf2.fit(X_train, y_train)
...
>>> clf2.n_iter_
3699
因此,我们节省了大约500次迭代!在大数据集和尝试许多参数配置时,这种效果将特别明显。因此,这种技术被整合到了GenSVMGridSearchCV类中,该类可用于进行参数网格搜索。
示例3:运行GenSVM网格搜索
当拟合机器学习模型,如GenSVM时,我们通常需要尝试多种参数配置,以确定哪个在我们的给定数据集上表现最佳。这通常与交叉验证结合使用,以避免过拟合。为了有效地执行此操作并利用预热启动,提供了GenSVMGridSearchCV类。此类的工作方式与GridSearchCV类相同,但使用了GenSVM C库以提高速度。
要进行网格搜索,我们首先必须定义我们想要变化的参数以及我们想要尝试的值。
>>> from gensvm import GenSVMGridSearchCV
>>> param_grid = {'p': [1.0, 2.0], 'lmd': [1e-8, 1e-6, 1e-4, 1e-2, 1.0], 'kappa': [-0.9, 0.0] }
对于参数网格中未变化的值,将使用默认值。这意味着如果您想更改特定值(例如,例如,更改epsilon
),您可以将其添加到参数网格中作为具有单个尝试值的参数(例如,'epsilon': [1e-8]
)。
运行网格搜索现在变得简单。
>>> gg = GenSVMGridSearchCV(param_grid)
>>> gg.fit(X_train, y_train)
GenSVMGridSearchCV(cv=None, iid=True,
param_grid={'p': [1.0, 2.0], 'lmd': [1e-06, 0.0001, 0.01, 1.0], 'kappa': [-0.9, 0.0]},
refit=True, return_train_score=True, scoring=None, verbose=0)
请注意,如果我们已设置refit=True
(默认值),则可以使用GenSVMGridSearchCV实例使用网格搜索中找到的最佳估计量进行预测或评分。
>>> y_pred = gg.predict(X_test)
>>> gg.score(X_test, y_test)
1.0
从Scikit-Learn
借用的一个不错的特点是,网格搜索的结果可以用作pandas
DataFrame。
>>> from pandas import DataFrame
>>> df = DataFrame(gg.cv_results_)
这可以使探索网格搜索结果更加容易。
已知限制
以下为已知限制,这些限制将在未来版本中解决。如果您需要这些功能中的任何一项,请前往链接的GitHub问题页面进行投票(这可以帮助我们更快地添加它们!)。
- 稀疏矩阵支持。NumPy支持稀疏矩阵,GenSVM C库也是如此。使它们协同工作需要一些额外的工作。在此期间,如果您真的想使用GenSVM与稀疏数据(这可能导致显著加速!),请查看GenSVM C库。
- 指定类误分类权重。目前,将类A的对象错误分类到类C与将类B的对象错误分类到类C一样糟糕。根据应用场景,这可能不是期望的效果。添加类误分类权重可以解决这个问题。
问题和疑问
如果您在使用此软件包时有任何疑问或遇到任何问题,请在GitHub上提问。
许可证
本软件包根据GNU通用公共许可证第3版授权。
版权(c)G.J.J. van den Burg,不包括明确标记为来自Scikit-Learn的代码部分。
项目详情
gensvm-0.2.7.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1340114dccdb15cbef53acd19d9b775bd631a2ff0a820b60fbac2391d263e7c3 |
|
MD5 | c69ae15b335a7cc88c6a76425aad011e |
|
BLAKE2b-256 | 2f6708d4787cdfee69a416b028d9880b95a4b3bcf970437c9fa190033188630d |
gensvm-0.2.7-cp38-cp38-manylinux2010_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 40d177479ccfcd1b277aa840ff047668aaa8e6c79d6480f2f2b06d9cb78595cf |
|
MD5 | b86cd42684d03cc0d21b9530cc0aae77 |
|
BLAKE2b-256 | cbb847227391868a26db5a9cb6f36599e9042005882e1b37279a3399ae1067a4 |
gensvm-0.2.7-cp38-cp38-manylinux2010_i686.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5defaf0a62c971252fd31b98ca54e5b3e14882a7ec4f095aaf6d2b528ef6959a |
|
MD5 | 84e92e7c85a400eb16f8b0fd64b436cf |
|
BLAKE2b-256 | 4533584195d72c1a9826b0a03176306df7db2bfbdf5b02be80366da62cfce5e7 |
gensvm-0.2.7-cp38-cp38-macosx_10_14_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a11ee0edf220bf27a05bc08187ada7395c2648550a4eabe6161980d82d2d7c07 |
|
MD5 | 330df0886999e4aaa231b56236ebd9c2 |
|
BLAKE2b-256 | fa22e1d531fda468968470382ad3653cbee3b5cc3a7945b5eb7928ac7c1f38ef |
gensvm-0.2.7-cp37-cp37m-manylinux2010_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3b6709b3a0d3d2f6549847059bc3ac433dfaa6ca7cf12091fae5a9927c1a5676 |
|
MD5 | c888e35b654033a336a081721e630952 |
|
BLAKE2b-256 | e154ecb6abcf4fa4d6e6064d8d106efb6eaad499ecc870ffe7c2072a107ccfb1 |
gensvm-0.2.7-cp37-cp37m-manylinux2010_i686.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7089a0212f76302ba6fe7292c32d6be6a5fb5e2e8c60dad4c9e465e03d426809 |
|
MD5 | 241b62c4ad1a777f09d968054d0f2ecb |
|
BLAKE2b-256 | bda2c0f4f428a48dc55c9b3bdcad70cd72bc9e8fcb3a92f255f12fae678369ea |
gensvm-0.2.7-cp37-cp37m-macosx_10_14_intel.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0e8fa7174f0e22f64512744954f84e4a8b0e86846fed0cd9725633259e3c7150 |
|
MD5 | 4e680d75db887fe4a6928df8521f36c7 |
|
BLAKE2b-256 | cc7e6d3092f4a0e502e9af0cad86e183cac08827c428302b023575f78246768f |
哈希值用于gensvm-0.2.7-cp36-cp36m-manylinux2010_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f15153006d8c23c6e5b0f3c030accc33b481a128b3cc6bcdbcf8adf5aba5452b |
|
MD5 | 9362be3dc3947ac2502f900a2699a44b |
|
BLAKE2b-256 | 3a1b8e2d6efdae5c1d403e065ffb7d4242565d97569d39640c8ed240060adfb8 |