1. 程式人生 > >【SciKit-Learn學習筆記】5:核SVM分類和預測乳腺癌資料集

【SciKit-Learn學習筆記】5:核SVM分類和預測乳腺癌資料集

學習《scikit-learn機器學習》時的一些實踐。


常用引數

引數C

SVM分類器svm.SVC()中的引數C即SVM所優化的目標函式
a r g m i n

( w 2 +
R i = 1 m ε
i
)
argmin \left( ||\pmb{w}||^2+R \sum_{i=1}^m \varepsilon_i \right)
中,鬆弛係數 ε \varepsilon 求和項的係數 R R

鬆弛係數 ε i \varepsilon_i 表徵了資料樣本 x ( i ) x^{(i)} 違反最大間距規則的程度。對大部分滿足約束條件的樣本,其鬆弛係數 ε i \varepsilon_i 為0;而對不滿足約束條件的樣本,其鬆弛係數 ε i \varepsilon_i 是大於0的。

所以鬆弛係數的求和項係數 R R 就是對違反最大間距規則的樣本的懲罰力度,懲罰越大越不能容忍有樣本不滿足約束條件。這一項類似於Logistic迴歸中引入正則化項,都是為了減少overfitting

引數degree

在多項式核中使用,表示使用的多項式的階數。

引數gamma

官方文件裡的原話是:

Kernel coefficient for ‘rbf’, ‘poly’ and ‘sigmoid’. If gamma is ‘auto’ then 1/n_features will be used instead.

對於多項式核,它是多項式核函式
K ( x ( i ) , x ( j ) ) = ( γ x ( i ) T x ( j ) + c ) n K\left(\pmb{x}^{(i)},\pmb{x}^{(j)}\right)=\left(\gamma \pmb{x}^{(i)T} \pmb{x}^{(j)} + c\right)^n
中的 γ \gamma

對於高斯核,它是徑向基函式
K ( x ( i ) , x ( j ) ) = e x p ( ( x ( i ) x ( j ) ) 2 2 σ 2 ) K\left(\pmb{x}^{(i)},\pmb{x}^{(j)}\right)=exp\left(-\frac{\left(\pmb{x}^{(i)}-\pmb{x}^{(j)}\right)^2}{2\sigma^2}\right)
中的 1 2 σ 2 \frac{1}{2\sigma^2}

繪製最大分類超平面

x號的點是支援向量。

from sklearn import svm
from sklearn.datasets import make_blobs
from matplotlib import pyplot as plt
import numpy as np


# 繪製分類超平面,其中X是有兩個特徵的,所以實際繪製出來就是在平面上的不同類別區域用不同顏色標記
# 這裡h是取樣步長,draw_sv指示是否繪製支援向量
def plot_hyperplane(clf, X, y,
                    h=0.02,
                    draw_sv=True,
                    title='hyperplan'):
    # 繪製的區間,x軸和y軸都從最小值-1到最大值+1
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    # 使用np.meshgrid()擴充為兩軸的所有可能取值的組合
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))

    plt.title(title)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.xticks(())
    plt.yticks(())

    # np.ravel()將取樣點的xy座標攤平,使用np.c_將其按列組合成[[x y][x y]...]的座標點形式
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    # 用繪製等高線圖的方式來繪製不同類別為不同顏色(等高線圖上同一高度為同一顏色)
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap='hot', alpha=0.5)

    # 不同類(標籤)展示在圖上的的標記和顏色
    markers = ['o', 's', '^']
    colors = ['b', 'r', 'c']
    # 可能的類(標籤)取值
    labels = np.unique(y)
    # 對於每種標籤取值
    for label in labels:
        # 繪製相應的樣本點,使用自己的標記和顏色
        plt.scatter(X[y == label][:, 0],
                    X[y == label][:, 1],
                    c=colors[label],
                    marker=markers[label])
    # 繪製支援向量
    if draw_sv:
        # 用該方式可以直接取出支援向量是哪些點
        sv = clf.support_vectors_
        # 繪製為白色'x',這樣就會貼在之前的有色點上了
        plt.scatter(sv[:, 0], sv[:, 1], c='y', marker='x')


if __name__ == '__main__':
    # 生成聚類樣本100個,特徵數為2(預設n_features=2),類別數為2,標準差0.3,隨機種子設為0
    X, y = make_blobs(n_samples=100, centers=2, random_state=0, cluster_std=0.3)
    # print(X,y)

    clf = svm.SVC(kernel='linear', C=1.0)
    clf.fit(X, y)

    plt.figure(figsize=(12, 4), dpi=144)
    plot_hyperplane(clf, X, y, h=0.01, title="最大分類超平面")
    plt.show()

執行結果:
在這裡插入圖片描述

比較三種核SVM的分類面

