交叉验证网格搜索调参,roc曲线比较性能

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 曲线绘制中常用的操作:

  1. mean_fpr = np.linspace(0, 1, 100): 这行代码创建了一个从 0 到 1 的等间距数组,包含 100 个元素。这个数组通常用于作为 ROC 曲线的横坐标,表示假阳性率(False Positive Rate)。

  2. interp_tpr = np.interp(mean_fpr, fpr, tpr): 这行代码使用 np.interp 函数来对真正阳性率(True Positive Rate)进行插值,以便将其对应到新的假阳性率的取值上。这样做是为了将不同模型或不同参数下得到的真正阳性率插值到相同的假阳性率取值上,以便进行比较。

  3. interp_tpr[0] = 0.0: 这行代码将插值后的真正阳性率数组中的第一个元素设置为 0.0。这通常是为了确保 ROC 曲线从原点开始,使得曲线在左上角(0,1)处经过,以便更好地比较模型性能。

此外注意在kfold.split(X, y)中的X,y不可以是Dataframe类型的数据,记得转换

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值