我在用tslearn库实现DTW分类时遇到了一些问题。特别是在训练模型时。
我有多个可变长度和多维的时间序列数据。在第一步,我所做的是将多个文件上传到一个 Dataframe 列表中进行可视化。然后,我将这些 Dataframe 列表过滤掉所有列,转换为numpy数组。拆分为train和test,然后尝试使用dtw作为距离度量来训练模型。
我不确定我错过了什么,因为我遇到了ValueError:使用序列设置数组元素。
我试图将我的numpy数组变平并将其输入模型,我试图重新塑造它(-1,1),我试图将dtype更改为float,但没有任何结果(似乎我错过了什么)
下面是我分享的代码片段:
这些是来自列表中时间序列的多个 Dataframe ,我将其进一步简化为仅使用整个列表中的一列
from tslearn.neighbors import KNeighborsTimeSeriesClassifier
from tslearn.metrics import dtw
import pandas as pd
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
print(timeseries())
OUTPUT : /
time IR TC \
0 0.006361 111.089076 36.395268
1 0.012713 108.589543 36.389164
2 0.018961 107.910312 36.387853
3 0.025192 107.363165 36.389093
4 0.031445 106.785048 36.381344
... ... ... ... ...
p TS IRtime
0 4.318834 44.917064 09:15:15
1 4.522443 45.028859 09:15:15
2 4.485727 45.021396 09:15:15
3 4.518629 45.351248 09:15:15
4 4.513145 45.645672 09:15:15
... ... ... ...
[9589 rows x 10 columns],
time IR TC \
0 0.006373 75.354227 38.953333
1 0.012679 74.493989 38.968091
2 0.018946 76.143107 38.969021
3 0.025177 77.940211 38.962893
4 0.031404 79.705939 38.965134
... ... ... ... ...
p TS IRtime
0 4.519344 33.986072 09:16:23
1 4.551769 34.114317 09:16:23
2 4.522443 34.183959 09:16:23
3 4.535080 34.111575 09:16:23
4 4.532219 34.109334 09:16:23
... ... ... ...
[8376 rows x 10 columns],
ts = timeseries()
[i.drop(columns=['time','IRtime','value','value.1','value.2','value.3','IR','TS','p'],inplace = True) for i in ts]
X = []
for i in ts:
i = i.values
X.append(i.flatten())
y = labels()['target'].values
X = np.array(X)
y = np.array(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(X_train)
O> [array([36.39526801, 36.38916449, 36.38785319, ..., 39.40492146,
39.40108292, 40.43806081]),
array([38.95333278, 38.96809089, 38.96902072, ..., 40.1875067 ,
40.1795912 , 40.18588545]),
array([39.6719503 , 39.67082973, 39.66928001, ..., 40.43901449,
40.43760782, 40.43856149]),
array([39.82344148, 39.81049535, 39.80937479, ..., 40.63313492,
40.64379223, 40.62316902]),
array([40.0663662 , 40.07699967, 40.06004811, ..., 40.88702689,
40.89880477, 40.89603912]),
# My X_train and X_test looks exactly the same
print(y_train)
O>array([0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1,
1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1]
knn = KNeighborsTimeSeriesClassifier(n_neighbors=2,metric =dtw)
knn.fit(X_train, y_train)
Error :
TypeError: only size-1 arrays can be converted to Python scalars
The above exception was the direct cause of the following exception:
ValueError: setting an array element with a sequence.
我的问题如下:
问题1.如何解决此问题?
问题2:他们的任何其他库是否执行以下计算距离矩阵并对其进行分类的操作?(我也尝试使用dtai来查找距离矩阵,但不明白如何在分类中使用该矩阵,因为我在尝试拟合模型时遇到了同样的问题)
Q3.我想在动态时间扭曲中实现多维(多特征),即IR,TC,TS一起,并进行分类。有什么方法可以让它工作吗?
1条答案
按热度按时间zaqlnxep1#
关于Q1,使用
tslearn
的to_time_series_dataset
实用函数可能是值得的,以便将数据集转换为KNeighborsTimeSeriesClassifier
的适当格式。关于Q2和Q3,我最近发布了我的包Sequentia的一个稳定版本,它提供了使用动态时间规整和隐马尔可夫模型的序列分类器。而DTW-kNN分类器支持具有不同持续时间的多变量序列。kNN分类器通过计算训练序列和被分类的新序列之间的DTW距离的距离矩阵来工作,然后使用该距离矩阵运行kNN算法。这些预测可以被多次处理,并使用来自
dtaidistance
的快速纯C编译函数进行DTW计算。下面是一个基本示例,它将DTW-kNN分类器拟合到类0/1中具有不同长度的二维序列上。
fit
/predict
函数希望输入是连接到一个数组中的所有序列,并且长度应单独提供。