В настоящее время я оцениваю, какой классификатор лучше всего подходит для задачи анализа настроений в обзорах фильмов. До сих пор я оценивал логистическую регрессию, линейную регрессию, случайный лес и дерево решений, но я также хочу рассмотреть модели KNN, GNB и SVC. Проблема в том, что каждое выполнение этих алгоритмов (особенно KNN) требует большого времени выполнения. Даже при использовании RandomizedSearch в KNN мне приходится ждать около 1 часа с 10 итерациями. Вот несколько фрагментов:
Классификатор КНН
#KNearestNeighbors X -> large execution time
knn=KNeighborsClassifier()
k_range=list(range(1,50))
options=['uniform', 'distance']
param_grid = dict(n_neighbors=k_range, weights=options)
rand_knn = RandomizedSearchCV(knn, param_grid, cv=10, scoring='accuracy', n_iter=10, random_state=0)
rand_knn.fit(x_train_bow, y_train)
print(rand_knn.best_score_)
print(rand_knn.best_params_)
confm_knn = confusion_matrix(y_test, y_pred_knn)
print_confm(confm_knn)
print("=============K NEAREST NEIGHBORS=========== = ")
print_metrics(y_test,y_pred_knn)
print("=========================================== = ")
Я ждал выполнения приведенного выше кода около 85 минут, но он так и не закончился, и мне пришлось прервать выполнение. Чтобы получить какой-либо результат (хотя бы любой), я пытаюсь выбрать лучший k вручную с помощью цикла for, но все равно каждая итерация занимает более 12-17 минут.
def testing_k_neighbors(x_train_bow,y_train,x_test_bow,y_test):
accuracy_hist = []
for i in range (1,21):
knn=KNeighborsClassifier(n_neighbors=i)
knn.fit(x_train_bow, y_train)
yi_pred_knn = knn.predict(x_test_bow)
acc_i = accuracy_score(y_test, yi_pred_knn)
accuracy_hist.append(acc_i)
print(f"K: {i}, accuracy: {acc_i}")
print(accuracy_hist)
выход:
K: 1, accuracy: 0.7384384634613782
K: 2, accuracy: 0.7435213732188984
K: 3, accuracy: 0.7574368802599784
K: 4, accuracy: 0.7678526789434214
K: 5, accuracy: 0.7681859845012916
K: 6, accuracy: 0.7745187901008249
K: 7, accuracy: 0.7729355887009416
K: 8, accuracy: 0.7774352137321889
K: 9, accuracy: 0.7742688109324223
K: 10, accuracy: 0.7810182484792934
K: 11, accuracy: 0.7776851929005916
K: 12, accuracy: 0.7854345471210732
K: 13, accuracy: 0.783101408215982
K: 14, accuracy: 0.7866844429630864
K: 15, accuracy: 0.784934588784268
K: 16, accuracy: 0.78860094992084
K: 17, accuracy: 0.7873510540788268
K: 18, accuracy: 0.7893508874260479
K: 19, accuracy: 0.7856011999000083
K: 20, accuracy: 0.7916006999416715
Также SVC и GNB занимают одинаковое время, чтобы получить какой-либо результат:
#Support Vector Macine X -> large execution time
#svc=SVC(C = 100, kernel = 'linear', random_state=123)
#svc.fit(x_train_bow,y_train)
#y_pred_svc = svc.predict(x_test_bow)
#print("=============SUPPORT VECTOR MACHINE=========== = ")
#print_metrics(y_test,y_pred_svc)
#print("=========================================== = ")
#Gaussian Naive Bayes
gnbc=GaussianNB()
gnbc.fit(x_train_bow.toarray(),y_train)
y_pred_gnbc = gnbc.predict(x_test_bow)
print("=============GAUSSIAN NAIVE BAYES=========== = ")
print_metrics(y_test,y_pred_gnbc)
print("=========================================== = ")
Есть ли способ настроить мой код, чтобы сократить время выполнения и сохранить или улучшить производительность моделей?
Я ожидаю настроить свой код, отдавая приоритет как эффективности, так и производительности.
я пробую ваш код: затем я печатаю "x_train_bow":
<28000x122447 sparse matrix of type '<class 'numpy.float64'>'
with 2796291 stored elements in Compressed Sparse Row format>
у вас есть 122447 столбцов, затем вы использовали TfidfVectorizer, Это проблема размерности, поэтому на это уходит много времени. Решения нет (KNN, SVC, деревья). нужно уменьшить размер. Вам нужно извлечь соответствующие слова, а затем использовать TfidfVectorizer.
Во-первых: у вас есть 122447 столбцов, затем используется TfidfVectorizer. Это проблема размерности. Второй: что ты хочешь сделать? Можно ли оставить 2-3 слова из одного всего текста? что влияет на содержание. Пример: Это очень хороший фильм. Из этого предложения можно взять только два слова, очень и хорошо.
О, это хорошая стратегия, я не думал об этом. Да, я мог бы реализовать фильтр для выбора конкретных слов, большое спасибо.
Да, ты прав. Я рад помочь вам
Я не понимаю. Что вы подразумеваете под извлечением слов в первую очередь? Нравится разбирать текст слово за словом? Как это может уменьшить размерность?