Как защитить модель knn от предсказания классов вне диапазона? - PullRequest
2 голосов
/ 11 марта 2020

У меня очень простой код, использующий модель knn для классификации ирисов:

from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

data = load_iris()

X = pd.DataFrame(data=data.data, columns=data.feature_names)
y = pd.DataFrame(data=data.target, columns=['class'])
df = pd.concat([X, y], axis=1)
df.head()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train.values.ravel())
print('Score =', knn.score(X_test, y_test))

iris_1 = [7.1, 3.3, 6.1, 1.5]
iris_2 = [5.3, 3.5, 1.6, 0.3]
iris_3 = [15.1, 13.7, 12.9, 11.3]
iris_4 = [0.1, 0.2, 0.4, 0.5]

irises = [iris_1, iris_2, iris_3, iris_4]

print(knn.predict(irises))

Модель работает очень хорошо, однако я обнаружил одну проблему. Как вы можете видеть, iris_3 и iris_4 полностью вне диапазона, но модель все еще возвращает класс 2 для iris_3 и класс 0 для iris_4. Они должны быть помечены как «НЕИЗВЕСТНО» или что-то подобное. Я пробовал knnregression, но он возвращает что-то вроде 2.05 для iris_3, поэтому невозможно округлить его до другого класса, как в случае линейной регрессии. У меня вопрос, есть ли способ защитить модель от этого? Или я должен использовать эту модель только тогда, когда я уверен, что входные данные действительны на 100%, странных значений не будет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...