网站网站开发设计,wordpress返回顶部插件,山东网站建站系统平台,智能建站大师官网平台文章目录1. 线性支持向量机分类2. 非线性支持向量机分类2.1 多项式核2.2 高斯 RBF 核3. 支持向量机回归4. 原理本文为《机器学习实战#xff1a;基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考
SVM 特别适合应用于复杂但中小规模数据集的分类问题。
可参考#…
文章目录1. 线性支持向量机分类2. 非线性支持向量机分类2.1 多项式核2.2 高斯 RBF 核3. 支持向量机回归4. 原理本文为《机器学习实战基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考
SVM 特别适合应用于复杂但中小规模数据集的分类问题。
可参考《统计学习方法》支持向量机Support Vector MachinesSVM 笔记
1. 线性支持向量机分类
硬间隔最大化数据必须线性可分间隔内无数据点软件间隔最大化允许部分点在间隔内甚至越过分类线使用超参数 c 控制 较小的 c惩罚小间隔更大较大的 c惩罚大间隔小 如果 SVM 模型过拟合可以尝试通过减小超参数C去调整 SVM 对特征缩放比较敏感 2. 非线性支持向量机分类
很多时候数据是线性不可分的我们可以增加特征下图左侧数据线性不可分增加 x2 项以后就可分了
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
import numpy as npX, y make_moons(n_samples100, noise0.15, random_state1)
def plot_dataset(X, y, axes):plt.plot(X[:, 0][y0], X[:, 1][y0], bs)plt.plot(X[:, 0][y1], X[:, 1][y1], g^)plt.axis(axes)plt.grid(True, whichboth)plt.xlabel(r$x_1$, fontsize20)plt.ylabel(r$x_2$, fontsize20, rotation0)plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.show()ploynomial_svm_clf Pipeline(((ploy_features,PolynomialFeatures(degree3)),(scaler,StandardScaler()),(svm_clf,LinearSVC(C10, losshinge))
))ploynomial_svm_clf.fit(X,y)def plot_predictions(clf, axes):x0s np.linspace(axes[0], axes[1], 100)x1s np.linspace(axes[2], axes[3], 100)x0, x1 np.meshgrid(x0s, x1s)X np.c_[x0.ravel(), x1.ravel()]y_pred clf.predict(X).reshape(x0.shape)y_decision clf.decision_function(X).reshape(x0.shape) # 样本点到分割超平面的函数距离plt.contourf(x0, x1, y_pred, cmapplt.cm.brg, alpha0.2)plt.contourf(x0, x1, y_decision, cmapplt.cm.brg, alpha0.1)plot_predictions(ploynomial_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])# save_fig(moons_polynomial_svc_plot)
plt.show()2.1 多项式核
添加多项式特征产生了大量的特征使模型变慢使用核技巧可以取得同等的效果同时没有特征组合爆炸
from sklearn.svm import SVCpoly_kernel_svm_clf Pipeline([(scaler, StandardScaler()),(svm_clf, SVC(kernelpoly, degree3, coef01, C5))])
poly_kernel_svm_clf.fit(X, y)poly100_kernel_svm_clf Pipeline([(scaler, StandardScaler()),(svm_clf, SVC(kernelpoly, degree10, coef0100, C5))])
poly100_kernel_svm_clf.fit(X, y)plt.figure(figsize(11, 4))
plt.subplot(121)
plot_predictions(poly_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.title(r$d3, r1, C5$, fontsize18)
plt.subplot(122)
plot_predictions(poly100_kernel_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.title(r$d10, r100, C5$, fontsize18)# save_fig(moons_kernelized_polynomial_svc_plot)
plt.show()如果模型过拟合可以减小多项式核的阶数欠拟合则增大阶数超参数 coef0 控制高阶多项式与低阶多项式对模型的影响
2.2 高斯 RBF 核
gamma1, gamma2 0.1, 5
C1, C2 0.001, 1000
hyperparams (gamma1, C1), (gamma1, C2), (gamma2, C1), (gamma2, C2)svm_clfs []
for gamma, C in hyperparams:rbf_kernel_svm_clf Pipeline([(scaler, StandardScaler()),(svm_clf, SVC(kernelrbf, gammagamma, CC))])rbf_kernel_svm_clf.fit(X, y)svm_clfs.append(rbf_kernel_svm_clf)plt.figure(figsize(11, 7))for i, svm_clf in enumerate(svm_clfs):plt.subplot(221 i)plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])gamma, C hyperparams[i]plt.title(r$\gamma {}, C {}$.format(gamma, C), fontsize16)plt.show()增大 γ 使钟型曲线更窄在单个样本周围环绕较小 γ 使钟型曲线更宽样本有更大的影响范围判定边界最终则更加平滑如果模型过拟合减小γ值若欠拟合增大γ
计算复杂度
3. 支持向量机回归
回归在间隔内放置尽可能多的样本点 from sklearn.svm import LinearSVR
svm_reg LinearSVR(epsilon1.5, random_state1)间隔大小由 ϵ\epsilonϵ 控制 from sklearn.svm import SVR
svm_poly_reg1 SVR(kernelpoly, degree2, C100, epsilon0.1, gammaauto)
svm_poly_reg2 SVR(kernelpoly, degree2, C0.01, epsilon0.1, gammaauto)多项式核化的非线性SVM
4. 原理
y^{0if wTxb01if wTxb≥0\hat{y}\left\{\begin{array}{l}0 \text { if } \mathbf{w}^{T} \mathbf{x}b0 \\ 1 \text { if } \mathbf{w}^{T} \mathbf{x}b \geq 0\end{array}\right.y^{0 if wTxb01 if wTxb≥0 两个平面的交界线决策边界虚线表示决策函数等于 1 或 -1 的点它们平行且到决策边界的距离相等形成一个间隔训练线性 SVM 分类器意味着找到w值和b值使得这一个间隔尽可能大同时避免间隔违规硬间隔或限制它们软间隔