от
Какими могут быть некоторые ключевые факторы для увеличения или стабилизации показателя точности (НЕ ДОЛЖНЫ значительно отличаться) этой базовой модели 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

Образец Матрицы Путаницы

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

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

2 Ответы

0 голосов
от
Я бы порекомендовал настроить значение
k
для k-NN. Поскольку iris - это небольшой набор данных, хорошо сбалансированный, я сделаю следующее: Для каждого значения `k` в диапазоне [от 2 до 10] (скажем)   Выполните перекрестную проверку n-кратных k-кратных значений (скажем, n = 20 и k = 4)     Сохраните значения точности (или любую другую метрику) Постройте оценки на основе среднего значения и дисперсии и выберите значение
k
с наилучшим значением k. Основной целью перекрестной проверки является оценка ошибки теста, и на основании этого вы выбираете окончательную модель. Будет некоторое отклонение, но оно должно быть меньше 0,03 или что-то в этом роде. Это зависит от набора данных и количества сгибов, которые вы берете. Один хороший процесс заключается в том, что для каждого значения
k
создайте блок-график всех значений точности 20x4. Выберите значение
k
, для которого нижний квантиль пересекает верхний квантиль, или, простыми словами, не слишком много изменений в точности (или других значениях метрики). После того, как вы выберете значение
k
на основании этого, цель состоит в том, чтобы использовать это значение для построения окончательной модели, используя весь набор обучающих данных. Далее это можно использовать для прогнозирования новых данных. С другой стороны, для больших наборов данных. Создайте отдельный тестовый раздел (как вы сделали здесь), а затем настройте значение
k
только на обучающем наборе (используя перекрестную проверку, забудьте о тестовом наборе). После выбора соответствующего алгоритма обучения
k
используйте только обучающий набор для обучения. Затем используйте набор тестов, чтобы сообщить окончательное значение. Никогда не принимайте никаких решений на основе тестового набора. Еще один метод - тренировка, проверка, тестирование. Тренируйтесь, используя набор поездов, и тренируйте модели, используя различные значения
k
, а затем прогнозируйте с помощью проверочного раздела и перечисляйте оценки. Выберите лучший результат на основе этого раздела проверки. Затем используйте поезд или поезд набор проверки для обучения окончательной модели с использованием значения
k
, выбранного на основе набора проверки. Наконец, выньте тестовый набор и сообщите окончательный результат. Опять же, никогда не используйте набор тестов где-либо еще. Это общие методы, применимые к любым методам машинного обучения или статистического обучения. Важно отметить, что при выполнении раздела (тренировка, тестирование или перекрестная проверка) используйте стратифицированную выборку, чтобы в каждом разделе коэффициенты классов оставались одинаковыми. Узнайте больше о перекрестной проверке. В scikitlearn это легко сделать. Если вы используете R, вы можете использовать каретку. Главное помнить, что цель состоит в том, чтобы обучить функцию, которая обобщает новые данные или хорошо работает с новыми данными, а не работает не только хорошо с существующими данными.     
0 голосов
от
В наборе данных радужной оболочки доступно только 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))
    
...