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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python机器学习 | SVM算法介绍及实现

發布時間:2023/12/31 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python机器学习 | SVM算法介绍及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇博客具體學習參考:
1 【機器學習】支持向量機SVM及實例應用
2 【ML】支持向量機(SVM)從入門到放棄再到掌握

這兩篇文章講得特別清楚,數學推導(第一篇)也能看明白,強烈推薦學習~~
本篇博文介紹僅在二維展開,以此推展到多維。整體思路大致為:
先整體介紹SVM,然后介紹線性可分樣本集下SVM的應用思路是如(重點概念,數學推導);接著推到非線性可分樣本集;最后介紹SVM的api應用和舉例實現

SVM算法介紹及實現

  • 1 SVM算法介紹-線性可分思路
    • 1.1 線性可分樣本集與非線性可分樣本集
      • 1.1.1 線性可分樣本集
      • 1.1.2 非線性可分樣本集
    • 1.2 分類間隔、超平面、支持向量
    • 1.3 SVM算法原理/分類應用(數學描述)
    • 1.4 例子展示線性可分的超平面計算過程
  • 2 SVM算法介紹-非線性可分思路
    • 2.1 軟間隔
    • 2.2 核函數
  • 3 SKlearn中使用SVM
    • 3.1 SVM的api介紹
    • 3.2 利用SVM進行乳腺癌檢測

1 SVM算法介紹-線性可分思路

SVM算法又稱為支持向量機,用于分類,優點是適用于小樣本和算法優美(此處優美表現在數學推導上)。

