Почему при использовании KNN для несбалансированного набора данных установка scoring=’recall’ превращает все мои вероятности в двоичные?

#python #machine-learning #scikit-learn #knn #imblearn

#python #машинное обучение #scikit-learn #knn #imblearn

Вопрос:

Я имею дело с очень разреженным и несбалансированным набором данных, размерность которого я уменьшаю с помощью pca, а затем загружаю его в классификатор knn. В этом случае я не могу использовать SMOTE или пакет imblearn, и простая повышающая дискретизация не очень помогла, поэтому я не собираюсь исправлять дисбаланс прямо сейчас. Меня также больше интересуют результаты моей модели .predict_proba() , чем ее фактические прогнозы.

Когда я подгоняю модель scoring='roc_auc' , выводятся knn.predict_proba(test_X) непрерывные значения с плавающей запятой от 0 до 1, как я и ожидал. Однако, когда я scoring='recall' пытаюсь лучше предсказать класс меньшинства, вывод knn.predict_proba(test_X) всего либо 0.00001 или 1.00000 , и я не понимаю, почему. Если я сделаю то же самое с классификатором дерева решений с градиентным усилением, который я создал для той же проблемы, он по-прежнему выводит непрерывные значения при использовании scoring='roc_auc' .

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

Я хочу понять, что может привести к этому.

 pca = PCA()
knn = KNeighborsClassifier()
pipe = Pipeline(steps=[('pca', pca), ('knn', knn)])
#Define Parameters
param_grid = {
     'pca__n_components': [4, 7, 10, 20, 82],
     'knn__n_neigbors': [1,3,5,7,15],
     'knn__weights': ['uniform', 'distance'] 
     }
search = GridSearchCV(pipe, param_grid, n_jobs=-1, cv=10, verbose=3, scoring='recall')
======================================================================================
best_params_: {'pca__n_components': 82, 
               'knn__n_neighbors': 15, 
               'knn__weights': 'uniform'}
  

Комментарии:

1. KNeighborsClassifier не имеет scoring параметра… вы выполняете поиск по гиперпараметру?

2. Да, это было внутри search = GridSearchCV(pipe, param_grid, n_jobs=-1, cv=10, verbose=3, scoring='recall') . Я не знал, что у него нет scoring параметра… он запускается, но это определенно что-то меняет. Есть идеи, что это может быть?

3. Пожалуйста, добавьте это и определение pipe и param_grid к вопросу, а также best_params_ результат поиска. (Минимальный репрезентативный пример был бы лучшим, но этих фрагментов информации может быть достаточно, чтобы дать ответ.)

4. Ваш вопрос, похоже, указывает на то, что проблемы возникают из-за recall оценки, но какими будут наилучшие гиперпараметры при установке для него значения accuracy, которое по умолчанию?

5.Когда оценка установлена на 'accuracy' наилучшие параметры {'pca__n_components': 82, 'knn__n_neighbors': 5, 'knn__weights': 'uniform'} . Кроме того, вероятности различаются, когда я использую accuracy , вместо того, чтобы быть широким диапазоном непрерывных значений или двоичными, они либо 0.0 0.2 0.4 0.6 0.8 . Если KNeighborsClassifier scoring параметра нет, что меняется?