from sklearn import svm
from sklearn.datasets import make_blobs
from matplotlib import pyplot as plt
from z8.svc2 import plot_hyperplane

X, y = make_blobs(n_samples=100, centers=3, random_state=0, cluster_std=0.8)
# 線性核
clf_linear = svm.SVC(C=1.0, kernel='linear')
# 多項式核
clf_poly = svm.SVC(C=1.0, kernel='poly', degree=3)
# 高斯核(RBF核)
clf_rbf = svm.SVC(C=1.0, kernel='rbf', gamma=0.5)
clf_rbf2 = svm.SVC(C=1.0, kernel='rbf', gamma=1.0)

plt.figure(figsize=(10, 10), dpi=144)

clfs = [clf_linear, clf_poly, clf_rbf, clf_rbf2]
titles = ["線性核", "多項式核", "高斯核$\gamma=0.5$", "高斯核$\gamma=1.0$"]

# 分別訓練模型並繪製分類面.注意這裡用zip組成一個個元組組成的物件
for clf, i in zip(clfs, range(len(titles))):
    clf.fit(X, y)
    plt.subplot(2, 2, i + 1)
    plot_hyperplane(clf, X, y, title=titles[i])
plt.show()

執行結果:
在這裡插入圖片描述

預測乳腺癌資料集

這裡在最後一部分(迴圈中呼叫plot_learning_curve())總是會有反覆呼叫這個檔案自己的奇怪現象,全部放到函式裡就好了,還不清楚為什麼會有這種情況。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from z7.titanic import plot_curve  # 繪製score隨引數變化的曲線
import numpy as np
from sklearn.model_selection import GridSearchCV
from matplotlib import pyplot as plt
from z3.learning_curve import plot_learning_curve  # 繪製學習曲線
from sklearn.model_selection import ShuffleSplit

'''
SVM對乳腺癌資料集做分類
這裡全部需要放在函式裡呼叫,不然會來回呼叫這個檔案自己(還不清楚為什麼,這次不是檔案重名的問題)
'''


