1. 程式人生 > >資料科學和人工智慧技術筆記 十五、支援向量機

資料科學和人工智慧技術筆記 十五、支援向量機

十五、支援向量機

作者:Chris Albon

譯者:飛龍

協議:CC BY-NC-SA 4.0

校準 SVC 中的預測概率

SVC 使用超平面來建立決策區域,不會自然輸出觀察是某一類成員的概率估計。 但是,我們實際上可以通過一些技巧輸出校準的類概率。 在 SVC 中,可以使用 Platt 縮放,其中首先訓練 SVC,然後訓練單獨的交叉驗證邏輯迴歸來將 SVC 輸出對映到概率:

P ( y

= 1 x ) = 1 1 + e
( A f ( x ) +
B )
P(y=1 \mid x)={\frac {1}{1+e^{(A*f(x)+B)}}}

其中 A A B B 是引數向量, f f 是第 i i 個觀測點與超平面的有符號距離。 當我們有兩個以上的類時,使用 Platt 縮放的擴充套件。

在 scikit-learn 中,必須在訓練模型時生成預測概率。 這可以通過將SVCprobability設定為True來完成。 在訓練模型之後,我們可以使用predict_proba輸出每個類的估計概率。

# 載入庫
from sklearn.svm import SVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np

# 載入資料
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 標準化特徵
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 建立支援向量分類器物件
svc = SVC(kernel='linear', probability=True, random_state=0)

# 訓練分類器
model = svc.fit(X_std, y)

# 建立新的觀測
new_observation = [[.4, .4, .4, .4]]

# 檢視預測的概率
model.predict_proba(new_observation)

# array([[ 0.00588822,  0.96874828,  0.0253635 ]]) 

尋找最近鄰

# 載入庫
from sklearn.neighbors import NearestNeighbors
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np

# 載入資料
iris = datasets.load_iris()
X = iris.data
y = iris.target

在計算任何距離之前標準化我們的資料非常重要。

# 建立標準化器
standardizer = StandardScaler()

# 標準化特徵
X_std = standardizer.fit_transform(X)

# 根據歐氏距離找到三個最近鄰居(包括其自身)
nn_euclidean = NearestNeighbors(n_neighbors=3, metric='euclidean').fit(X)

# 列表的列表,表示每個觀測的 3 個最近鄰
nearest_neighbors_with_self = nn_euclidean.kneighbors_graph(X).toarray()

# 刪除距離自身最近的一個觀測
for i, x in enumerate(nearest_neighbors_with_self):
    x[i] = 0

# 檢視第一個觀測的兩個最近鄰
nearest_neighbors_with_self[0]

'''
array([ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.]) 
'''

尋找支援向量

# 載入庫
from sklearn.svm import SVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np

# 載入只有兩個分類的資料
iris = datasets.load_iris()
X = iris.data[:100,:]
y = iris.target[:100]

# 標準化特徵
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 建立支援向量物件
svc = SVC(kernel='linear', random_state=0)

# 訓練分類器
model = svc.fit(X_std, y)

# 檢視支援向量
model.support_vectors_

'''
array([[-0.5810659 ,  0.43490123, -0.80621461, -0.50581312],
       [-1.52079513, -1.67626978, -1.08374115, -0.8607697 ],
       [-0.89430898, -1.46515268,  0.30389157,  0.38157832],
       [-0.5810659 , -1.25403558,  0.09574666,  0.55905661]]) 
'''

# 檢視支援向量的下標
model.support_

# array([23, 41, 57, 98], dtype=int32) 

# 檢視每個分類的支援向量數
model.n_support_

# array([2, 2], dtype=int32) 

SVM 不平衡分類

在支援向量機中, C C 是一個超引數,用於確定對觀測的錯誤分類的懲罰。 處理支援向量機中處理不平衡類的一種方法是按類加權 C C

C k = C w j C_k = C * w_j

其中 C C 是錯誤分類的懲罰, w j w_j 是與類 j j 頻率成反比的權重, C j C_j 是類 j j C C 值。 一般的想法是,增加對少數類的錯誤分類的懲罰,來防止他們被多數類“淹沒”。

