У меня очень простой код, использующий модель 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%, странных значений не будет?