日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Hands On ML] 5. 支持向量机

發布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Hands On ML] 5. 支持向量机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 線性支持向量機分類
    • 2. 非線性支持向量機分類
      • 2.1 多項式核
      • 2.2 高斯 RBF 核
    • 3. 支持向量機回歸
    • 4. 原理

本文為《機器學習實戰:基于Scikit-Learn和TensorFlow》的讀書筆記。
中文翻譯參考

SVM 特別適合應用于復雜但中小規模數據集的分類問題。

可參考:《統計學習方法》支持向量機(Support Vector Machines,SVM) 筆記

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_samples=100, noise=0.15, random_state=1) def plot_dataset(X, y, axes):plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs")plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^")plt.axis(axes)plt.grid(True, which='both')plt.xlabel(r"$x_1$", fontsize=20)plt.ylabel(r"$x_2$", fontsize=20, rotation=0)plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) plt.show()

ploynomial_svm_clf = Pipeline((("ploy_features",PolynomialFeatures(degree=3)),("scaler",StandardScaler()),("svm_clf",LinearSVC(C=10, loss="hinge")) ))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, cmap=plt.cm.brg, alpha=0.2)plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.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(kernel="poly", degree=3, coef0=1, C=5))]) poly_kernel_svm_clf.fit(X, y)poly100_kernel_svm_clf = Pipeline([("scaler", StandardScaler()),("svm_clf", SVC(kernel="poly", degree=10, coef0=100, C=5))]) 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"$d=3, r=1, C=5$", fontsize=18) 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"$d=10, r=100, C=5$", fontsize=18)# 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(kernel="rbf", gamma=gamma, C=C))])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), fontsize=16)plt.show()

  • 增大 γ 使鐘型曲線更窄,在單個樣本周圍環繞
  • 較小 γ 使鐘型曲線更寬,樣本有更大的影響范圍,判定邊界最終則更加平滑
  • 如果模型過擬合,減小γ值,若欠擬合,增大γ

計算復雜度

3. 支持向量機回歸

回歸:在間隔內放置盡可能多的樣本點

from sklearn.svm import LinearSVR svm_reg = LinearSVR(epsilon=1.5, random_state=1)

間隔大小由 ?\epsilon? 控制

from sklearn.svm import SVR svm_poly_reg1 = SVR(kernel="poly", degree=2, C=100, epsilon=0.1, gamma="auto") svm_poly_reg2 = SVR(kernel="poly", degree=2, C=0.01, epsilon=0.1, gamma="auto")

多項式核化的非線性SVM

4. 原理

y^={0if?wTx+b<01if?wTx+b≥0\hat{y}=\left\{\begin{array}{l}0 \text { if } \mathbf{w}^{T} \mathbf{x}+b<0 \\ 1 \text { if } \mathbf{w}^{T} \mathbf{x}+b \geq 0\end{array}\right.y^?={0?if?wTx+b<01?if?wTx+b0?

  • 兩個平面的交界線,決策邊界
  • 虛線表示:決策函數等于 1 或 -1 的點:它們平行,且到決策邊界的距離相等,形成一個間隔
  • 訓練線性 SVM 分類器意味著找到w值和b值使得這一個間隔盡可能大,同時避免間隔違規(硬間隔)或限制它們(軟間隔)

總結

以上是生活随笔為你收集整理的[Hands On ML] 5. 支持向量机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。