iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0

決策邊界(Decision Boundary)

分類問題:

  • 二元或多元分類問題

二元分類:

  • 決策邊界是一條線、曲線或超平面

多元分類:

  • 決策邊界是多維空間中的一個曲面或超平面

形狀和複雜度:

  • 取決於所使用的機器學習算法和特徵,線性或非線性

學習過程:

  • 模型會根據訓練數據來學習決策邊界。學習過程的目標是找到最佳的決策邊界,以最大程度地區分不同的類別

視覺化:

  • 幫助理解模型的性能和分類效果

分類效能:

  • 決策邊界的品質直接影響模型的分類效能,良好的決策邊界應該能夠正確地分類大多數測試數據點。

實作範例二 => ALL Kernels (sklearn)

  • scikit-learn 的 SVC 類別只支援以下幾種核函數:'linear'、'poly'、'rbf'、'sigmoid'。!!!
  • 有支援的:

LIBSVM(C/C++ 函式庫):

LIBSVM 是一個廣泛使用的 SVM 函式庫,它支援多種核函數,包括 'linear'、'polynomial'、'rbf'、'sigmoid' 等。您可以在 LIBSVM 的文檔中查找核函數的詳細資訊。

XGBoost(Python 函式庫):

XGBoost 是一個廣泛使用的梯度提升機函式庫,支援自定義的目標函數和核函數。您可以通過自定義函數的方式來實現 'triangular'、'gaussian' 和 'exponential' 核函數。

PyTorch(Python 深度學習框架):

PyTorch 是一個用於構建深度學習模型的框架,它提供了靈活的自定義函數的方式。您可以使用 PyTorch 自定義核函數來實現 'triangular'、'gaussian' 和 'exponential' 核函數。


from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
from sklearn import svm
from sklearn import metrics
from sklearn import datasets
from sklearn.model_selection import train_test_split


iris = datasets.load_iris()
X = iris.data
Y = iris.target

# 拆分成訓練集與測試集
X_train, X_test, Y_train, Y_test = train_test_split(
    X, Y, test_size=0.3, random_state=0)


# 創建模型
model_svm = svm.SVC(kernel='rbf', C=1, gamma='auto')

# 訓練模型
model_svm.fit(X_train, Y_train)

# 預測
pred_svm = model_svm.predict(X_test)

# 衡量準確率
accuracy = metrics.accuracy_score(pred_svm, Y_test)

print("rbf")
print("徑向基函數(Radial Basis Function, RBF Kernel")
#  K(x, y) = exp(-gamma * ||x - y||^2)
print(model_svm.predict(X_test))            # 印出測試的預測結果
print(Y_test)                                           # 印出測試答案
print(accuracy)  # 印出預測準度
#  print(model_svm.score(X_test,Y_test))

# ------------------------------------------------------------------

# 創建模型
model_svm = svm.SVC(kernel='linear', C=1, gamma='auto')

# 訓練模型
model_svm.fit(X_train, Y_train)

# 預測
pred_svm = model_svm.predict(X_test)

# 衡量準確率
accuracy = metrics.accuracy_score(pred_svm, Y_test)
print(accuracy)  # 輸出準確率
print("linear")
print("線性核函數(Linear Kernel)")
#  K(x, y) = exp(-gamma * ||x - y||^2)
print(model_svm.predict(X_test))            # 印出測試的預測結果
print(Y_test)                                           # 印出測試答案
print(accuracy)   # 印出預測準度

# ------------------------------------------------------------------

# 創建模型
model_svm = svm.SVC(kernel='poly', C=1, gamma='auto')

# 訓練模型
model_svm.fit(X_train, Y_train)

# 預測
pred_svm = model_svm.predict(X_test)

# 衡量準確率
accuracy = metrics.accuracy_score(pred_svm, Y_test)

print("poly")
print("多項式核函數(Polynomial Kernel)")
#  K(x, y) = exp(-gamma * ||x - y||^2)
print(model_svm.predict(X_test))            # 印出測試的預測結果
print(Y_test)                                           # 印出測試答案
print(accuracy)   # 印出預測準度

# ------------------------------------------------------------------

# 定義一個函數以繪製決策邊界


def plot_decision_boundary(X, y, model, title):
    h = .02  # 網格的步長

    # 創建色彩地圖
    cmap_light = plt.cm.viridis
    cmap_bold = plt.cm.viridis

    # 繪製決策邊界
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    #  X 在第一個特徵上的最小值和最大值,然後分別減去1和加上1。
    #  確保繪圖的邊界超出了數據點的範圍,以免數據點靠近圖的邊緣
    
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    # 將 xx 和 yy 中的二維網格轉換為一維
    # np.c_將這些一維數組組合
    
    Z = Z.reshape(xx.shape)
    # Z 重新塑造成與 xx 相同形狀的二維
    # 準備繪製決策邊界
    
    plt.figure()
    plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

    # 同時繪製訓練點
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold, edgecolor='k', s=20)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.title(title)


# 使用PCA將數據降維至2D以進行視覺化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 為每個核函數繪製決策邊界
kernels = ['rbf', 'linear', 'poly']
for kernel in kernels:
    model_svm = svm.SVC(kernel=kernel, C=1, gamma='auto')
    model_svm.fit(X_pca, Y)
    plot_decision_boundary(X_pca, Y, model_svm, f'SVM with {kernel} kernel')

plt.show()

#------------------------------------------------------------------

rbf
徑向基函數(Radial Basis Function, RBF Kernel
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 2 1 1 2 0 2 0 0]
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 1 1 1 2 0 2 0 0]
0.9777777777777777
0.9777777777777777

linear
線性核函數(Linear Kernel)
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 2 1 1 2 0 2 0 0]
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 1 1 1 2 0 2 0 0]
0.9777777777777777

poly
多項式核函數(Polynomial Kernel)
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 1 0 0 1 1 0 2 1 0 2 2 1 0
 2 1 1 2 0 2 0 0]
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 1 1 1 2 0 2 0 0]
0.9555555555555556

上一篇
[DAY19] 機器學習 - 支援向量機(一)
下一篇
[DAY21] 機器學習 - 分群與分類(一)
系列文
關於我從基礎程設轉職到人工智慧入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言