那么,其實分類算法我們已經介紹了幾種了,先來回顧一下

  • 邏輯回歸通過擬合曲線(或者學習超平面)實現分類;
  • 決策樹通過尋找最佳劃分特征進而學習樣本路徑實現分類;
  • 樸素貝葉斯是通過特征概率來預測分類。
  • 而現在介紹的SVM(支持向量機)則是通過尋找分類超平面進而最大化類別間隔實現分類;

    先來介紹一下SVM算法的分類類型,進而介紹SVM算法中提及的最大間隔,分類超平面,及其實現原理。

    1.1 線性可分樣本集與非線性可分樣本集

    1.1.1 線性可分樣本集

    線性可分樣本集:只要我們可以使用一條直線將樣本集完全分開,如圖1.

    1.1.2 非線性可分樣本集

    非線性可分樣本集:沒有辦法直接畫一條直線,只能用曲線等模式來分開的樣本集,如圖2

    1.2 分類間隔、超平面、支持向量

    下面整體的思路就是由線性可分樣本集推到非線性可分的問題
    基于線性可分樣本集,我們發現只要存在一條直線(一個超平面)可以將類1與類2進行分開。那也就說明實際上有無數條直線(超平面)可以將類1與類2分開。如下圖:
    那么問題來了:1 選擇哪一條直線(超平面)最好呢?

    從圖中可以得出,在樣本統計中,如果我們是允許誤差存在的。那么2號線(超平面)的容錯度可能更大一點,就是說線2更加robust,這個超平面離直線兩邊的數據的間隔最大,對訓練集的數據的局限性或噪聲有最大的“容忍”能力。

    接著,問題又來了,怎么取到2號線(2號超平面)的呢

    解答:隨機預測出某條線,然后將這條線進行平行移動,直到它交于某一個圈或某幾個圈為止;同理,又進行平移,直到交于某幾個星為止,這樣我們找到兩個相交的線,兩條相交線的間隔就是最大分類間隔,間隔的中點位置就是2號線位置。如下圖:

    所以,很顯然,d越大,也就說明紅色實線距離樣本點越遠,此時容錯率也就更高。所以我們的目標為:找分類間隔d最大的線,也就是尋找分類間隔最大的超平面。

    • 超平面:在二維中就是一條直線,在多維空間里它是一個N維的,我們可能無法想象,所以定義為超平面。

    • 支持向量:支持向量就是將平行線向左右移動,相交的樣本點就稱為支持向量。如圖中的紅點。所以也就是說,我們的支持向量機只與支持向量有關,與其它向量無關。

    1.3 SVM算法原理/分類應用(數學描述)

    在有對 線性可分樣本集與非線性可分樣本集 、分類間隔、超平面、支持向量的概念后,我們把它翻譯為數學語言,并說明SVM算法是如何應用的。

  • 定義訓練數據和標簽
    • xi:向量。實際上是訓練數據集的位置。注意這里是向量,不是支持向量,支持向量是離平面最近的點,也就是平面左右平移中第一個與之相交的點。

    • yi:標簽

      這里的類1:+1,是指在超平面上面,類2:-1,是指在超平面下面。這里是為了方便后面公式推導這樣假設的,不影響。

    • 超平面:這里再講一下(觀點與上面一樣)。那有了這個定義后,假設目標函數為一條直線。已知x,y,則需要求解兩個條件:w,b。得到方程如下:


    但是實際情況是,我們使用支持向量機解決的問題通常都不是簡單的二維問題,而是更高維度的。所以x、w如下:

    得到超平面模型為:

    補充:當f ( x )等于0的時候,x便是位于超平面上的點,而f ( x ) 大于0的點對應 y=1 的數據點,f ( x ) 小于0的點對應y=-1的點。f(x) = wTx + b

  • 訓練集線性可分的數學定義
    二維理解:如圖,及如上面的圖,1條線把圖分為兩類,在平面上方>0,在平面下方<0

    所以,同理可得對于超平面來說線性可分的定義如下:
  • 求解向量到超平面的距離
    • 回顧一下點到平面的距離公式:
      平面方程為Ax+By+Cz+D=0;點P的坐標(x0,y0,z0);d為點P到平面的距離公式如下:

      同理推導向量到超平面的距離
  • 優化目標,利用SVM求出合適的超平面進行分類
    • 確定目標
      現在我們的目標就是找出所有分類間隔中最大的那個值對應的超平面。而SVM 就是幫我們找到一個超平面,這個超平面能將不同的樣本劃分開,同時使得樣本集中的點到這個分類超平面的最小距離(即分類間隔)最大化。
    • 確定計算分類超平面的w和b的目標函數
      下面推導過程來自: 【機器學習】支持向量機SVM及實例應用





      凸函數形式特點:要么無解,要么只有一個極值。條件為1.目標函數:二次項 2.限制條件:一次項
      確定了目標函數,轉為凸函數形式的目標函數,我們就要來求w和b了
    • 利用拉格朗日乘子法求解w和b,進而求出超平面
      1)介紹拉格朗日乘子法
      設給定二元函數z=?(x,y)和附加條件φ(x,y)=0,為尋找z=?(x,y)在附加條件下的極值點。
      拉格朗日乘子法公式如下:

      2)代入式子:將目標函數以及約束條件代入式子??梢缘玫狡鋵ε紗栴}。具體來說,對式的每條約束添加拉格朗日乘子αi>=0,得到結果如下:

      分別對w求偏導為0、與對b求偏導為0,得到結果如下:

      消除w和b:

      將求解w,b的問題轉為了求α最大值的問題,求出α最大值后,代入回去就能計算w和b:



      是內積,具體為:

    1.4 例子展示線性可分的超平面計算過程

    數據:3個點。其中正例X1(3,3),X2(4,3),負例X3(1,1)

    目標函數(超平面的公式轉為求α最大值的問題):

    約束條件:
    (1)αi*yi的和為0
    (2)αi>=0 i=1,2,3
    那現在,我們就將數據代入到目標公式:


    那整個式子只與α1、α2有關。那我們需要將整個式子求解最大值。我們也轉換為求極小值。



    但是α2<0是不符合約束條件的。所以我們需要的這個解不在偏導為0的位置。思考,處于α1=0或者α2=0的邊界位置上。

    現在求得了α之后,我們其實是需要求解w,b的。

    2 SVM算法介紹-非線性可分思路

    下面我承線性可分思路,繼續將非線性可分思路。
    具體關于非線性可分思路的推導可以學習: 【機器學習】支持向量機SVM及實例應用
    本節只是做到把抽象概念形象化

    2.1 軟間隔

    • 軟間隔:假如數據是完全的線性可分的,那么學習到的模型可以稱為硬間隔支持向量機。換個說法,硬間隔指的就是完全分類準確,不能存在分類錯誤的情況。軟間隔,就是允許一定量的樣本分類錯誤

    當容忍一些樣本分類錯誤的線性可分模型,我們可以稱為近似線性可分。如下:

    那為了使樣本分類不那么嚴格,我們引入了松弛因子。構建新的目標函數:

    C為常數項,C的右邊部分為松弛因子。當常數項越大,松弛因子越小,說明軟間隔越小,相反,則軟間隔越大。
    同時,新的目標函數就是我們講的“軟間隔支持向量機”

    2.2 核函數

    對于非線性樣本集,不論多么高級的線性分類器,都無法處理。

    這時,我們需要引入一個新的概念:核函數。它可以將樣本從原始空間映射到一個更高維的特質空間中,使得樣本在新的空間中線性可分。這樣我們就可以使用原來的推導來進行計算,只是所有的推導是在新的空間,而不是在原來的空間中進行
    圖示:

    我們可以形象地理解為:桌子上零散地放著核桃和腰果兩種零食,我們要把它分類。那么假設我們用力且巧妙的一拍打,恰好可以把所有腰果跳出桌面,停在空中,那么我們用力且巧妙的一拍打就可以理解為是核函數。

    所以在非線性 SVM 中,核函數的選擇就是影響 SVM 最大的變量。最常用的核函數有線性核、多項式核、高斯核、拉普拉斯核、sigmoid 核,或者是這些核函數的組合。這些函數的區別在于映射方式的不同。通過這些核函數,我們就可以把樣本空間投射到新的高維空間中。

    常用的核函數為:

    3 SKlearn中使用SVM

    3.1 SVM的api介紹

    from sklearn import svm# 分類 svm.SVC # 都可以。控制核函數 svm.LinearSVC # 只針對線性核函數# 回歸 svm.SVR svm.LinearSVR from sklearn import svmsvm.SVC(C=1.0,kernel='rbf',gamma='scale' )
    • kernel:選擇的核函數
      • linear:線性核函數
      • 線性核函數,是在數據線性可分的情況下使用的, 運算速度快,效果好。不足在于它不能處理線性不可分的數據。
      • poly:多項式核函數
        • 多項式核函數可以將數據從低維空間映射到高維空間,但參數比較多,計算量大。
      • rbf:高斯核函數(默認)
        • 高斯核函數同樣可以將樣本映射到高維空間, 但相比于多項式核函數來說所需的參數比較少,通常性能不錯,所以是默認使用的核函數。
      • sigmoid:sigmoid 核函數
        • 了解深度學習的同學應該知道 sigmoid 經常用在神經網絡的映射中。 因此當選用 sigmoid 核函數時,SVM 實現的是多層神經網絡。
    • C:代表目標函數的懲罰系數,默認為1.0,也就是正則化,也就是軟間隔的調整
      • 當C越大時,分類器的準確性越高,所以容錯率越低,泛化能力就變差。
      • 當C越小時,分類器的準確性降低,但容錯率增大,泛化能力越強
    • gamma:和函數系數,默認為樣本特征的倒數。1/n_features

    3.2 利用SVM進行乳腺癌檢測

    from sklearn import svm import numpy as np import pandas as pd
  • 數據描述
  • """ 得出信息 - 569條樣本數據 - 字段:32個- 目標(標簽):diagnosis- B- M - 特征:除了標簽以外的字段- id對分類毫無意義:去除- 其它30個字段:mean,se,worst 分為三組""" df = pd.read_csv("svm_data.csv") df.info() df.head()



    2. 數據處理

    - B良性-->0 - M惡性-->1B映射為0 M映射為1 """ df["diagnosis"] = df["diagnosis"].map({"M":1,"B":0}) df """ id無用,刪除 """ df = df.drop("id",axis=1) df """ 特征字段分為三組 - _mean(特征均值)為一組 - _se(特征標準差)為一組 - _worst(特征最差值)為一組實現:[radius_mean,texture_mean...] """ features_mean = df.loc[:,"radius_mean":"fractal_dimension_mean"].columns.tolist() features_se = df.loc[:,"radius_se":"fractal_dimension_se"].columns.tolist() features_worst = df.loc[:,"radius_worst":"fractal_dimension_worst"].columns.tolist() print(features_mean,features_se,features_worst,sep="\n")
  • 特征篩選
  • """ 特征篩選原因: 30個特征很容易過擬合 訓練時間消耗過長 """ import seaborn as sns from matplotlib import pyplot as plt# 觀察樣本集 良性:0 與 惡性:1 數量情況 sns.countplot(df["diagnosis"]) plt.show()

    """ 篩選特征-->降維 - 選擇mean這組特征。在mean這組特征里面每個特征都一定需要嘛? - 觀察mean這組特征里面兩兩特征之間的相關性- 相關程度非常高:選擇其中一個作為代表即可 """ mean_corr = df[features_mean].corr() mean_corr""" 來進行相關性的可視化 - 熱力圖:顏色越淺說明相關程度越大- annot=True-->顯示每個方格的數據 """ plt.figure(figsize=(14,8)) sns.heatmap(mean_corr,annot=True) plt.show()""" 在此處: 得出來radius perimeter area 之間的相關程度很高。任意一個代表 得出來compatctness,concavity,concave_points 之間的相關程度很高。任意一個代表 """

    # 注意 在這個里面里面我們只拿了平均值的特征組,并且去掉一些相關性很大的特征,選擇了代表性特征,如下 features_remain = ['radius_mean','texture_mean','smoothness_mean','compactness_mean','symmetry_mean','fractal_dimension_mean']
  • 數據分割
  • """ 4 數據分割 """ from sklearn.model_selection import train_test_splittrain,test = train_test_split(df,test_size=0.3)# 構建訓練集 測試集 特征數組 train_X = train[features_remain] test_X = test[features_remain]# 構建 標簽 train_y = train["diagnosis"] test_y = test["diagnosis"]
  • 數據歸一化
  • """ 5 數據歸一化 """ from sklearn.preprocessing import StandardScalerss = StandardScaler() train_X = ss.fit_transform(train_X) test_X = ss.fit_transform(test_X)
  • 模型訓練及預測
  • """ 6 模型訓練及預測 """ from sklearn.svm import SVC model = SVC() model.fit(train_X,train_y)predictions = model.predict(test_X) predictions
  • 模型評價
  • """ 7 模型評價 """ from sklearn.metrics import accuracy_score accuracy_score(test_y,predictions) # 0.9298245614035088


    整體來說,效果相比我們之前的分類模型,效果可以說是很不錯滴,另外也可以選擇其他特征組,或者三個特征組一起加入~

    總結

    以上是生活随笔為你收集整理的python机器学习 | SVM算法介绍及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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