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)
按照文档:
多类支持是根据一对一方案处理的(因此应该支持一对多策略)。
在一个-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如果v1或v2或v3是1,则等于 1
y如果v1 v2或v1 v3或v2 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)
| 归档时间: |
|
| 查看次数: |
2270 次 |
| 最近记录: |