import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel("模擬數(shù)據(jù).xlsx")
from sklearn.model_selection import train_test_split
# 分割數(shù)據(jù)集
X = df.drop(['OP'], axis = 1)
y = df['OP']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3,
stratify=df['OP']) #分離訓(xùn)練集和測試
df.head()
先加載了一個(gè)多分類數(shù)據(jù)集,并將數(shù)據(jù)集拆分為特征變量和目標(biāo)變量,接著使用 train_test_split 方法將數(shù)據(jù)集分為訓(xùn)練集和測試集,確保模型能夠基于不同的數(shù)據(jù)進(jìn)行訓(xùn)練和測試,數(shù)據(jù)集的特征矩陣 X 包含所有用于分類的特征,而 y 是數(shù)據(jù)的分類標(biāo)簽,為了保證類別分布一致,我們使用 stratify 參數(shù)保持?jǐn)?shù)據(jù)集中的類別平衡,該數(shù)據(jù)集中的每一行代表某個(gè)中藥材在多個(gè)波長/頻率下的紅外光譜信息,第一列是對應(yīng)的中藥類別標(biāo)簽,后面的列是光譜強(qiáng)度值
from sklearn.svm import SVC
from hyperopt import fmin, tpe, hp
from sklearn.metrics import accuracy_score
from sklearn import svm
# 定義超參數(shù)空間
parameter_space_svc = {
'C': hp.loguniform('C', np.log(100), np.log(1000)),
'kernel': hp.choice('kernel', ['rbf', 'poly']), # 有時(shí)推薦只使用rbf核函數(shù)
'gamma': hp.loguniform('gamma', np.log(100), np.log(1000))
}
# 初始化計(jì)數(shù)器
count = 0
# 定義優(yōu)化目標(biāo)函數(shù)
def func(args):
global count
count += 1
print(f"\nIteration {count}: Hyperparameters - {args}")
# 創(chuàng)建SVM分類器,傳遞超參數(shù)
clf = svm.SVC(**args)
# 訓(xùn)練模型
clf.fit(X_train, y_train)
# 預(yù)測測試集
prediction = clf.predict(X_test)
# 計(jì)算準(zhǔn)確率
score = accuracy_score(y_test, prediction)
print(f'Test accuracy: {score}')
# 由于fmin函數(shù)默認(rèn)是最小化目標(biāo)函數(shù),所以返回負(fù)準(zhǔn)確率作為目標(biāo)
return -score
# 使用TPE算法進(jìn)行超參數(shù)優(yōu)化,最大評估次數(shù)為100
best = fmin(func, parameter_space_svc, algo=tpe.suggest, max_evals=100)
# 將最佳的核函數(shù)類型從索引值轉(zhuǎn)換為相應(yīng)的字符串
kernel_list = ['rbf', 'poly']
best['kernel'] = kernel_list[best['kernel']]
# 輸出最佳超參數(shù)
print('\nBest hyperparameters:', best)
SVM 模型有兩個(gè)關(guān)鍵的超參數(shù),即 C 和 gamma,分別控制決策邊界的平滑度和核函數(shù)的復(fù)雜度,為了提高模型的準(zhǔn)確率,需要對這些超參數(shù)進(jìn)行優(yōu)化,在本文中,通過 Hyperopt 庫實(shí)現(xiàn)基于貝葉斯優(yōu)化的超參數(shù)搜索
貝葉斯優(yōu)化的目標(biāo)是在超參數(shù)空間內(nèi)找到使模型性能最優(yōu)的超參數(shù)組合,我們通過定義超參數(shù)搜索空間,并采用TPE算法進(jìn)行搜索,定義的超參數(shù)空間如下:
接下來,定義優(yōu)化目標(biāo)函數(shù),該函數(shù)首先根據(jù)給定的超參數(shù)訓(xùn)練 SVM 模型,并在測試集上進(jìn)行預(yù)測,然后,計(jì)算模型的準(zhǔn)確率,作為目標(biāo)函數(shù)的評估指標(biāo),由于貝葉斯優(yōu)化中的 fmin 函數(shù)默認(rèn)是最小化目標(biāo)函數(shù),因此返回負(fù)準(zhǔn)確率作為優(yōu)化目標(biāo),經(jīng)過 100 次迭代尋找最佳的超參數(shù)組合
# 創(chuàng)建SVM分類器,并使用最佳超參數(shù)進(jìn)行配置
clf = SVC(
C=best['C'], # 懲罰項(xiàng)參數(shù)
kernel=best['kernel'], # 核函數(shù)類型,這里選擇徑向基函數(shù)(RBF)
gamma=best['gamma'], # 核函數(shù)系數(shù)
decision_function_shape='ovr', # 多分類問題時(shí)使用"ovr"(一對多)策略
cache_size=5000 # 緩存大小,單位為MB
)
# 使用訓(xùn)練數(shù)據(jù)進(jìn)行模型訓(xùn)練
clf.fit(X_train, y_train)
利用找到的最佳超參數(shù),構(gòu)建最終的 SVM 模型
分類報(bào)告
# 使用模型在測試集上進(jìn)行預(yù)測
y_pred= clf.predict(X_test)
from sklearn.metrics import classification_report
# 輸出模型報(bào)告, 查看評價(jià)指標(biāo)
print(classification_report(y_test, y_pred))
分類報(bào)告顯示了每個(gè)類別的精確率、召回率和F1值,這些指標(biāo)可以幫助評估模型在不同類別上的表現(xiàn)
from sklearn.metrics import confusion_matrix
# 計(jì)算混淆矩陣
confusion_matrix = confusion_matrix(y_test, y_pred)
# 繪制混淆矩陣
fig, ax = plt.subplots(figsize=(10, 7),dpi=1200)
cax = ax.matshow(confusion_matrix, cmap='Blues')
fig.colorbar(cax)
# 設(shè)置英文標(biāo)簽
ax.set_xlabel('Predicted')
ax.set_ylabel('Actual')
ax.set_xticks(np.arange(11))
ax.set_yticks(np.arange(11))
ax.set_xticklabels([f'Class {i}' for i in range(1, 12)])
ax.set_yticklabels([f'Class {i}' for i in range(1, 12)])
for (i, j), val in np.ndenumerate(confusion_matrix):
ax.text(j, i, f'{val}', ha='center', va='center', color='black')
plt.title('Confusion Matrix Heatmap')
plt.savefig('Confusion Matrix Heatmap.pdf', format='pdf', bbox_inches='tight')
plt.show()
為了更直觀地展示分類效果,最后繪制了混淆矩陣熱力圖,混淆矩陣展示了模型在各類別上的分類結(jié)果,包括正確分類的樣本數(shù)量和錯(cuò)誤分類的數(shù)量
本文展示了如何使用貝葉斯優(yōu)化對 SVM 模型進(jìn)行超參數(shù)調(diào)優(yōu),并將其應(yīng)用于多分類問題。相比于傳統(tǒng)的網(wǎng)格搜索和隨機(jī)搜索,貝葉斯優(yōu)化能更高效地找到最優(yōu)超參數(shù),減少了計(jì)算資源的消耗。最終的實(shí)驗(yàn)結(jié)果表明,通過優(yōu)化后的 SVM 模型能夠在測試集上取得較高的分類準(zhǔn)確率,并且分類效果在各類別上相對均衡?;煜仃嚭头诸悎?bào)告清晰展示了模型的性能,進(jìn)一步驗(yàn)證了優(yōu)化后模型的有效性,貝葉斯優(yōu)化為機(jī)器學(xué)習(xí)模型的調(diào)優(yōu)提供了一種強(qiáng)有力的工具,尤其在大規(guī)模超參數(shù)搜索問題中,能夠大幅提升效率和模型表現(xiàn)
文章轉(zhuǎn)自微信公眾號@Python機(jī)器學(xué)習(xí)AI