Как сделать этот код KNN быстрее в google colab или в любой другой среде, основанной на ipython? - PullRequest
1 голос
/ 25 октября 2019

Я использую коллаборацию Google для классификации KNN набора данных DonorsChoose. Когда я применяю классификатор KNeighbors для наборов данных avgw2v и tfidf, выполнение следующего кода занимает около 4 часов.

Я уже пытался запустить его на ноутбуках kaggle, но проблема не устранена.

import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_auc_score
train_auc_set3 = []
cv_auc_set3 = []
K = [51, 101]
for i in tqdm(K):
    neigh = KNeighborsClassifier(n_neighbors=i, n_jobs=-1)
    neigh.fit(X_tr_set3, y_train)

    y_train_set3_pred = batch_predict(neigh, X_tr_set3)    
    y_cv_set3_pred = batch_predict(neigh, X_cr_set3)        
    train_auc_set3.append(roc_auc_score(y_train,y_train_set3_pred))
    cv_auc_set3.append(roc_auc_score(y_cv, y_cv_set3_pred))

plt.plot(K, train_auc_set3, label='Train AUC')
plt.plot(K, cv_auc_set3, label='CV AUC')

plt.scatter(K, train_auc_set3, label='Train AUC points')
plt.scatter(K, cv_auc_set3, label='CV AUC points')

plt.legend()
plt.xlabel("K: hyperparameter")
plt.ylabel("AUC")
plt.title("ERROR PLOTS")
plt.grid()
plt.show()

1 Ответ

0 голосов
/ 25 октября 2019

Это может быть медленно по своей сути. Я не очень знаком с этим набором данных, но, глядя на него в Kaggle, похоже, он содержит более 4 миллионов точек данных. Со страницы sklearn в KNN:

Для каждой итерации сложность времени равна O (n_components x n_samples> x min (n_samples, n_features)).

Также сохраняйте вимейте в виду, что для большого набора данных knn придется измерить расстояние между данной точкой данных и всеми точками данных в обучающем наборе, чтобы сделать прогноз, который в вычислительном отношении дорог.

Использование больших чисел на kдля очень большого набора данных вы можете получить очень низкую производительность. То, что я мог бы сделать, это:

1) посмотреть, сколько времени занимает подгонка knn с одним значением k и делать прогнозы для тренировочного набора с одним значением k. Если это займет много времени, то, как я подозреваю, это ваша проблема.

К сожалению, иногда для очень больших наборов данных мы ограничены в выборе алгоритма временной сложностью алгоритмов, которые мы хотели бы использовать. Например, регрессия гребня ядра - это отличный алгоритм, который просто плохо масштабируется для больших наборов данных из-за необходимости найти обратную матрицу, которая имеет кубическую сложность по времени.

...