在 scikit-learn 中,當使用SVC時,我們可以通過設定class_weight ='balanced'來自動設定 C j C_j 的值.balance引數自動對類進行加權,使得:

w j = n k n j w_j = \frac{n}{kn_{j}}

其中 w j w_j 是類 j j 的權重, n n 是觀察數, n j n_j 是類 j j 中的觀測數, k k 是類的總數。

# 載入庫
from sklearn.svm import SVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np

# 載入只有兩個類別的資料
iris = datasets.load_iris()
X = iris.data[:100,:]
y = iris.target[:100]

# 通過刪除前 40 個觀察值使類高度不平衡
X = X[40:,:]
y = y[40:]

# 建立目標向量,表示類別是否為 0
y = np.where((y == 0), 0, 1)

# 標準化特徵
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 建立支援向量分類器
svc = SVC(kernel='linear', class_weight='balanced', C=1.0, random_state=0)

# 訓練分類器
model = svc.fit(X_std, y)

繪製支援向量分類器超平面

# 載入庫
from sklearn.svm import LinearSVC
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
import numpy as np
from matplotlib import pyplot as plt

# 載入只有兩個分類和兩個特徵資料
iris = datasets.load_iris()
X = iris.data[:100,:2]
y = iris.target[:100]

# 標準化特徵
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 建立支援向量分類器
svc = LinearSVC(C=1.0)

# 訓練模型
model = svc.fit(X_std, y)

在該視覺化中,類 0 的所有觀測都是黑色的,類 1 的觀測是淺灰色的。 超平面是決定新觀測如何分類的決策邊界。 具體而言,直線上方的任何觀察將分為類 0,而下方的任何觀測將分為類 1。

# 使用他們的類別繪製資料點和顏色
color = ['black' if c == 0 else 'lightgrey' for c in y]
plt.scatter(X_std[:,0], X_std[:,1], c=color)

# 建立超平面
w = svc.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-2.5, 2.5)
yy = a * xx - (svc.intercept_[0]) / w[1]

# 繪製超平面
plt.plot(xx, yy)
plt.axis("off"), plt.show();

png

使用 RBF 核時的 SVM 引數

在本教程中,我們將使用徑向基函式核(RBF)直觀地探索支援向量分類器(SVC)中兩個引數的影響。 本教程主要依據 Sebastian Raschka 的書 Python Machine Learning 中使用的程式碼。

# 匯入視覺化分類器的包
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import warnings

# 匯入執行分類的包
import numpy as np
from sklearn.svm import SVC

您可以忽略以下程式碼。 它用於視覺化分類器的決策區域。 但是,本教程中,不瞭解函式的工作原理並不重要。

def versiontuple(v):
    return tuple(map(int, (v.split("."))))

def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):

    # 配置標記生成器和顏色表
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    # 繪製決策平面
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())

    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],
                    alpha=0.8, c=cmap(idx),
                    marker=markers[idx], label=cl)

    # 高亮測試樣本
    if test_idx:
        # plot all samples
        if not versiontuple(np.__version__) >= versiontuple('1.9.0'):
            X_test, y_test = X[list(test_idx), :], y[list(test_idx)]
            warnings.warn('Please update to NumPy 1.9.0 or newer')
        else:
            X_test, y_test = X[test_idx, :], y[test_idx]

        plt.scatter(X_test[:, 0],
                    X_test[:, 1],
                    c='',
                    alpha=1.0,
                    linewidths=1,
                    marker='o',
                    s=55, label='test set')

在這裡,我們生成一些非線性可分的資料,我們將用它們訓練我們的分類器。 此資料類似於您的訓練資料集。 我們的y向量中有兩個類:藍色x和紅色方塊。

np.random.seed(0)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0,
                       X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)

plt.scatter(X_xor[y_xor == 1, 0],
            X_xor[y_xor == 1, 1],
            c='b', marker='x',
            label='1')
