如何让knn更快?

How to make knn faster?

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

但是在测试上它确实需要很长时间,请专家帮助让我知道如何减少 KNN 预测时间。

是否有类似 GPU-KNN 或 something.Please 的帮助让我知道。

下面是我使用的代码。

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))

我可以建议减少特征的数量,我认为它是数据集形状中的 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

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

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

度量 dtw 花费太多时间,而简单 knn 运行良好。