Оценка точности для модели KNN (данные IRIS) - PullRequest
1 голос
/ 05 июля 2019

Какими могут быть некоторые ключевые факторы для увеличения или стабилизации показателя точности ( НЕ ДО значительно различаются) этой базовой модели KNN по данным IRIS?

Попытка

from sklearn import neighbors, datasets, preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

iris = datasets.load_iris() 
X, y = iris.data[:, :], iris.target

Xtrain, Xtest, y_train, y_test = train_test_split(X, y)
scaler = preprocessing.StandardScaler().fit(Xtrain)
Xtrain = scaler.transform(Xtrain)
Xtest = scaler.transform(Xtest)

knn = neighbors.KNeighborsClassifier(n_neighbors=4)
knn.fit(Xtrain, y_train)
y_pred = knn.predict(Xtest)

print(accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))

Показатели точности выборки

0.9736842105263158
0.9473684210526315
1.0
0.9210526315789473

Отчет о классификации

              precision    recall  f1-score   support

           0       1.00      1.00      1.00        12
           1       0.79      1.00      0.88        11
           2       1.00      0.80      0.89        15

    accuracy                           0.92        38
   macro avg       0.93      0.93      0.92        38
weighted avg       0.94      0.92      0.92        38

Пример матрицы путаницы

[[12  0  0]
 [ 0 11  0]
 [ 0  3 12]]

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

В наборе данных радужной оболочки доступно только 3 класса: Iris-Setosa, Iris-Virginica и Iris-Versicolor.

Используйте этот код.Это дает мне 97.78% точность

from sklearn import neighbors, datasets, preprocessing
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix

iris = datasets.load_iris() 
X, y = iris.data[:, :], iris.target
Xtrain, Xtest, y_train, y_test = train_test_split(X, y, stratify = y, random_state = 0, train_size = 0.7)

scaler = preprocessing.StandardScaler().fit(Xtrain)
Xtrain = scaler.transform(Xtrain)
Xtest = scaler.transform(Xtest)

knn = neighbors.KNeighborsClassifier(n_neighbors=3)
knn.fit(Xtrain, y_train)
y_pred = knn.predict(Xtest)

print(accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
1 голос
/ 05 июля 2019

Я бы рекомендовал настроить значение k для k-NN. Поскольку iris - это небольшой набор данных, хорошо сбалансированный, я сделаю следующее:

For every value of `k` in range [2 to 10] (say)
  Perform a n-times k-folds crossvalidation (say n=20 and k=4)
    Store the Accuracy values (or any other metric)

Нанесите оценки на основе среднего значения и дисперсии и выберите значение k с наилучшим значением k. Основной целью перекрестной проверки является оценка ошибки теста, и на основании этого вы выбираете окончательную модель. Будет некоторое отклонение, но оно должно быть меньше 0,03 или что-то в этом роде. Это зависит от набора данных и количества сгибов, которые вы берете. Один хороший процесс заключается в том, что для каждого значения k составьте коробочный график со всеми значениями точности 20x4. Выберите значение k, для которого нижний квантиль пересекает верхний квантиль, или, простыми словами, не слишком много изменений в точности (или других значениях метрики).

После того, как вы выберете значение k на основании этого, цель состоит в том, чтобы использовать это значение для построения окончательной модели, используя весь набор обучающих данных. Затем это можно использовать для прогнозирования новых данных.

С другой стороны, для больших наборов данных. Сделайте отдельный тестовый раздел (как вы делали здесь), а затем настройте значение k только на обучающем наборе (используя перекрестную проверку, забудьте о тестовом наборе). После выбора соответствующего k обучающего алгоритма используйте только обучающий набор для обучения. Затем используйте набор тестов, чтобы сообщить окончательное значение. Никогда не принимайте никаких решений на основе тестового набора.

Еще один метод - это тренировка, проверка, тестовый раздел. Тренируйтесь, используя набор поездов, и модели поездов, используя различные значения k, а затем прогнозируйте, используя раздел проверки и составьте список результатов. Выберите лучший результат на основе этого раздела проверки. Затем используйте поезд или поезд + набор проверки для обучения окончательной модели с использованием значения k, выбранного на основе набора проверки. Наконец, выньте тестовый набор и сообщите окончательный результат. Опять же, никогда не используйте набор тестов где-либо еще.

Это общие методы, применимые к любым методам машинного обучения или статистического обучения.

Важно отметить, что при выполнении раздела (поезд, тест или для перекрестной проверки) используйте стратифицированную выборку , чтобы в каждом разделе коэффициенты классов оставались одинаковыми.

Подробнее о кроссвалидация . В scikitlearn это легко сделать. Если вы используете R, вы можете использовать курсор .

Главное помнить, что цель состоит в том, чтобы обучить функцию, которая обобщает новые данные, или хорошо работает с новыми данными, а не работает не только хорошо с существующими данными.

...