資料科學和人工智慧技術筆記 十五、支援向量機
十五、支援向量機
作者:Chris Albon
譯者:飛龍
校準 SVC 中的預測概率
SVC 使用超平面來建立決策區域,不會自然輸出觀察是某一類成員的概率估計。 但是,我們實際上可以通過一些技巧輸出校準的類概率。 在 SVC 中,可以使用 Platt 縮放,其中首先訓練 SVC,然後訓練單獨的交叉驗證邏輯迴歸來將 SVC 輸出對映到概率:
其中 和 是引數向量, 是第 個觀測點與超平面的有符號距離。 當我們有兩個以上的類時,使用 Platt 縮放的擴充套件。
在 scikit-learn 中,必須在訓練模型時生成預測概率。 這可以通過將SVC
的probability
設定為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 不平衡分類
在支援向量機中, 是一個超引數,用於確定對觀測的錯誤分類的懲罰。 處理支援向量機中處理不平衡類的一種方法是按類加權 。
其中 是錯誤分類的懲罰, 是與類 頻率成反比的權重, 是類 的 值。 一般的想法是,增加對少數類的錯誤分類的懲罰,來防止他們被多數類“淹沒”。
在 scikit-learn 中,當使用SVC
時,我們可以通過設定class_weight ='balanced'
來自動設定
的值.balance
引數自動對類進行加權,使得:
其中 是類 的權重, 是觀察數, 是類 中的觀測數, 是類的總數。
# 載入庫
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();
使用 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 值
如果特徵是類別的,計算每個特徵與目標向量之間的卡方(