【问题标题】:How to predict multi-label dataset using svm如何使用 svm 预测多标签数据集
【发布时间】:2018-03-18 17:08:51
【问题描述】:

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

 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

【问题讨论】:

  • 短语“我需要预测将来是否使用 v1、v2、v3”应该建议重新编码变量,如果没有出现则等于 0,如果出现则等于 1给定的时刻。不过,我可能错了,因为描述有点模糊。您应该详细说明您的数据。
  • @E.Z.如何将 v1,v2,v3 添加到 y 中?我必须在 X 中添加时间戳、电压、功率,对吗?需要帮助!
  • 基本上,是的。您可以通过这种方式形成X 变量。然而,创建y 需要修改,因为它还没有明确应该如何初始化。 v1 v2 v3 背后的故事是什么?换句话说,这些变量是什么意思?
  • @E.Z.它们代表不同的类别,对于每个 sno,它可以有一个或多个类别。我该怎么办?
  • 那么,没有既定的解决方案。我首先想到的模型会非常复杂。如果您了解这些变量的概念,那么您应该能够创建一个基本理论,说明它们应该如何弥补y 变量。我无法判断我的理论是否可行,因为我对v1 v2 v3 代表什么一无所知,但仍然......y 可能如下:y = 0 如果v1 v2 v3 为零; y = 1 如果 v1 = 1v2 v3 为零,以此类推...这将创建一个多标签变量,该变量可能会在未来拟合。

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


【解决方案1】:

关注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-all 策略。该策略适合每个类的分类器以及数据中的所有其他类。它比第一种方案更受欢迎,因为它更容易对结果进行干预,并且计算时间要短得多。使用起来和第一个例子一样简单:

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

...

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

clf.fit()

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



余波变量编码

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

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

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

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

  • 如果v1 v2 v3 是1,则y 等于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)

【讨论】:

  • 我已经更新了数据。请您分享我可以与上述数据一起使用的代码。提前致谢
  • 我应该如何拆分数据?我应该怎么做才能得到 y 中的 v1、v2、v3 值,我用它来预测。请帮忙!
猜你喜欢
  • 1970-01-01
  • 2018-05-10
  • 2020-03-09
  • 2013-03-04
  • 1970-01-01
  • 2020-03-03
  • 2018-02-10
  • 2018-10-31
  • 2014-07-04
相关资源
最近更新 更多