Двадцать девять машинного обучения SVM 3.

Python

Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность. нелинейный График SVM на нелинейных данных

from sklearn.datasets import make_circles
X,y = make_circles(100, factor=0.1, noise=.1)
 
X.shape
 
y.shape
 
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plt.show()

image.png

clf = SVC(kernel = "linear").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plot_svc_decision_function(clf)
clf.score(X,y)

image.png

2 Изучите производительность функций ядра на разных наборах данных

Функции ядра, отличные от «линейных», могут обрабатывать нелинейные ситуации, поэтому когда выбирать какую функцию ядра? К сожалению, очень мало исследований функций ядра в разных наборах данных, и несколько статей Google Scholar посвящены применению функций ядра в SVM, и больше о функциях ядра в глубоком обучении, нейронных Как использовать в сети. В sklearn также нет информации о том, как выбрать функцию ядра. Но в любом случае мы все равно можем выбрать функцию ядра, перебирая различные функции ядра, чтобы найти лучшую функцию ядра. Далее мы будем использовать пример для изучения производительности функций ядра на разных наборах данных. Теперь у нас есть ряд линейно или нелинейно разделимых данных, и мы хотели бы наблюдать за полезностью функции ядра, нанося границу решения SVC при разных функциях ядра и вычисляя точность классификации SVC при разных функциях ядра.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import svm#from sklearn.svm import SVC  两者都可以
from sklearn.datasets import make_circles, make_moons, make_blobs,make_classification
n_samples = 100
 
datasets = [
    make_moons(n_samples=n_samples, noise=0.2, random_state=0),
    make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1),
    make_blobs(n_samples=n_samples, centers=2, random_state=5),#分簇的数据集
    make_classification(n_samples=n_samples,n_features = 2,n_informative=2,n_redundant=0, random_state=5)
                #n_features:特征数,n_informative:带信息的特征数,n_redundant:不带信息的特征数
    ]
 
Kernel = ["linear","poly","rbf","sigmoid"]
 
#四个数据集分别是什么样子呢?
for X,Y in datasets:
    plt.figure(figsize=(5,4))
    plt.scatter(X[:,0],X[:,1],c=Y,s=50,cmap="rainbow")

image.png

image.pngМожно заметить, что линейные и полиномиальные функции ядра будут колебаться на нелинейных данных, работая хорошо, если данные относительно линейно разделимы, и плохо, если они полностью неразделимы, как кольцевые данные. На линейных наборах данных линейная функция ядра и полиномиальная функция ядра могут работать хорошо, даже если есть члены возмущения.Можно видеть, что полиномиальная функция ядра является более линейной функцией, хотя она также может обрабатывать нелинейные ситуации. Сигмовидная функция ядра более смущает. Она сильнее, чем две линейные функции ядра на нелинейных данных, но эффект, очевидно, не так хорош, как rbf. Она полностью уступает линейным функциям ядра на линейных данных, а устойчивость к помехам термины также относительно слабы, поэтому их функция относительно слаба и используется редко. rbf, функция ядра радиального базиса Гаусса в основном хорошо работает с любым набором данных и является относительно универсальной функцией ядра. Мой личный опыт в том, что в любом случае сначала попробуйте функцию ядра радиального базиса Гаусса. Она подходит для случая, когда ядро ​​преобразуется в очень высокое пространство. Часто хорошо работает в различных ситуациях. Если эффект rbf не хорош , то мы снова попробуем другую функцию ядра. Кроме того, функции полиномиального ядра в основном используются при обработке изображений.