На этом шаге мы приведем алгоритм и рассмотрим принцип его работы.
Можно ли создать собственный алгоритм SVM с помощью одной строки кода на Python? Взгляните на пример 4.9.
## Зависимости from sklearn import svm import numpy as np ## Данные: оценки студентов по (математика, языки, творческие ## способности) --> предмет для изучения X = np.array([[9, 5, 6, "computer science"], [10, 1, 2, "computer science"], [1, 8, 1, "literature"], [4, 9, 3, "literature"], [0, 1, 10, "art"], [5, 7, 9, "art"]]) ## Однострочник svm = svm.SVC().fit(X[:, :-1], X[:, -1]) ## Результат student_0 = svm.predict([[3, 3, 6]]) print(student_0) student_1 = svm.predict([[8, 1, 1]]) print(student_1)
Угадайте, что вернет этот код.
Из кода понятно, как применять (в простейшем варианте) метод опорных векторов на Python. В массиве NumPy содержатся маркированные обучающие данные, по одной строке на пользователя и одному столбцу на признак (способности студентов к математике, языкам и творческие способности). Последний столбец - метка (класс).
Поскольку данные у нас - трехмерные, метод опорных векторов разделяет их с помощью двумерных плоскостей (линейный разделитель), а не одномерных прямых. Как вы, наверное, видите, можно также разделять три класса, а не два, как в предыдущих примерах.
Сам однострочник очень прост: сначала мы создаем модель с помощью конструктора класса svm.SVC (SVC расшифровывается как support-vector classification - классификация с помощью опорных векторов). Далее мы вызываем функцию fit(), производящую обучение на основе наших маркированных обучающих данных.
В части "Результат" фрагмента кода мы вызываем функцию predict(), передавая ей новые наблюдения. Поскольку для student_0 указано математика = 3, языки = 3 и творческие способности = 6, то метод опорных векторов предсказывает, что способностям студента соответствует метка art. Аналогично, для student_1 с математика = 8, языки = 1 и творческие способности = 1 метод опорных векторов предсказывает, что способностям студента соответствует метка computer science.
Вот как выглядят итоговые результаты нашего однострочника:
## Результат student_0 = svm.predict([[3, 3, 6]]) print(student_0) # ['art'] student_1 = svm.predict([[8, 1, 1]]) print(student_1) ## ['computer science']
Резюмируя: SVM демонстрирует хорошие результаты даже в многомерных пространствах при количестве признаков, превышающем количество обучающих векторов данных. Идея максимизации "запаса прочности" вполне интуитивна и демонстрирует хорошие результаты даже при классификации граничных случаев (boundary cases) - векторов, попадающих в рамки этого "запаса прочности". В следующем шаге мы рассмотрим более общую картину - метаалгоритм классификации: обучение ансамблей с помощью случайных лесов.
На следующем шаге мы рассмотрим классификацию с помощью случайных лесов в одной строке кода.