Как я могу оптимизировать алгоритмы sklearn KNN, GNB и SVC, чтобы сократить время выполнения?

В настоящее время я оцениваю, какой классификатор лучше всего подходит для задачи анализа настроений в обзорах фильмов. До сих пор я оценивал логистическую регрессию, линейную регрессию, случайный лес и дерево решений, но я также хочу рассмотреть модели 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("=========================================== = ")   

Есть ли способ настроить мой код, чтобы сократить время выполнения и сохранить или улучшить производительность моделей?

Я ожидаю настроить свой код, отдавая приоритет как эффективности, так и производительности.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

я пробую ваш код: затем я печатаю "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.

Я не понимаю. Что вы подразумеваете под извлечением слов в первую очередь? Нравится разбирать текст слово за словом? Как это может уменьшить размерность?

Juan Pablo G. 11.02.2023 23:27

Во-первых: у вас есть 122447 столбцов, затем используется TfidfVectorizer. Это проблема размерности. Второй: что ты хочешь сделать? Можно ли оставить 2-3 слова из одного всего текста? что влияет на содержание. Пример: Это очень хороший фильм. Из этого предложения можно взять только два слова, очень и хорошо.

Tornike Kharitonishvili 12.02.2023 05:41

О, это хорошая стратегия, я не думал об этом. Да, я мог бы реализовать фильтр для выбора конкретных слов, большое спасибо.

Juan Pablo G. 12.02.2023 07:59

Да, ты прав. Я рад помочь вам

Tornike Kharitonishvili 12.02.2023 08:01

Другие вопросы по теме