上述程式碼是一個簡單的線性迴歸模型訓練與預測範例,這範例中訓練資料包含了5筆 x, y 的資料,這些資料就是 (1,5), (2,7), (3,9), (4,11), (5,13)。 訓練好的模型再使用predict函數預測 x=6 時的 y的值。
所以當我們輸入預測值 x = 6 時, 通過模型得出 y = 2*6+3 = 15 所以程式碼中預測出來的值為[15] .
支持向量機(Support Vector Machines,SVM)
支持向量機 (Support Vector Machine, SVM) 是一種監督學習算法,用於分類和回歸分析。SVM 算法中最常用的是分類算法,這種分類算法稱為支持向量分類機 (Support Vector Classification, SVC)。
SVC算法的主要思路是找出一個將資料集分成兩個類別的最佳超平面(hyperplane)。超平面是一個n-1維的平面,其中 n 是資料集的特徵數量。在二維平面中,超平面就是一條直線,在三維平面中就是一個平面。
使用 sklearn 中的 SVC 的簡單流程是:
- 導入 SVC 模組。
- 建立 SVC 的物件。
- 使用 fit() 方法訓練模型。
- 使用 predict() 方法預測目標變量。
from sklearn.svm import SVC
#建立資料
x = [[1,2], [3,4], [5,6], [7,8]]
y = [0,1,1,0]
#建立模型
clf = SVC()
#訓練模型
clf.fit(x, y)
#預測
print(clf.predict([[6,7]]))
上面的程式碼是一個簡單的SVC分類模型訓練與預測的範例。在程式碼中,我們使用了訓練資料 x 和 y 進行訓練,x 是特徵資料,y 是類別標籤。最後,使用 predict() 方法預測輸入資料[6,7]對應的類別。
SVC 模型在分類時使用了核函數(Kernel),預設是 Radial basis function (RBF),但是也可以自訂核函數。
在這個程式中,使用了 [1,2], [3,4], [5,6], [7,8] 以及 [0,1,1,0] 的訓練數據來訓練 SVC 模型。在這個簡單的例子中,這個模型已經被訓練出來,並且應用到預測 [6,7] 這個新數據時。 根據我們給定的訓練數據,模型已經知道了每個類別的分布,所以當我們將新數據餵入預測時,模型就可以預測出這個數據對應的類別,在這個例子中,[6,7]對應的類別是0。
SVC特徵標準化 範例
from sklearn import preprocessing #特徵標準化
import numpy as np
from sklearn.model_selection import train_test_split #cross_validation 舊版 新版用model_selection
from sklearn.datasets import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as plt
#產生 300筆資料,2個特徵,random_state用來保證每次生成的數據集相同。
x,y = make_classification(n_samples=300,n_features=2,n_redundant=0,n_informative=2,
random_state=3,scale=100,n_clusters_per_class=1)
plt.scatter(x[:,0],x[:,1],c=y)
plt.show()
#SVC分類進行訓練
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
clf = SVC()
clf.fit(x_train,y_train)
print(clf.score(x_test,y_test))
#標準化
x = preprocessing.scale(x)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
clf = SVC()
clf.fit(x_train,y_train)
print(clf.score(x_test,y_test))
這程式中主要的作用是使用 sklearn 中的 SVC 分類模型訓練與測試。在程式的前半部分,我們使用 make_classification 產生 300 筆資料,2 個特徵,並且使用 scatter plot 畫出資料點。之後我們將資料分為訓練資料和測試資料,使用 SVC 進行訓練並且使用 clf.score() 計算測試準確率。
接著我們對資料進行標準化(Standardization),並且重新訓練模型,測試結果顯示出在標準化後的資料上,分類器的表現有了改善。 標準化是將資料轉換成01的範圍,或是-11的範圍,使得每個特徵的統計量都變成0,方差為1。
因為 SVM 這種演算法會受到特徵值範圍的影響,所以對於原本範圍差異較大的資料進行標準化,可以改善模型的表現。
這段程式碼主要是展示了標準化的重要性,當我們對資料進行標準化後,模型的表現更加穩定,準確率也有提升,所以在實際應用上,我們應該注意到這一點,對資料進行適當的標準化。
K-Fold Cross Validation 交叉驗證
K-Fold Cross Validation 是一種用來驗證模型準確率的方法,它透過把資料分成 k 份,每次選取其中一份作為驗證資料,其餘 k-1 份則作為訓練資料,重複 k 次,取平均值以獲得最終的模型準確率。這樣做有幾個好處:
- 每個資料都被當作驗證資料使用過一次,可以確保資料都有被使用到。
- 透過取平均值來解決資料分布不均的問題,避免overfitting
- 可以更精確的估計模型的準確率。
在使用scikit-learn 中可以使用KFold 來進行K-fold Cross Validation ,並可以設置 k 值。
範例
from sklearn import datasets
from sklearn.model_selection import KFold
from sklearn.svm import SVC
iris = datasets.load_iris()
X = iris.data
y = iris.target
kf = KFold(n_splits=5)
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
clf = SVC()
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
這程式主要是使用 K-Fold Cross Validation 對 SVM 模型進行訓練和驗證。
1.首先將 iris 資料讀入並將特徵資料存入 X 變數、標籤資料存入 y 變數。
2.使用 KFold(n_splits=5) 建立 K-Fold 物件,並將數據分成 5 組。
3.使用 for 迴圈對於每組數據執行訓練與驗證。
4.將訓練資料與測試資料分別存入 X_train, y_train, X_test, y_test 變數中。
5.使用 SVC() 建立 SVM 模型並進行訓練,訓練完後,使用 score() 方法驗證模型的準確率。
6.最後,將每次驗證的準確率印出。
這段程式中使用了 K-Fold Cross Validation 來對 SVM 模型進行訓練和驗證,將資料分成 5 組,每次將一組資料當作驗證資料,其餘的 4 組資料當作訓練資料,並印出每次的準確率。
範例
from sklearn.model_selection import cross_val_score
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import matplotlib.pyplot as plt
iris = datasets.load_iris()
X = iris.data
y = iris.target
knn = KNeighborsClassifier(n_neighbors=10)
scores = cross_val_score(knn,X,y,cv=5,scoring='accuracy')
print(scores)
print(scores.mean())
k_range = range(1,31)
k_scores = []
for k_number in k_range:
knn = KNeighborsClassifier(n_neighbors=k_number)
scores = cross_val_score(knn,X,y,cv=10,scoring='accuracy')
k_scores.append(scores.mean())
plt.plot(k_range,k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')
plt.show()
這程式主要是在使用 K-近鄰演算法 (K-NN) 對 iris 資料進行分類,並利用 K-fold Cross Validation 來驗證模型的準確率。
1.首先將 iris 資料讀入並將特徵資料存入 X 變數、標籤資料存入 y 變數。
2.以 KNeighborsClassifier(n_neighbors=10) 建立分類模型,並用 cross_val_score() 函數進行 K-fold Cross Validation,cv 參數設定為 5,並指定 scoring 為 accuracy,代表我們是以準確率來驗證模型。
3.印出 scores 和 scores.mean(),scores 為每次驗證模型的準確率結果, scores.mean() 為所有次驗證的準確率平均值。
4.建立一個 k_range 變數,並將 1~30 的值存入,然後用迴圈對每個 k_number 依序執行訓練與驗證。
在迴圈中,使用 KNeighborsClassifier(n_neighbors=k_number) 建立新的模型,再次使用 cross_val_score() 進行 K-fold Cross Validation,cv 參數設定為 10,將每次驗證的準確率平均值存入 k_scores 陣列。
5.最後將 k_range 和 k_scores 用 Matplotlib 繪製成圖形,並標記 x 軸、y 軸的標籤。
在整個程式中,第一次使用 k = 10 做模型,第二次則是將 k 的值從1到30,每一個 k 跑一次實驗,看哪個 k 值會得到最高的準確率。透過繪製圖形可以看到隨著k值增加,準確率是在提高的,但也有提高的幅度有所限制,隨著k值持續增加,準確率並不會有太大的提升
這段程式中使用了 K-fold Cross Validation 來驗證模型的準確率,並在不同的 k 值下,找出最佳的 k 值。
儲存模型 pip install joblib
範例
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import joblib
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.2)
# 訓練模型
clf = LogisticRegression()
clf.fit(X_train, y_train)
# 儲存模型
joblib.dump(clf, 'model.joblib')
# 載入模型
loaded_model = joblib.load('model.joblib')
print(loaded_model.score(X_test, y_test))
了解 基本的演算法後
參閱此三篇文章後,讓我們繼續往下學習~
卷積神經網路 (CNN)
import tensorflow as tf
from tensorflow import keras
# 建立模型
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(keras.layers.MaxPooling2D((2, 2)))
model.add(keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(keras.layers.MaxPooling2D((2, 2)))
model.add(keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(64, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
# 編譯模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 載入 CIFAR-10 資料集
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
x_train = x_train / 255.0
x_test = x_test / 255.0
# 訓練模型
model.fit(x_train, y_train, epochs=10, validation_split=0.1)
# 評估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(test_acc)
這個範例使用的是 CIFAR-10 資料集,其中包含 32x32 彩色圖像,並且每張圖像有 10 個類別。建立一個由三個卷積層和兩個全連接層組成的模型,然後使用 CIFAR-10 資料集訓練並評估模型。本範例僅提供示範性質,在實際應用時還需要調整各種參數,例如層數、激活函數、損失函數、訓練輪數等,以獲得最佳的模型性能。您還可以將這個模型修改為更複雜的架構,例如加入更多的卷積層和全連接層,或者使用預訓練模型,以提高準確率。