
使用這些基本 REST API 最佳實踐構建出色的 API
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('2024-11-6-公眾號Python機器學習AI—regression.xlsx')
from sklearn.model_selection import train_test_split, KFold
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)
從文件中加載數據,分離出特征和目標變量“待預測變量Y”,并將數據集劃分為訓練集(80%)和測試集(20%),為后續的機器學習建模做準備
利用貝葉斯優化提升XGBoost(回歸)模型性能
from hyperopt import fmin, tpe, hp
from xgboost import XGBRegressor
from sklearn.metrics import mean_squared_error
# 定義超參數搜索空間
parameter_space_xgb = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 決策樹數量
'max_depth': hp.choice('max_depth', [3, 5, 10, 15]), # 樹的最大深度
'learning_rate': hp.uniform('learning_rate', 0.01, 0.3), # 學習率
'subsample': hp.uniform('subsample', 0.5, 1.0), # 每棵樹的樣本采樣比例
'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1.0), # 每棵樹的特征采樣比例
'gamma': hp.uniform('gamma', 0, 5) # 剪枝所需的最小損失減少量
}
# 定義目標函數
def objective(params):
# 使用超參數創建XGBoost回歸模型
model = XGBRegressor(
n_estimators=params['n_estimators'],
max_depth=params['max_depth'],
learning_rate=params['learning_rate'],
subsample=params['subsample'],
colsample_bytree=params['colsample_bytree'],
gamma=params['gamma'],
random_state=42
)
# 在訓練集上擬合模型
model.fit(X_train, y_train)
# 在測試集上預測
y_pred = model.predict(X_test)
# 計算均方誤差(MSE)
mse = mean_squared_error(y_test, y_pred)
# 返回MSE,Hyperopt會最小化該目標值
return mse
# 運行超參數優化
best_params = fmin(
fn=objective, # 優化的目標函數
space=parameter_space_xgb, # 搜索空間
algo=tpe.suggest, # 貝葉斯優化算法
max_evals=100 # 最大評估次數
)
# 顯示最優超參數組合
print("Best hyperparameters:", best_params)
# 使用最佳超參數組合重新訓練模型
best_model_regression = XGBRegressor(
n_estimators=[50, 100, 200, 300][best_params['n_estimators']],
max_depth=[3, 5, 10, 15][best_params['max_depth']],
learning_rate=best_params['learning_rate'],
subsample=best_params['subsample'],
colsample_bytree=best_params['colsample_bytree'],
gamma=best_params['gamma'],
random_state=42
)
# 在訓練集上訓練模型
best_model_regression.fit(X_train, y_train)
使用Hyperopt庫中的貝葉斯優化方法,對XGBoost回歸模型的超參數進行自動化調優,目標是最小化模型在測試集上的均方誤差(MSE),首先,定義超參數搜索空間,包括決策樹的數量、最大深度、學習率、采樣比例、特征采樣比例和剪枝閾值等關鍵參數。然后,編寫目標函數,該函數使用給定參數組合構建XGBoost模型,在訓練集上擬合并在測試集上進行預測,最后返回測試誤差MSE。通過Hyperopt的 fmin 函數,在100次評估內找到能最小化MSE的最佳參數組合。找到最佳參數后,代碼會重新構建并訓練XGBoost模型,以確保最終模型能夠在最佳參數下實現最優的預測性能。這種優化流程不僅節省了手動調參的時間,還提高了模型的準確性,為后續的預測任務打下了堅實基礎
評估模型性能:訓練集與測試集的回歸指標對比
from sklearn import metrics
# 預測
y_pred_train = best_model_regression.predict(X_train)
y_pred_test = best_model_regression.predict(X_test)
y_pred_train_list = y_pred_train.tolist()
y_pred_test_list = y_pred_test.tolist()
# 計算訓練集的指標
mse_train = metrics.mean_squared_error(y_train, y_pred_train_list)
rmse_train = np.sqrt(mse_train)
mae_train = metrics.mean_absolute_error(y_train, y_pred_train_list)
r2_train = metrics.r2_score(y_train, y_pred_train_list)
# 計算測試集的指標
mse_test = metrics.mean_squared_error(y_test, y_pred_test_list)
rmse_test = np.sqrt(mse_test)
mae_test = metrics.mean_absolute_error(y_test, y_pred_test_list)
r2_test = metrics.r2_score(y_test, y_pred_test_list)
print("訓練集評價指標:")
print("均方誤差 (MSE):", mse_train)
print("均方根誤差 (RMSE):", rmse_train)
print("平均絕對誤差 (MAE):", mae_train)
print("擬合優度 (R-squared):", r2_train)
print("\n測試集評價指標:")
print("均方誤差 (MSE):", mse_test)
print("均方根誤差 (RMSE):", rmse_test)
print("平均絕對誤差 (MAE):", mae_test)
print("擬合優度 (R-squared):", r2_test)
計算并輸出XGBoost回歸模型在訓練集和測試集上的性能指標,包括均方誤差(MSE)、均方根誤差(RMSE)、平均絕對誤差(MAE)和擬合優度(R-squared),以評估模型在訓練集和測試集上的預測準確度和擬合效果,從而幫助判斷模型的泛化能力
模型預測可視化
通過計算置信區間來可視化XGBoost回歸模型的預測效果,展示預測值與真實值之間的擬合關系,首先,計算模型的擬合線,并使用殘差和樣本量估計出預測的均方誤差,進而基于95%置信水平和t分布計算出置信區間,在繪圖部分,生成一個包含以下元素的圖表:實際觀測值與預測值的散點圖、一條理想的1:1對角線、預測值的擬合線(包括模型的R2和MAE值),以及帶有擴展置信區間的陰影區域,最終,這個圖不僅展示了模型的擬合效果,還直觀地表明模型預測的可靠性和不確定性。
利用貝葉斯優化提升XGBoost(分類)模型性能
import pandas as pd
import numpy as np
from hyperopt import fmin, tpe, hp
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
# 讀取數據
df = pd.read_excel('2024-11-6-公眾號Python機器學習AI—class.xlsx')
# 劃分特征和目標變量
X = df.drop(['目標'], axis=1)
y = df['目標']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=df['目標'])
# 定義超參數空間
parameter_space_xgb = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 決策樹數量
'max_depth': hp.choice('max_depth', [3, 5, 10, 15]), # 最大深度
'learning_rate': hp.uniform('learning_rate', 0.01, 0.3), # 學習率
'subsample': hp.uniform('subsample', 0.5, 1.0), # 每棵樹的樣本采樣比例
'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1.0), # 每棵樹的特征采樣比例
'gamma': hp.uniform('gamma', 0, 5) # 剪枝所需的最小損失減少量
}
# 定義目標函數
def objective(params):
# 初始化XGBoost分類模型并傳入超參數
model = XGBClassifier(
n_estimators=params['n_estimators'],
max_depth=params['max_depth'],
learning_rate=params['learning_rate'],
subsample=params['subsample'],
colsample_bytree=params['colsample_bytree'],
gamma=params['gamma'],
random_state=42,
use_label_encoder=False,
eval_metric='logloss'
)
# 模型擬合
model.fit(X_train, y_train)
# 測試集上的預測
y_pred = model.predict(X_test)
# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
# 返回負的準確率(因為Hyperopt默認最小化目標函數)
return -accuracy
# 運行貝葉斯優化
best_params = fmin(
fn=objective, # 目標函數
space=parameter_space_xgb, # 搜索空間
algo=tpe.suggest, # 貝葉斯優化算法
max_evals=100 # 最大評估次數
)
# 顯示最優參數
print("Best hyperparameters:", best_params)
# 使用最佳參數創建最終模型
best_model_class = XGBClassifier(
n_estimators=[50, 100, 200, 300][best_params['n_estimators']],
max_depth=[3, 5, 10, 15][best_params['max_depth']],
learning_rate=best_params['learning_rate'],
subsample=best_params['subsample'],
colsample_bytree=best_params['colsample_bytree'],
gamma=best_params['gamma'],
random_state=42,
use_label_encoder=False,
eval_metric='logloss'
)
# 在訓練集上擬合模型
best_model_class.fit(X_train, y_train)
使用貝葉斯優化(Hyperopt庫)對XGBoost分類模型的超參數進行自動調優,以最大化分類模型在測試集上的準確率。首先,從Excel中加載數據并將其分為特征和目標變量,再劃分為訓練集和測試集。然后,定義超參數搜索空間,涵蓋決策樹數量、樹的最大深度、學習率、樣本和特征采樣比例,以及剪枝所需的損失減少量等關鍵參數,定義的目標函數會根據每組超參數組合訓練模型,并返回測試集上的負準確率,以便Hyperopt最小化該值來尋找到最佳超參數組合,完成優化后,代碼構建并訓練一個包含最佳超參數的最終XGBoost分類模型,以確保模型在最佳條件下達到最高的分類準確率,這種自動化調參方法不僅顯著提高模型性能,減少手動調參的時間和工作量
模型性能評估:多維度分類指標分析
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, classification_report
# 計算各項指標
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
# 如果是二分類且有預測概率值
try:
y_pred_proba = best_model_class.predict_proba(X_test)[:, 1] # 僅適用于二分類
auc = roc_auc_score(y_test, y_pred_proba)
except AttributeError:
auc = None # 對于多分類或無 predict_proba 時不適用
metrics_df = pd.DataFrame({
'Metric': [ 'AUC', 'Precision', 'Recall', 'F1 Score','Accuracy'],
'Value': [auc, precision, recall, f1, accuracy]
})
計算XGBoost分類模型在測試集上的多個評估指標,包括準確率(accuracy)、精確率(precision)、召回率(recall)、F1分數(F1 Score)和AUC(僅適用于二分類),這些指標各自反映模型不同方面的性能:準確率表示整體預測的準確程度,精確率關注正類預測的準確性,召回率衡量模型找到所有正類的能力,F1分數則平衡了精確率和召回率的權重。AUC則進一步評估了模型在不同閾值下區分正負類的能力。因此,使用多個指標能夠更全面地了解模型的表現,從而幫助我們避免因單一指標誤導而造成的模型優化偏差
模型預測可視化
繪制模型各評估指標的雷達圖,將不同性能指標如準確率、精確率、召回率等在極坐標上可視化,方便直觀對比模型在多個維度上的表現,從而幫助識別模型的優勢和改進方向,