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

时间:2017-10-06 20:23:16

标签: machine-learning scikit-learn data-science multilabel-classification

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

 1. sno
 2. timestamp
 3. v1
 4. v2
 5. v3

我有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

1 个答案:

答案 0 :(得分:4)

关注documentation

  

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

一对一策略

one-vs-one方案基本上是指每对类使用一个分类器。在预测阶段,最终选择接收最多投票的类(每个分类器的输出)作为预测。如果这样的投票有平局,即有两个等级投票的类别,则分类置信度起作用。

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

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

...

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

clf.fit()

one-vs-rest strat

另一种方法是使用one-vs-all策略。此策略适合每个类的分类器以及数据中的所有其他类。它比第一种方案更受欢迎,因为它更容易实现结果,并且计算时间要弱得多。它与第一个例子一样简单:

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

...

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

clf.fit()

要了解有关多标签分类和学习的更多信息,请继续here

后果变量编码

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

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

  • 如果yv1v2

    ,则
  • v3等于1 如果yv1 v2v1 v3

  • ,则
  • v2 v3等于2 如果y

  • v1 v2 v3等于3

解决方法可能如下:

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)