plt.scatter(X_xor[y_xor == -1, 0],
            X_xor[y_xor == -1, 1]
            
           

相關推薦

資料科學人工智慧技術筆記 支援向量

十五、支援向量機 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 校準 SVC 中的預測概率 SVC 使用超平面來建立決策區域,不會自然輸出觀察是某一類成員的概率估計。 但是,我們實際上可以通過一些技巧輸出校準的類概率。

資料科學人工智慧技術筆記 線性迴歸

十一、線性迴歸 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 新增互動項 # 載入庫 from sklearn.linear_model import LinearRegression from sklearn.d

資料科學人工智慧技術筆記 K 最近鄰

十四、K 最近鄰 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 確定 K 的最佳值 # 載入庫 from sklearn.neighbors import KNeighborsClassifier from skl

資料科學人工智慧技術筆記 邏輯迴歸

十二、邏輯迴歸 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 C 超引數快速調優 有時,學習演算法的特徵使我們能夠比蠻力或隨機模型搜尋方法更快地搜尋最佳超引數。 scikit-learn 的LogisticRegre

資料科學人工智慧技術筆記 Keras

十八、Keras 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 新增丟棄 # 載入庫 import numpy as np from keras.datasets import imdb from keras.pr

資料科學人工智慧技術筆記 聚類

十七、聚類 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 凝聚聚類 # 載入庫 from sklearn import datasets from sklearn.preprocessing import Stan

資料科學人工智慧技術筆記 樸素貝葉斯

十六、樸素貝葉斯 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 伯努利樸素貝葉斯 伯努利樸素貝葉斯分類器假設我們的所有特徵都是二元的,它們僅有兩個值(例如,已經是獨熱編碼的標稱分類特徵)。 # 載入庫 import

資料科學人工智慧技術筆記 資料整理(下)

十九、資料整理(下) 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 連線和合並資料幀 # 匯入模組 import pandas as pd from IPython.display import display from

資料科學人工智慧技術筆記 資料整理(上)

十九、資料整理(上) 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 在 Pandas 中通過分組應用函式 import pandas as pd # 建立示例資料幀 data = {'Platoon': ['A','A

資料科學人工智慧技術筆記 模型選擇

十、模型選擇 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 在模型選擇期間尋找最佳預處理步驟 在進行模型選擇時,我們必須小心正確處理預處理。 首先,GridSearchCV使用交叉驗證來確定哪個模型表現最好。 然而,在交

資料科學人工智慧技術筆記 文字預處理

五、文字預處理 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 詞袋 # 載入庫 import numpy as np from sklearn.feature_extraction.text import Coun

資料科學人工智慧技術筆記統計學

二十一、統計學 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 貝塞爾校正 貝塞爾的校正是我們在樣本方差和樣本標準差的計算中使用 n

資料科學人工智慧技術筆記資料視覺化

二十、資料視覺化 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 MatPlotLib 中的雙向條形圖 %matplotlib inline import pandas as pd import matplotlib.py

資料科學人工智慧技術筆記日期時間預處理

六、日期時間預處理 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 把日期和時間拆成多個特徵 # 載入庫 import pandas as pd # 建立資料幀 df = pd.DataFrame() # 建立五個日期

資料科學人工智慧技術筆記影象預處理

四、影象預處理 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 影象二值化 # 載入庫 import cv2 import numpy as np from matplotlib import pyplot as plt

資料科學人工智慧技術筆記資料預處理

三、資料預處理 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 為 Scikit-Learn 轉換 Pandas 類別資料 # 匯入所需的庫 from sklearn import preprocessing import

資料科學人工智慧技術筆記資料準備

二、資料準備 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 從字典載入特徵 from sklearn.feature_extraction import DictVectorizer staff = [{'name':

資料科學人工智慧技術筆記向量矩陣陣列

一、向量、矩陣和陣列 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 轉置矩陣或向量 # 載入庫 import numpy as np # 建立向量 vector = np.array([1, 2, 3, 4, 5, 6

資料科學人工智慧技術筆記模型驗證

九、模型驗證 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 準確率 # 載入庫 from sklearn.model_selection import cross_val_score from sklearn.li

資料科學人工智慧技術筆記特徵選擇

八、特徵選擇 作者:Chris Albon 譯者:飛龍 協議:CC BY-NC-SA 4.0 用於特徵選取的 ANOVA F 值 如果特徵是類別的,計算每個特徵與目標向量之間的卡方(