import lightgbm as lgb
import xgboost as xgb
from sklearn.model_selection import GridSearchCV, StratifiedKFold
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 假设X为特征数据,y为标签数据
X = pd.read_excel("./data/result.xlsx")
y = pd.read_excel("./data/y.xlsx")
# 定义参数网格
param_grid_lgb = {
'num_leaves': [31, 50, 100],
'max_depth': [-1, 5, 10],
'learning_rate': [0.1, 0.01]
}
param_grid_xgb = {
'max_depth': [3, 5, 7],
'learning_rate': [0.1, 0.01]
}
# 定义5折交叉验证
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# 初始化绘图参数
plt.figure(figsize=(8, 6))
best_auc_lgb = 0
best_auc_xgb = 0
# 训练LightGBM模型
lgb_model = lgb.LGBMClassifier()
grid_search_lgb = GridSearchCV(lgb_model, param_grid_lgb, cv=kfold, scoring='roc_auc')
grid_search_lgb.fit(X, y)
best_model_lgb = grid_search_lgb.best_estimator_
best_auc_lgb = grid_search_lgb.best_score_
# 训练XGBoost模型
xgb_model = xgb.XGBClassifier()
grid_search_xgb = GridSearchCV(xgb_model, param_grid_xgb, cv=kfold, scoring='roc_auc')
grid_search_xgb.fit(X, y)
best_model_xgb = grid_search_xgb.best_estimator_
best_auc_xgb = grid_search_xgb.best_score_
X=np.array(X)
y=np.array(y)
# 绘制最优模型的ROC曲线
for name, model in [('LightGBM', best_model_lgb), ('XGBoost', best_model_xgb)]:
mean_fpr = np.linspace(0, 1, 100)
tprs = []
aucs = []
for train_idx, valid_idx in kfold.split(X, y):
X_train, y_train = X[train_idx], y[train_idx]
X_valid, y_valid = X[valid_idx], y[valid_idx]
model.fit(X_train, y_train)
y_pred = model.predict_proba(X_valid)[:, 1]
fpr, tpr, _ = roc_curve(y_valid, y_pred)
interp_tpr = np.interp(mean_fpr, fpr, tpr)
interp_tpr[0] = 0.0
tprs.append(interp_tpr)
aucs.append(auc(fpr, tpr))
mean_tpr = np.mean(tprs, axis=0)
mean_auc = np.mean(aucs)
plt.plot(mean_fpr, mean_tpr, label='%s (AUC = %0.2f)' % (name, mean_auc))
plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend()
plt.show()
上述代码中涉及到 ROC 曲线绘制中常用的操作:
-
mean_fpr = np.linspace(0, 1, 100)
: 这行代码创建了一个从 0 到 1 的等间距数组,包含 100 个元素。这个数组通常用于作为 ROC 曲线的横坐标,表示假阳性率(False Positive Rate)。 -
interp_tpr = np.interp(mean_fpr, fpr, tpr)
: 这行代码使用np.interp
函数来对真正阳性率(True Positive Rate)进行插值,以便将其对应到新的假阳性率的取值上。这样做是为了将不同模型或不同参数下得到的真正阳性率插值到相同的假阳性率取值上,以便进行比较。 -
interp_tpr[0] = 0.0
: 这行代码将插值后的真正阳性率数组中的第一个元素设置为 0.0。这通常是为了确保 ROC 曲线从原点开始,使得曲线在左上角(0,1)处经过,以便更好地比较模型性能。
此外注意在kfold.split(X, y)中的X,y不可以是Dataframe类型的数据,记得转换