
使用這些基本 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-10-31-公眾號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)
from hyperopt import fmin, tpe, hp
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
# 定義超參數搜索空間
parameter_space_rf = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 決策樹數量
'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) # 葉節點最小樣本比例
}
# 定義目標函數
def objective(params):
# 使用超參數創建隨機森林回歸模型
model = RandomForestRegressor(
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)
# 計算均方誤差(MSE)
mse = mean_squared_error(y_test, y_pred)
# 返回MSE,Hyperopt會最小化該目標值
return mse
# 運行超參數優化
best_params = fmin(
fn=objective, # 優化的目標函數
space=parameter_space_rf, # 搜索空間
algo=tpe.suggest, # 貝葉斯優化算法
max_evals=100 # 最大評估次數
)
# 顯示最優超參數組合
print("Best hyperparameters:", best_params)
# 使用最佳超參數組合重新訓練模型
best_model_regression = RandomForestRegressor(
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_regression.fit(X_train, y_train)
利用貝葉斯優化(通過hyperopt庫)來自動調整隨機森林回歸模型的超參數,以最小化測試集上的均方誤差(MSE)。首先,定義了一個超參數空間,包括決策樹數量、最大深度、最小分裂樣本比例和最小葉子樣本比例,接著,定義目標函數以構建并評估隨機森林模型,將模型在測試集上的MSE作為優化目標,通過fmin函數使用貝葉斯優化搜索最佳參數組合,并用該組合重新訓練最終的隨機森林模型,從而獲得更優的預測性能
評估模型性能:訓練集與測試集的回歸指標對比
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)
計算并輸出隨機森林回歸模型在訓練集和測試集上的性能指標,包括均方誤差(MSE)、均方根誤差(RMSE)、平均絕對誤差(MAE)和擬合優度(R-squared),以評估模型在訓練集和測試集上的預測準確度和擬合效果,從而幫助判斷模型的泛化能力
模型預測可視化
利用散點圖和回歸線,直觀展示隨機森林模型在訓練集和測試集上的預測表現,圖中每個點代表真實值和預測值的配對關系,越接近對角線(即x=y線)的點表示預測越準確,通過不同顏色區分訓練集和測試集,邊緣的柱狀圖則顯示了數據分布情況,此外,右下角標注了訓練集和測試集的R^2(擬合優度),左上角注明模型名稱,幫助更全面地評估模型的預測效果與泛化能力,為模型的有效性提供了直觀的支持。
利用貝葉斯優化提升隨機森林(分類)模型性能
import pandas as pd
import numpy as np
from hyperopt import fmin, tpe, hp
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 讀取數據
df = pd.read_excel('2024-10-31-公眾號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_rf = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 決策樹數量
'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) # 葉節點最小樣本比例
}
# 定義目標函數
def objective(params):
# 初始化模型并傳入超參數
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默認最小化目標函數)
return -accuracy
# 運行貝葉斯優化
best_params = fmin(
fn=objective, # 目標函數
space=parameter_space_rf, # 搜索空間
algo=tpe.suggest, # 貝葉斯優化算法
max_evals=100 # 最大評估次數
)
# 顯示最優參數
print("Best hyperparameters:", best_params)
# 使用最佳參數創建最終模型
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)
通過貝葉斯優化(使用hyperopt庫)為隨機森林分類模型選擇最佳超參數組合,以最大化在測試集上的準確率,首先將數據集劃分為訓練集和測試集,并定義隨機森林的超參數空間,包括決策樹數量、最大深度、最小分裂樣本比例和最小葉節點樣本比例,然后使用目標函數創建和評估模型,以測試集準確率的負值作為優化目標(因為hyperopt最小化目標值),通過100次評估后,代碼選出最佳超參數組合,并用其重新訓練隨機森林模型,從而獲得更優的分類性能
模型性能評估:多維度分類指標分析
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]
})
metrics_df
計算隨機森林分類模型在測試集上的多個評估指標,包括準確率(accuracy)、精確率(precision)、召回率(recall)、F1分數(F1 Score)和AUC(僅適用于二分類),這些指標各自反映模型不同方面的性能:準確率表示整體預測的準確程度,精確率關注正類預測的準確性,召回率衡量模型找到所有正類的能力,F1分數則平衡了精確率和召回率的權重。AUC則進一步評估了模型在不同閾值下區分正負類的能力。因此,使用多個指標能夠更全面地了解模型的表現,從而幫助我們避免因單一指標誤導而造成的模型優化偏差.
模型預測可視化
繪制模型各評估指標的雷達圖,將不同性能指標如準確率、精確率、召回率等在極坐標上可視化,方便直觀對比模型在多個維度上的表現,從而幫助識別模型的優勢和改進方向。