机器学习:Python实现KERNEL SVM
在机器学习中,核方法是一类用于模式分析的算法,其最着名的成员是支持向量机(SVM)。模式分析的一般任务是在数据集中查找和研究一般类型的关系(例如聚类,排名,主成分,相关性,分类)。对于许多解决这些任务的算法,原始表示中的数据必须通过用户指定的特征映射显式转换为特征向量表示:相反,核方法只需要用户指定的核,即在原始的表示中,有两组数据点的相似函数。
核方法的名称来源于核函数的使用,这使得它们能够在高维,隐式特征空间中操作而无需计算该空间中数据的坐标,而是通过计算图像之间的内积的双特征空间中的数据。该操作通常在计算上比显着计算坐标便宜。这种方法称为“ 核技巧(kernel trick) ”。已经为序列数据,图形,文本,图像以及向量引入了核函数。
能够与核一起操作的算法包括核感知器,支持向量机(SVM),高斯过程,主成分分析(PCA),典型相关分析,岭回归,谱聚类,线性自适应滤波器等等。通过将核技巧应用于模型,可以将任何线性模型转换为非线性模型:通过核函数替换其特征(预测变量)。
大多数核算法都基于凸优化或特征问题,并且在统计上是有根据的。通常,使用统计学习理论(例如,使用Rademacher复杂性)分析它们的统计特性。
举一个例子,我们有一组观察,这里的目标是找到两个类别之间的决策边界。不幸的是,有些情况下数据不是线性可分的,我们无法绘制决策边界线:
这就是更高维空间发挥作用的地方。在一维数据集上,我们选择一个随机数,比方说5,我们从我们的独立变量x中减去这个值:
然后,通过平方函数,我们将能够在二维级别上划分数据集,并将所有内容投射回原始空间:
所以现在我们可以分割我们的数据集了,那就是当您在更高维度中映射某些东西时会发生什么。我们可以将相同的方法应用于我们的初始示例,并使用映射函数使我们的数据可以通过超平面分离:
这个技术的问题在于,映射到更高维度可能是计算机密集型的,并且在处理大量数据时这种方法可能会有问题。
但核技巧可以轻松解决这个问题!所以这里我们有高斯函数:
因此,让我们尝试分解这个公式:k代表核,它的函数应用于数据集的x向量点。l代表landmark,e代表esponent。它在视觉上看起来像图中间的尖端,我们把它投射到平面上,然后找到landmark:
如果我们取一个点,测量距离中心的距离,然后平方,这个距离将等于一个很大的数,最终会得到一个非常接近0的值。
事实上,当我们离得很远时,我们会接近0,当我们接近中心时,我们会接近1。我们将使用这个函数来分离我们的数据集,并在核函数周围取最优的圆,这样圆之外的所有值都是0,里面的所有值都在0到1之间:
请注意,如果我们增加sigma,我们将包含更多或更少的值:
并且这种计算仍然在我们原始的二维空间中发生,其不需要大量的计算强度。
如果在这里我们采用2个核函数,我们可以将相同的算法应用于更复杂的数据集:
要在Python上实现核算法,我们需要从sklearn.svm通过SVC类创建我们的分类器,并将核参数作为rbf输入:
# Data Preprocessing
# Importing the Library
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset= pd.read_csv('Data.csv')
X = dataset.iloc[: , [2, 3]].values
Y = dataset.iloc[: , 4].values
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
# Fitting Classifier to the Training set
from sklearn.svm import SVC
classifier = SVC(kernel = 'rbf', random_state = 0)
classifier.fit(X_train, y_train)
# Predicting the Test set results
y_pred = classifier.predict(X_test)
接下来,我们创建混淆矩阵并可视化我们的预测,Python代码如下:
# Data Preprocessing
# Importing the Library
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset= pd.read_csv('Data.csv')
X = dataset.iloc[: , [2, 3]].values
Y = dataset.iloc[: , 4].values
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
# Fitting Classifier to the Training set
from sklearn.svm import SVC
classifier = SVC(kernel = 'rbf', random_state = 0)
classifier.fit(X_train, y_train)
# Predicting the Test set results
y_pred = classifier.predict(X_test)
# Making the Confusion Matrix
fromsklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
# Visualising the Training set results
from matplotlib.colors import ListedColormap
X_set, Y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arrange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
np.arrange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)
plt.contourf(X1, X2, classifier.predict(np.array([X1.rave(), X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('red', 'Green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X1.min(), X1.max())
for i, j in emunerate(np.unique(y_set)):
plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1]
c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('SVC (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()
# Visualising the Test set results
from matplotlib.colors import ListedColormap
X_set, Y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arrange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
np.arrange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)
plt.contourf(X1, X2, classifier.predict(np.array([X1.rave(), X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('red', 'Green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X1.min(), X1.max())
for i, j in emunerate(np.unique(y_set)):
plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1]
c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('SVC (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()