鍵.png)
使用這些基本 REST API 最佳實(shí)踐構(gòu)建出色的 API
接下來作者將復(fù)現(xiàn)這一圖表,展示如何將模型的預(yù)測概率和PCA的降維結(jié)果結(jié)合,來更直觀地展現(xiàn)模型的分類性能,通過在二維空間中將預(yù)測概率與PCA的第一主成分結(jié)合,可以看到模型在不同類別上的分布情況,從而評(píng)估模型的分類效果,這種可視化方法對(duì)于理解模型的決策邊界、評(píng)估分類結(jié)果的可靠性、以及發(fā)現(xiàn)潛在誤分類樣本具有重要意義
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
# 讀取數(shù)據(jù)
df = pd.read_excel('2024-11-2-0公眾號(hào)Python機(jī)器學(xué)習(xí)AI—class.xlsx')
# 劃分特征和目標(biāo)變量
X = df.drop(['y'], axis=1)
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=df['y'])
讀取數(shù)據(jù)并將特征和目標(biāo)變量分離,然后將數(shù)據(jù)分為訓(xùn)練集和測試集,以便用于機(jī)器學(xué)習(xí)模型的訓(xùn)練和評(píng)估
from hyperopt import fmin, tpe, hp
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 定義超參數(shù)空間
parameter_space_rf = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 決策樹數(shù)量
'max_depth': hp.choice('max_depth', [5, 10, 20, None]), # 最大深度
'min_samples_split': hp.uniform('min_samples_split', 0.01, 0.5), # 分裂所需最小樣本比例
'min_samples_leaf': hp.uniform('min_samples_leaf', 0.01, 0.5) # 葉節(jié)點(diǎn)最小樣本比例
}
# 定義目標(biāo)函數(shù)
def objective(params):
# 初始化模型并傳入超參數(shù)
model = RandomForestClassifier(
n_estimators=params['n_estimators'],
max_depth=params['max_depth'],
min_samples_split=params['min_samples_split'],
min_samples_leaf=params['min_samples_leaf'],
random_state=42
)
# 模型擬合
model.fit(X_train, y_train)
# 測試集上的預(yù)測
y_pred = model.predict(X_test)
# 計(jì)算準(zhǔn)確率
accuracy = accuracy_score(y_test, y_pred)
# 返回負(fù)的準(zhǔn)確率(因?yàn)镠yperopt默認(rèn)最小化目標(biāo)函數(shù))
return -accuracy
# 運(yùn)行貝葉斯優(yōu)化
best_params = fmin(
fn=objective, # 目標(biāo)函數(shù)
space=parameter_space_rf, # 搜索空間
algo=tpe.suggest, # 貝葉斯優(yōu)化算法
max_evals=100 # 最大評(píng)估次數(shù)
)
# 顯示最優(yōu)參數(shù)
print("Best hyperparameters:", best_params)
# 使用最佳參數(shù)創(chuàng)建最終模型
best_model_class = RandomForestClassifier(
n_estimators=[50, 100, 200, 300][best_params['n_estimators']],
max_depth=[5, 10, 20, None][best_params['max_depth']],
min_samples_split=best_params['min_samples_split'],
min_samples_leaf=best_params['min_samples_leaf'],
random_state=42
)
# 在訓(xùn)練集上擬合模型
best_model_class.fit(X_train, y_train)
使用貝葉斯優(yōu)化(通過 Hyperopt 庫)來尋找隨機(jī)森林分類器的最佳超參數(shù)配置,并用優(yōu)化后的超參數(shù)訓(xùn)練最終的模型
# 預(yù)測類別的概率
probabilities = best_model_class.predict_proba(X_test)
# 創(chuàng)建一個(gè) DataFrame,列名為類別
probability_df = pd.DataFrame(probabilities, columns=[f'Prob_Class_{i}' for i in range(probabilities.shape[1])])
# 如果需要,可以添加 X_test 的索引或其他標(biāo)識(shí)列
probability_df.index = X_test.index
# 重置索引,并選擇是否保留原索引作為一列
probability_df.reset_index(drop=True, inplace=True)
probability_df.head()
計(jì)算模型在測試集上對(duì)每個(gè)類別的預(yù)測概率,并將結(jié)果存儲(chǔ)在一個(gè)帶有類別列名的 DataFrame 中
from sklearn.decomposition import PCA
df_selected = X_test
# 創(chuàng)建PCA對(duì)象,設(shè)置提取1個(gè)主成分
pca = PCA(n_components=1)
# 進(jìn)行PCA降維
pca_result = pca.fit_transform(df_selected)
# 獲取解釋方差比率(貢獻(xiàn)度)
explained_variance = pca.explained_variance_ratio_
# 將PCA結(jié)果保存為DataFrame,并用貢獻(xiàn)度標(biāo)記列名
pca_df = pd.DataFrame(pca_result, columns=[f"PC1 ({explained_variance[0]*100:.2f}%)"])
pca_df.head()
對(duì)測試集數(shù)據(jù)進(jìn)行PCA降維,將其壓縮到一個(gè)主成分中,并創(chuàng)建一個(gè)包含該主成分(帶有解釋方差百分比)的DataFrame
combined_df = pd.concat([probability_df, pca_df, y_test.reset_index(drop=True)], axis=1)combined_df.rename(columns={y_test.name: 'True'}, inplace=True)combined_df.head()
將預(yù)測概率、PCA結(jié)果和真實(shí)標(biāo)簽合并為一個(gè)DataFrame,以便于進(jìn)一步分析和可視化模型分類效果
colors = combined_df['True'].map({0: '#A0D6B4', 1: '#C3A6D8'})
# 繪制散點(diǎn)圖,設(shè)置更大的點(diǎn)和黑色邊框
plt.figure(figsize=(10, 6),dpi=1200)
plt.scatter(combined_df['Prob_Class_1'], combined_df['PC1 (69.29%)'],
c=colors, edgecolor='black', s=100) # s=100 增大點(diǎn)的大小,edgecolor='black' 添加黑色邊框
# 添加分界線和軸標(biāo)簽
plt.axvline(x=0.5, color='gray', linestyle='--')
plt.xlabel('Predicted value for GC')
plt.ylabel('PC1 (69.29%)')
plt.title('Test set')
# 添加類別圖例并移到圖外
for true_value, color, label in [(0, '#A0D6B4', 'NGC'), (1, '#C3A6D8', 'GC')]:
plt.scatter([], [], color=color, edgecolor='black', s=100, label=label)
plt.legend(title="Class", loc="center left", bbox_to_anchor=(1, 0.5))
plt.tight_layout(rect=[0, 0, 0.85, 1])
plt.savefig('1.pdf', format='pdf', bbox_inches='tight')
plt.show()
生成一個(gè)散點(diǎn)圖,用于可視化分類模型的預(yù)測效果,首先,根據(jù)真實(shí)類別 (True) 為數(shù)據(jù)點(diǎn)設(shè)置顏色,分別對(duì)應(yīng)不同類別(NGC和GC)。圖中,X軸表示模型對(duì)GC類別的預(yù)測概率,Y軸顯示PCA的第一主成分(解釋了數(shù)據(jù)69.29%的方差),通過繪制分界線(X=0.5)展示模型的決策閾值,圖例則在圖外標(biāo)識(shí)出不同類別(當(dāng)然作者這里是模擬數(shù)據(jù))
分類效果:大多數(shù)紫色點(diǎn)(GC)位于虛線右側(cè),綠色點(diǎn)(NGC)位于左側(cè),這表明模型在區(qū)分GC和NGC類別時(shí)有一定的效果,錯(cuò)誤分類:有少量綠色點(diǎn)在虛線右側(cè),和少量紫色點(diǎn)在左側(cè),這些可以認(rèn)為是誤分類的樣本,圖表展示了模型的分類效果及其對(duì)不同類別的信心,模型在區(qū)分GC和NGC類別方面表現(xiàn)不錯(cuò),但仍有少量誤分類的樣本,可以進(jìn)一步優(yōu)化模型或分析這些誤分類樣本的特征
# 預(yù)測類別的概率
probabilities = best_model_class.predict_proba(X_train)
# 創(chuàng)建一個(gè) DataFrame,列名為類別
probability_df = pd.DataFrame(probabilities, columns=[f'Prob_Class_{i}' for i in range(probabilities.shape[1])])
# 如果需要,可以添加 X_test 的索引或其他標(biāo)識(shí)列
probability_df.index = X_train.index
# 重置索引,并選擇是否保留原索引作為一列
probability_df.reset_index(drop=True, inplace=True)
df_selected = X_train
# 創(chuàng)建PCA對(duì)象,設(shè)置提取1個(gè)主成分
pca = PCA(n_components=1)
# 進(jìn)行PCA降維
pca_result = pca.fit_transform(df_selected)
# 獲取解釋方差比率(貢獻(xiàn)度)
explained_variance = pca.explained_variance_ratio_
# 將PCA結(jié)果保存為DataFrame,并用貢獻(xiàn)度標(biāo)記列名
pca_df = pd.DataFrame(pca_result, columns=[f"PC1 ({explained_variance[0]*100:.2f}%)"])
combined_df = pd.concat([probability_df, pca_df, y_train.reset_index(drop=True)], axis=1)
combined_df.rename(columns={y_train.name: 'True'}, inplace=True)
colors = combined_df['True'].map({0: '#A0D6B4', 1: '#C3A6D8'})
# 繪制散點(diǎn)圖,設(shè)置更大的點(diǎn)和黑色邊框
plt.figure(figsize=(10, 6),dpi=1200)
plt.scatter(combined_df['Prob_Class_1'], combined_df['PC1 (75.91%)'],
c=colors, edgecolor='black', s=100) # s=100 增大點(diǎn)的大小,edgecolor='black' 添加黑色邊框
# 添加分界線和軸標(biāo)簽
plt.axvline(x=0.5, color='gray', linestyle='--')
plt.xlabel('Predicted value for GC')
plt.ylabel('PC1 (75.91%)')
plt.title('Train set')
# 添加類別圖例并移到圖外
for true_value, color, label in [(0, '#A0D6B4', 'NGC'), (1, '#C3A6D8', 'GC')]:
plt.scatter([], [], color=color, edgecolor='black', s=100, label=label)
plt.legend(title="Class", loc="center left", bbox_to_anchor=(1, 0.5))
plt.tight_layout(rect=[0, 0, 0.85, 1])
plt.savefig('2.pdf', format='pdf', bbox_inches='tight')
plt.show()
也可以在訓(xùn)練集上繪制一個(gè)結(jié)合PCA主成分和模型預(yù)測概率的散點(diǎn)圖,可視化模型的分類效果,類似之前在測試集上的圖表,通過這種方法在訓(xùn)練集上展示模型對(duì)不同類別的區(qū)分能力
對(duì)于多分類模型,可以使用類似的可視化方法,將模型的預(yù)測概率與PCA主成分結(jié)合在散點(diǎn)圖上展示不同類別的分布情況,這種方法為每個(gè)樣本在不同類別中的預(yù)測概率和主成分值提供了直觀的展示。
文章轉(zhuǎn)自微信公眾號(hào)@Python機(jī)器學(xué)習(xí)AI
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)