def init():
    global X, y, X_train, y_train, X_test, y_test
    cancer = load_breast_cancer()
    X = cancer.data
    y = cancer.target
    print("shape:{},陽性樣本數:{},陰性樣本數{}".format(X.shape, y[y == 1].shape[0], y[y == 0].shape[0])
            
           

相關推薦

SciKit-Learn學習筆記5SVM分類預測乳腺癌資料

學習《scikit-learn機器學習》時的一些實踐。 常用引數 引數C SVM分類器svm.SVC()中的引數C即SVM所優化的目標函式 a

SciKit-Learn學習筆記8k-均值演算法做文字聚類,聚類演算法效能評估

學習《scikit-learn機器學習》時的一些實踐。 原理見K-means和K-means++的演算法原理及sklearn庫中引數解釋、選擇。 sklearn中的KMeans from sklearn.datasets import make_blobs from m

SciKit-Learn學習筆記7PCA結合SVM做AT&T資料人物影象分類

學習《scikit-learn機器學習》時的一些實踐。 原理見PCA及繪製降維與恢復示意圖。 sklearn的PCA sklearn中包裝的PCA也是不帶有歸一化和縮放等預處理操作的,可以用MinMaxScaler()實現並裝在Pipeline裡封裝起來。 from

SciKit-Learn學習筆記6樸素貝葉斯做文件分類並繪製混淆矩陣

學習《scikit-learn機器學習》時的一些實踐。 條件獨立 樸素即指的是條件獨立假設,假設n個特徵之間不相關,則可據聯合概率的條件展開式: p

SciKit-Learn學習筆記4決策樹擬合泰坦尼克號資料集並提交到Kaggle

學習《scikit-learn機器學習》時的一些實踐。 決策樹擬合泰坦尼克號資料集 這裡用繪製引數-score曲線的方式去直觀看出模型引數對模型得分的影響,作者使用了GridSearchCV來自動做k-fold交叉驗證,並且能在多組模型引數中找到最優的一組和最優值(用平均s

SciKit-Learn學習筆記3線性迴歸測算波士頓房價,Logistic迴歸預測乳腺癌

學習《scikit-learn機器學習》時的一些實踐。 線性迴歸 這部分和第一篇筆記"繪製隨機波動樣本的學習曲線 "部分基本類似。線性迴歸裡可以加入多項式特徵,以對模型做增強。 線性迴歸增加多項式特徵,擬合sin函式 import numpy as np impor

SciKit-Learn學習筆記2kNN分類/迴歸,在糖尿病資料上的表現

學習《scikit-learn機器學習》時的一些實踐。 kNN分類 在三個點周圍生成聚類樣本,然後做的kNN分類。 這種把標準差取得好(不要太小),得到的就不一定是線性可分的資料了。比如圖上右側有個玫紅點和藍點交錯。 from sklearn.datasets.sa

SciKit-Learn學習筆記1SVM預測digits資料,繪製隨機波動樣本的學習曲線

學習《scikit-learn機器學習》時的一些實踐。 SVM預測digits資料集 sklearn裡的各種模型物件統一了介面,fit()做訓練,predit()做預測,用score()獲得對模型測試結果的打分。 這裡的打分不是acc,應該是決定係數。 檢視資料形式

Vue.js學習筆記5雙向資料繫結,計算屬性

雙向資料繫結 雙向資料繫結往往會用到input、select、textarea等表單標籤上,因為總是涉及一個數據資料的地方和輸出資料的地方。 當資料發生變化的時候,檢視也就發生變化,當檢視發生變化的時候,資料也會跟著同步變化。 資料雙向繫結,一定是對於UI控制元件來說的,

SQL Server學習筆記5使用INSERT語句插入資料

使用SQL語句的意義是,要開發的DBAS應用程式不能像人一樣通過SSMS工具來操作資料,SQL語句是應用程式和資料庫通訊的橋樑。而且相比手動圖形化操作,SQL語句更加方便和強大。 SQL(結構化查詢語言)的組成 ①DML(資料操作語言) 插入、刪除和修

TensorFlow學習筆記5variable_scopename_scope,圖的基本操作

學習《深度學習之TensorFlow》時的一些實踐。 variable_scope 一般的巢狀 上節有學到在巢狀scope中的變數,一般是: import tensorflow as tf # with tf.variable_scope("scopeA") as

MyBatis學習筆記5認識使用typeHandlers配置型別處理器

簡述 註冊了的型別處理器會用於處理下面兩種情形: 為PreparedStatement設定一個引數,將引數從Java型別轉為JDBC型別。 從ResultSet中取出一個值,將結果從JDBC型別轉為Java型別。 型別處理器可分為以下兩類: MyB

ML學習筆記5機器學習中的數學基礎5(張量,哈達瑪積,生成子空間,超平面,範數)

向量/矩陣/張量 向量 向量可以表示成一維陣列,每個分量可以理解為向量所表示的點在空間中座標的分量。 矩陣 矩陣可以表示成二維陣列,上節理解了矩陣可以理解為線性對映在特定基下的一種定量描述。 張量 張量可以表示成任意維的陣列,張量是向量概

MongoDB學習筆記5對結果的操作,建立/檢視/重建/刪除索引

對結果集的操作 在RDBMS中獲得的結果是一張虛擬的表,可以在其上繼續操作。MongoDB中查詢到的結果是一個文件集合,也可以在其上做一些簡單操作。 limit()方法 相當於SQL中的TOP子句,會取結果集中的前指定條文件,使用 結果集.limit(數

Vue.js學習筆記9使用npm搭建Vue-CLI腳手架並建立Vue專案

在第一篇的時候確實可以建立,這次跟著視訊搭建一次,比較一下和上次的區別,更正一下上次的錯誤操作,加深理解。 重新搭建Vue-CLI腳手架 在Node.js的安裝目錄下,刪除node_cache/和node_global下的所有內容,即讓Node處於剛剛安裝完成的狀態,連cnpm也

Vue.js學習筆記8建立多個Vue例項物件,認識Vue中的元件

建立多個Vue例項物件 這裡在同一個js檔案中建立了兩個Vue例項物件,它們各自能完成前面學的那些功能,同時使用物件名稱也可以互相訪問,協同實現一些功能。 index.html <!DOCTYPE html> <html lang="en" xmlns:v-

Vue.js學習筆記7v-for渲染,Vue的小Demo

v-for渲染 v-for是Vue中常用的列表渲染方法, 可以將一個列表渲染為一系列的HTML元素,也可以用來遍歷物件內的k-v對。另外關於模板元素渲染在官方文件上見這裡。 index.html <!DOCTYPE html> <html lang="en"

Vue.js學習筆記6動態繫結CSS樣式,條件渲染v-show

動態繫結CSS樣式 這部分涉及官方文件中的Class與Style繫結。 index.html <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:

Vue.js學習筆記4事件修飾符,鍵盤事件,鍵值修飾符

事件修飾符 在Vue的官方文件中給出了引入v-on:的事件修飾符的理念是,不希望在方法中去處理DOM細節。 事件冒泡 事件在事件源上發生,處理事件的方法並未繫結在該事件源上,事件就要向外或者向內傳播(propagation),也稱事件冒泡。在JS裡,可以用事件物件的stopP

Vue.js學習筆記3資料繫結,事件繫結

資料繫結 使用Vue時在Vue物件的el欄位中要指定一下根容器,這裡用id選擇器。這個例子同時學習了data和methods的基本用法。 資料繫結(data-binding)可以將Vue物件中的data的值繫結到HTML標籤中的某些位置,則修改時只需要修改物件中相應data的值即