Почему я не могу предсказать новые данные, используя SVM и KNN? - PullRequest
0 голосов
/ 15 декабря 2018

Я новичок в машинном обучении, и я только что изучил KNN и SVM с помощью sklearn.Как сделать прогноз для новых данных, используя SVM или KNN?Я пытался сделать оба прогноза.Они делают хороший прогноз только тогда, когда данные уже известны.Но когда я пытаюсь предсказать новые данные, они дают неверный прогноз.

Вот мой код:

import numpy as np
from sklearn import svm

x=np.array([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11]], dtype=np.float64)
y=np.array([2,3,4,5,6,7,8,9,10,11,12], dtype=np.float64)

clf = svm.SVC(kernel='linear')
clf.fit(x, y)
print(clf.predict([[20]]))
print(clf.score(x, y))

0utput:

[12.]
1.0

Этот код сделает хороший прогноз, если данные для прогнозирования находятся в диапазоне x_train,Но когда я пытаюсь предсказать, например, 20 или что-то выше диапазона x_train, вывод всегда будет 12, который является последним элементом y.Я не знаю, что я делаю неправильно в коде.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Код ведет себя так, как математически описывается машиной опорных векторов.

Вы должны понимать, как ваши данные интерпретируются алгоритмом.У вас есть 11 точек данных, и вы присваиваете каждому класс .В итоге SVM делит числовую линию на 11 сегментов (для определенных вами классов 11 ):

data = [(x, clf.predict([[x]])[0]) for x in np.linspace(1, 20, 300)] plt.scatter([p[0] for p in data], [p[1] for p in data]) plt.show()

SVM classes

Ответ AILearning расскажет вам, как решить вашу проблему с игрушкой, но убедитесь, что вы также понимаете, почему ваш код не выполняет то, о чем вы думали.Для любого конечного набора примеров существует бесконечно много функций, которые соответствуют данным.Ваша основная проблема в том, что вы путаете регрессию и классификацию.Судя по всему, вы хотите простую регрессионную модель для экстраполяции функции подгонки из точек данных, но ваш код предназначен для модели классификации.

0 голосов
/ 15 декабря 2018

Вы должны использовать модель регрессии, а не модель классификации.Для регрессии на основе SVM используйте svm.SVR ()

import numpy as np
from sklearn import svm

x=np.array([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11]], dtype=np.float64)
y=np.array([2,3,4,5,6,7,8,9,10,11,12], dtype=np.float64)

clf = svm.SVR(kernel='linear')
clf.fit(x, y)
print(clf.predict([[50]]))
print(clf.score(x, y))

output:

[50.12]
0.9996
...