статистические метрики для модели KNN с различными значениями K модели радужки? - PullRequest
1 голос
/ 09 февраля 2020

Я написал несколько python кодов для соответствия известному набору данных радужной оболочки с моделью KNN, я попытался с другим значением k, например, k = 2, k = 3, k = 5, насколько я понимаю, с этими различными значениями k, Матрица путаницы, оценка точности и значение отчета о классификации должны быть разными, однако, какое бы значение я не давал, выходные данные статистических метрик одинаковы, также «точность», «отзыв» и «оценка f1» равны 1,00. , как на снимке коды и вывод . Я что-то здесь упустил? Спасибо!

from sklearn.model_selection import train_test_split

# first split the dataset into its attributes and labels
X = data.iloc[:, :-1].values  
y = data.iloc[:, 4].values 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, 
random_state=42)

from sklearn.neighbors import KNeighborsClassifier

# Instantiate learning model (k = 5)
clf = KNeighborsClassifier(n_neighbors=5)
# Fitting the model
clf.fit(X_train, y_train)
# Predicting the Test set results
y_pred = clf.predict(X_test)
print(y_pred)

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score 

print(confusion_matrix(y_test, y_pred))
print(accuracy_score(y_test, y_pred))
print("classification report:---------------------------\n")
print(classification_report(y_test, y_pred, labels=iris.target))

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Скорее всего, вы допустили ошибку при загрузке и наборе данных и разбили их на X и y. Оформить это исправление. Это дает правильные результаты. Однако набор данных iris очень прост без большой мультиколлинеарности или гетероскедастичности . Это означает, что у knn не будет особых проблем с их идеальной классификацией, и вы не увидите большой разницы в выходных показателях при изменении параметров knn. Чтобы наблюдать изменения в drasti c, вы должны выбирать данные с более высокими трудностями.

from sklearn.model_selection import train_test_split
from sklearn import datasets

iris = datasets.load_iris()

# import some data to play with
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, 
random_state=42)

from sklearn.neighbors import KNeighborsClassifier

# Instantiate learning model (k = 5)
clf = KNeighborsClassifier(n_neighbors=10)
# Fitting the model
clf.fit(X_train, y_train)
# Predicting the Test set results
y_pred = clf.predict(X_test)
print(y_pred)

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score 

print(confusion_matrix(y_test, y_pred))
print(accuracy_score(y_test, y_pred))
print("classification report:---------------------------\n")
print(classification_report(y_test, y_pred, labels=iris.target))

Это показывает

[1 0 2 1 1 0 1 2 1 1 2 0 0 0 0 2 1 1 1 2 0 1 0 2 2 1 1 2 0 0 0 0 2 0 0 1 2
 0 0 0 1 2 2 0 0]
[[19  0  0]
 [ 0  8  5]
 [ 0  6  7]]
0.7555555555555555
classification report:---------------------------
...

Точность меняется при настройке параметров knn.

1 голос
/ 09 февраля 2020

Я думаю, что ваш вывод верен: вы получаете идеальную классификацию для своего тестового набора независимо от значения, которое вы выбираете для k. Набор данных радужной оболочки относительно прост. Существует только реальное совпадение между разновидностями лишайника и virginica, и то только для нескольких избранных экземпляров (возможно, 5-6 или около того). Проверьте этот сайт для некоторых графиков, которые показывают это. Поскольку вы тестируете только 30% данных, вполне вероятно, что этих нескольких образцов нет в вашем наборе тестов. Вы должны увидеть некоторые вариации, основанные на k, если вы запустите прогноз для всего набора данных.

Попробуйте изменить эти строки, чтобы увидеть его:

y_pred = clf.predict(X)
print(confusion_matrix(y, y_pred))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...