Ошибка при нахождении опорных векторов
Пытаюсь найти опорные вектора. Но почему то у меня появляется ошибка:
Traceback (most recent call last):
File "F:\machine lerning\week_3\main.py", line 13, in <module>
clf.support_
AttributeError: 'SVC' object has no attribute 'support_'
Я вижу, что он выдает о том, что нет такого атрибута, но в документации по данной библиотеке он описан. https://scikit-learn.org/stable/modules/svm.html Вот мой код:
import pandas
from sklearn import svm
from sklearn.svm import SVC
data = pandas.read_csv('svm-data.csv', header=None)
x = data.iloc[0]
y = data.iloc[:,1]
clf = SVC(C=100000, kernel='linear', random_state=241)
clf.fit = (y, x)
print(clf.support_)
А это данные, по которым происходит обучение:
0.0 0.7 0.29
0 1.0 0.23 0.55
1 0.0 0.72 0.42
2 0.0 0.98 0.68
3 0.0 0.48 0.39
4 1.0 0.34 0.73
5 0.0 0.44 0.06
6 1.0 0.40 0.74
7 0.0 0.18 0.18
8 1.0 0.53 0.53
Ответы (1 шт):
Как говорилось в старом "политическом" анекдоте про сантехника: "Да тут всю систему менять надо!"
from sklearn.svm import SVC
SVC - это классификатор, а у вас данные непрерывные, а не дискретные, так что нужно воспользоваться регрессором:
from sklearn.svm import SVR
Далее. Что это такое?
x = data.iloc[0]
y = data.iloc[:,1]
Вам уже объясняли в другом вопросе, как должны выглядеть срезы для x и y. И для полной аутентичности добавлю, что X должен быть с большой буквы, потому что X - это матрица значений, а y - это вектор. Матрицы принято называть большими буквами:
X = data.iloc[:,:2] # столбцы 0 и 1
y = data.iloc[:,2] # столбец 2
Смотрим далее:
clf = SVC(C=100000, kernel='linear', random_state=241)
Как я уже сказал - будем использовать регрессор. И параметра random_state там нет:
clf = SVR(C=100000, kernel='linear')
Далее. Что это?!
clf.fit = (y, x)
Вы присваиваете полю fit модели clf кортеж (y, x). Это явно не то, что вам требовалось. Кормить модель данными нужно так:
clf.fit(X, y)
И вот уже после этого можете печатать support_, теперь он в модели есть:
print(clf.support_)
Дополнение "по вновь открывшимся обстоятельствам".
Целевая колонка у автора вопроса самая первая, и как можно видеть, она на самом деле целочисленная, хоть и представлена в виде с плавающей точкой. В таком случае можно использовать SVC (и random_state), но нужно опять же правильно подготовить данные. Например, так:
X = data.iloc[:,1:] # колонки 1, 2
y = data.iloc[:,0].astype(int) # колонка 0, приведённая к int
Остальной код тогда можно использовать ваш, ну, за исключением, конечно, тренировки модели:
clf.fit(X, y)