鍵.png)
使用這些基本 REST API 最佳實踐構(gòu)建出色的 API
接下來作者將復現(xiàn)這一圖表,展示如何將模型的預測概率和PCA的降維結(jié)果結(jié)合,來更直觀地展現(xiàn)模型的分類性能,通過在二維空間中將預測概率與PCA的第一主成分結(jié)合,可以看到模型在不同類別上的分布情況,從而評估模型的分類效果,這種可視化方法對于理解模型的決策邊界、評估分類結(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公眾號Python機器學習AI—class.xlsx')
# 劃分特征和目標變量
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ù)并將特征和目標變量分離,然后將數(shù)據(jù)分為訓練集和測試集,以便用于機器學習模型的訓練和評估
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é)點最小樣本比例
}
# 定義目標函數(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_pred = model.predict(X_test)
# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
# 返回負的準確率(因為Hyperopt默認最小化目標函數(shù))
return -accuracy
# 運行貝葉斯優(yōu)化
best_params = fmin(
fn=objective, # 目標函數(shù)
space=parameter_space_rf, # 搜索空間
algo=tpe.suggest, # 貝葉斯優(yōu)化算法
max_evals=100 # 最大評估次數(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
)
# 在訓練集上擬合模型
best_model_class.fit(X_train, y_train)
使用貝葉斯優(yōu)化(通過 Hyperopt 庫)來尋找隨機森林分類器的最佳超參數(shù)配置,并用優(yōu)化后的超參數(shù)訓練最終的模型
# 預測類別的概率
probabilities = best_model_class.predict_proba(X_test)
# 創(chuàng)建一個 DataFrame,列名為類別
probability_df = pd.DataFrame(probabilities, columns=[f'Prob_Class_{i}' for i in range(probabilities.shape[1])])
# 如果需要,可以添加 X_test 的索引或其他標識列
probability_df.index = X_test.index
# 重置索引,并選擇是否保留原索引作為一列
probability_df.reset_index(drop=True, inplace=True)
probability_df.head()
計算模型在測試集上對每個類別的預測概率,并將結(jié)果存儲在一個帶有類別列名的 DataFrame 中
from sklearn.decomposition import PCA
df_selected = X_test
# 創(chuàng)建PCA對象,設置提取1個主成分
pca = PCA(n_components=1)
# 進行PCA降維
pca_result = pca.fit_transform(df_selected)
# 獲取解釋方差比率(貢獻度)
explained_variance = pca.explained_variance_ratio_
# 將PCA結(jié)果保存為DataFrame,并用貢獻度標記列名
pca_df = pd.DataFrame(pca_result, columns=[f"PC1 ({explained_variance[0]*100:.2f}%)"])
pca_df.head()
對測試集數(shù)據(jù)進行PCA降維,將其壓縮到一個主成分中,并創(chuàng)建一個包含該主成分(帶有解釋方差百分比)的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()
將預測概率、PCA結(jié)果和真實標簽合并為一個DataFrame,以便于進一步分析和可視化模型分類效果
colors = combined_df['True'].map({0: '#A0D6B4', 1: '#C3A6D8'})
# 繪制散點圖,設置更大的點和黑色邊框
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 增大點的大小,edgecolor='black' 添加黑色邊框
# 添加分界線和軸標簽
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()
生成一個散點圖,用于可視化分類模型的預測效果,首先,根據(jù)真實類別 (True) 為數(shù)據(jù)點設置顏色,分別對應不同類別(NGC和GC)。圖中,X軸表示模型對GC類別的預測概率,Y軸顯示PCA的第一主成分(解釋了數(shù)據(jù)69.29%的方差),通過繪制分界線(X=0.5)展示模型的決策閾值,圖例則在圖外標識出不同類別(當然作者這里是模擬數(shù)據(jù))
分類效果:大多數(shù)紫色點(GC)位于虛線右側(cè),綠色點(NGC)位于左側(cè),這表明模型在區(qū)分GC和NGC類別時有一定的效果,錯誤分類:有少量綠色點在虛線右側(cè),和少量紫色點在左側(cè),這些可以認為是誤分類的樣本,圖表展示了模型的分類效果及其對不同類別的信心,模型在區(qū)分GC和NGC類別方面表現(xiàn)不錯,但仍有少量誤分類的樣本,可以進一步優(yōu)化模型或分析這些誤分類樣本的特征
# 預測類別的概率
probabilities = best_model_class.predict_proba(X_train)
# 創(chuàng)建一個 DataFrame,列名為類別
probability_df = pd.DataFrame(probabilities, columns=[f'Prob_Class_{i}' for i in range(probabilities.shape[1])])
# 如果需要,可以添加 X_test 的索引或其他標識列
probability_df.index = X_train.index
# 重置索引,并選擇是否保留原索引作為一列
probability_df.reset_index(drop=True, inplace=True)
df_selected = X_train
# 創(chuàng)建PCA對象,設置提取1個主成分
pca = PCA(n_components=1)
# 進行PCA降維
pca_result = pca.fit_transform(df_selected)
# 獲取解釋方差比率(貢獻度)
explained_variance = pca.explained_variance_ratio_
# 將PCA結(jié)果保存為DataFrame,并用貢獻度標記列名
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'})
# 繪制散點圖,設置更大的點和黑色邊框
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 增大點的大小,edgecolor='black' 添加黑色邊框
# 添加分界線和軸標簽
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()
也可以在訓練集上繪制一個結(jié)合PCA主成分和模型預測概率的散點圖,可視化模型的分類效果,類似之前在測試集上的圖表,通過這種方法在訓練集上展示模型對不同類別的區(qū)分能力
對于多分類模型,可以使用類似的可視化方法,將模型的預測概率與PCA主成分結(jié)合在散點圖上展示不同類別的分布情況,這種方法為每個樣本在不同類別中的預測概率和主成分值提供了直觀的展示。
文章轉(zhuǎn)自微信公眾號@Python機器學習AI