如何使用 svm 预测多标签数据集

jas*_*son 0 machine-learning scikit-learn multilabel-classification data-science

我正在使用一个包含所有十进制值和时间戳的数据集,它具有以下功能:

 1. sno
 2. timestamp
 3. v1
 4. v2
 5. v3
Run Code Online (Sandbox Code Playgroud)

我有 5 个月的数据,每分钟都有时间戳。我需要预测将来是否会随时使用 v1、v2、v3。v1、v2、v3 的值在 0 到 25 之间。

我怎样才能做到这一点 ?

我以前使用过二元分类,但我不知道如何处理多标签问题来进行预测。我一直在使用下面的代码。我应该如何训练模型以及我应该如何使用 v1、v2、v3 来适应“y”?

X_train, X_test, y_train, y_test = train_test_split(train, y, test_size=0.2)




Data:

sno power   voltage v1  v2  v3  timestamp
1   3.74    235.24  0   16  18  2006-12-16 18:03:00
2   4.928   237.14  0   37  16  2006-12-16 18:04:00
3   6.052   236.73  0   37  17  2006-12-16 18:05:00
4   6.752   237.06  0   36  17  2006-12-16 18:06:00
5   6.474   237.13  0   37  16  2006-12-16 18:07:00
6   6.308   235.84  0   36  17  2006-12-16 18:08:00
7   4.464   232.69  0   37  16  2006-12-16 18:09:00
8   3.396   230.98  0   22  18  2006-12-16 18:10:00
9   3.09    232.21  0   12  17  2006-12-16 18:11:00
10  3.73    234.19  0   27  17  2006-12-16 18:12:00
11  2.308   234.96  0   1   17  2006-12-16 18:13:00
12  2.388   236.66  0   1   17  2006-12-16 18:14:00
13  4.598   235.84  0   20  17  2006-12-16 18:15:00
14  4.524   235.6   0   9   17  2006-12-16 18:16:00
15  4.202   235.49  0   1   17  2006-12-16 18:17:00
Run Code Online (Sandbox Code Playgroud)

E.Z*_*.Z. 5

按照文档

多类支持是根据一对一方案处理的(因此应该支持一对多策略)。

一对一策略

一个-VS-一个方案基本上是指使用每对类的分类器。在预测阶段,最终选择获得最多投票的类别(每个分类器的输出)作为预测。如果这样的投票有平局,即有两个类的票数相等,那么分类置信度就起作用了。

要使用SVM这样的方案,应该去:

from sklearn.multiclass import OneVsOneClassifier
from sklearn.svm import SVC

...

subclf = SVC(**params)
clf = OneVsOneClassifier(estimator=subclf)

clf.fit()
Run Code Online (Sandbox Code Playgroud)

一对一策略

另一种方法是使用一对多的策略。此策略适合每个类的分类器,并针对数据中的所有其他类。它比第一种方案更受欢迎,因为它更容易解释结果,并且计算时间要短得多。使用起来和第一个例子一样简单:

from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC

...

subclf = SVC(**params)
clf = OneVsRestClassifier(estimator=subclf)

clf.fit()
Run Code Online (Sandbox Code Playgroud)

要阅读有关多标签分类和学习的更多信息,请点击此处



后果变量编码

因此,基本思想是通过以下方式实例化复杂(即多标签)目标变量:

  • y如果v1 v2 v3为零则等于0

  • y如果v1v2v3是1,则等于 1

  • y如果v1 v2v1 v3v2 v3是 1,则等于 2

  • y等于 3 如果v1 v2 v3

解决方法可能如下:

import numpy as np

y = []

for i, j, k in zip(data['v1'], data['v2'], data['v3']):
if i and j and k > 0:
    y.append(3)
elif i and j or i and k or j and k > 0:
    y.append(2)
elif i or j or k > 0:
    y.append(1)
else:
    y.append(0)
Run Code Online (Sandbox Code Playgroud)