【问题标题】:How to make knn faster?如何让knn更快?
【发布时间】:2021-12-30 15:18:22
【问题描述】:

我有一个 shape(700000,20) 的数据集,我想对其应用 KNN。

但是测试需要很长时间,请专家帮忙告诉我如何减少 KNN 预测时间。

有没有像 GPU-KNN 之类的东西。请帮忙告诉我。

下面是我正在使用的代码。

import os 
os.chdir(os.path.dirname(os.path.realpath(__file__)))

import tensorflow as tf
import pandas as pd
import numpy as np
from joblib import load, dump
import numpy as np
from scipy.spatial import distance
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from dtaidistance import dtw


window_length = 20
n = 5


X_train = load('X_train.pth').reshape(-1,20)
y_train = load('y_train.pth').reshape(-1)
X_test = load('X_test.pth').reshape(-1,20)
y_test = load('y_test.pth').reshape(-1)


#custom metric
def DTW(a, b):   
    return dtw.distance(a, b)


clf = KNeighborsClassifier(metric=DTW)
clf.fit(X_train, y_train)


#evaluate
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))

【问题讨论】:

  • 你真的分析过你的代码吗?是的,KNN 通常很慢。不过,我敢打赌,大部分计算时间都花在了评估您的 DTW 指标上......
  • 如果我在不使用 BTW 度量的情况下尝试使用欧几里得距离度量仍然需要更多时间。
  • “更多时间”与什么相比?无论如何,如果您查看KNeighborsClassifier 的选项,那么您显然应该测试将algorithm 显式设置为'ball_tree''kd_tree'n_jobs 到您的核心数量。
  • 我再次尝试了正常距离,它似乎运行良好......是的 DTW 指标花费了太多时间。

标签: python time-series classification knn


【解决方案1】:

我可以建议从你的数据集形状中减少我认为它的 20 个特征的数量,这意味着你有 20 个维度。

您可以通过使用 PCA(主成分分析)来减少特征数量,如下所示:

from sklearn.decomposition import PCA    
train_data_pca = PCA(n_components=10)
reduced_train_data = train_data_pca.fit_transform(train_data)

此代码将例如减少到 10 而不是 20

你的代码中的第二个问题,我看到你没有在分类器中使用 th K neighboors 值,它应该如下:

clf = KNeighborsClassifier(n_neighbors=n, metric=DTW)

【讨论】:

    【解决方案2】:

    当简单 knn 工作正常时,公制 dtw 花费了太多时间。

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 2015-04-09
      • 2020-07-24
      • 2021-07-31
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多