当前位置: 首页 > news >正文

XGBoost实例——皮马印第安人糖尿病预测和特征筛选

利用皮马印第安人糖尿病数据集来预测皮马印第安人的糖尿病,以下是数据集的信息:

  • Pregnancies:怀孕次数
  • Glucose:葡萄糖
  • BloodPressure:血压 (mm Hg)
  • SkinThickness:皮层厚度 (mm)
  • Insulin:胰岛素 2小时血清胰岛素(mu U / ml )
  • BMI:体重指数 (体重/身高)^2
  • DiabetesPedigreeFunction:糖尿病谱系功能
  • Age:年龄 (岁)
  • Outcome:目标值 (0或1)

导入模块

# 导入模块包
import pandas as pd
from sklearn.model_selection import train_test_split
import xgboost as xgb
import warnings
warnings.filterwarnings('ignore')
from sklearn.metrics import roc_auc_score, roc_curve, confusion_matrix, classification_report
import matplotlib.pyplot as plt
import seaborn as sns

读取数据

df = pd.read_csv('pima-indians-diabetes.csv')
print(df.info())
df.head()

在这里插入图片描述
由于数据比较完整,不存在数据缺失的问题,所以数据不用处理。

直接进行预测

# 数据划分
feature_columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']
X = df[feature_columns]
y = df['Outcome']
train_X, test_X, train_y, test_y = train_test_split(X,y,random_state=7,test_size=0.2)
# 模型设置和训练
xgb_clf = xgb.XGBClassifier(n_estimators=20, max_depth=4,learning_rate=0.1,subsample=0.7,colsample_bytree=0.7)
xgb_clf.fit(train_X, train_y)
pred_y = xgb_clf.predict(test_X)
prob_y = xgb_clf.predict_proba(test_X)[:,1]
prob_train_y = xgb_clf.predict_proba(train_X)[:,1]# 模型评估
auc_score = roc_auc_score(test_y, pred_y)
auc_score_train = roc_auc_score(train_y, prob_train_y)
fpr, tpr,_ = roc_curve(test_y, prob_y)
fpr_tr, tpr_tr,_ = roc_curve(train_y, prob_train_y)# 绘制roc曲线
plt.plot(fpr,tpr,label = 'test xgb auc=%0.3f'%auc_score) #绘制训练集ROC 
plt.plot(fpr_tr,tpr_tr,label = 'train xgb auc=%0.3f'%auc_score_train) #绘制验证集ROC 
plt.plot([0,1],[0,1],'k--') 
plt.xlabel('False positive rate') 
plt.ylabel('True positive rate') 
plt.title('ROC Curve') 
plt.legend(loc = 'best') 
plt.show()
print(confusion_matrix(pred_y,test_y))
print((pred_y!=test_y).sum()/float(test_y.shape[0]))
print(classification_report(test_y,pred_y,  target_names=['Yes','No']))

在这里插入图片描述

用xgboost对特征进行筛选,由于上面已经直接用于分类了,所以我们可直接提取出特征的指标。

# 使用xgboost进行特征筛选
temp=pd.DataFrame()
temp['feature_name'] = feature_columns
temp['feature_importance'] = xgb_clf.feature_importances_
temp.sort_values('feature_importance', ascending=False)

在这里插入图片描述
使用筛选过后的特征进行模型训练,使用前四的特征进行训练。

# 使用大于0.1的特征进行训练
feature_lst = ['Glucose','BMI','Age','Insulin']
X = df[feature_lst]
y = df['Outcome']
train_X, test_X, train_y, test_y = train_test_split(X,y,random_state=7,test_size=0.2)
# 模型设置和训练
xgb_clf = xgb.XGBClassifier(n_estimators=20, max_depth=4,learning_rate=0.1,subsample=0.7,colsample_bytree=0.7)
xgb_clf.fit(train_X, train_y)
pred_y = xgb_clf.predict(test_X)
prob_y = xgb_clf.predict_proba(test_X)[:,1]
prob_train_y = xgb_clf.predict_proba(train_X)[:,1]# 模型评估
auc_score = roc_auc_score(test_y, pred_y)
auc_score_train = roc_auc_score(train_y, prob_train_y)
fpr, tpr,_ = roc_curve(test_y, prob_y)
fpr_tr, tpr_tr,_ = roc_curve(train_y, prob_train_y)# 绘制roc曲线
plt.plot(fpr,tpr,label = 'test xgb auc=%0.3f'%auc_score) #绘制训练集ROC 
plt.plot(fpr_tr,tpr_tr,label = 'train xgb auc=%0.3f'%auc_score_train) #绘制验证集ROC 
plt.plot([0,1],[0,1],'k--') 
plt.xlabel('False positive rate') 
plt.ylabel('True positive rate') 
plt.title('ROC Curve') 
plt.legend(loc = 'best') 
plt.show()
print(confusion_matrix(pred_y,test_y))
print((pred_y!=test_y).sum()/float(test_y.shape[0]))
print(classification_report(test_y,pred_y,  target_names=['Yes','No']))

在这里插入图片描述

总结

  • 经过特征筛选后的模型没有得到加强
  • 训练集和测试集的auc值变动较大,泛化能力较弱,需要对数据进行K折验证。
http://www.lryc.cn/news/95848.html

相关文章:

  • 使用MQ发送对象错误
  • 安装和卸载docker,详细教程
  • RabbitMQ的确认机制
  • java项目之人才公寓管理系统(ssm+mysql+jsp)
  • git使用记录
  • Spring MVC异步上传、跨服务器上传和文件下载
  • 性能测试之并发用户数的估计
  • 【全方位解析】如何获取客户端/服务端真实 IP
  • Ceph简介和特性
  • Python基本语法之符号使用
  • 前端vue部署到nginx并且配置https安全证书全流程
  • 三子棋(超详解+完整码源)
  • 【算法提高:动态规划】1.2 最长上升子序列模型(TODO:最长公共上升子序列)
  • 会不会好奇ai绘画生成器?ai创作的灵感从何而来?
  • 【Ajax】笔记-JQuery发送请求与通用方法
  • 视频的音频提取怎么做?这样提取很简单
  • 几百本常用计算机开发语言电子书链接
  • Docker Compose 解析:定义和管理多容器应用,从多角度探索其优势和应用场景
  • Linux系列---【CentOS 7通过MSTSC连接远程桌面】
  • width: calc(~“100% - 267px“);动态css 调样式
  • Windows Server 2012 搭建网关服务器并端口转发
  • 基于linux下的高并发服务器开发(第三章)- 3.10 死锁
  • 09.计算机网络——套接字编程
  • Data Structure, Algorithm,and Applications in C++
  • Apipost使用教程
  • 如何使用Python进行服务器管理和自动化操作?
  • Kafka-partition和消费者的关系
  • 使用克拉默法则进行三点定圆(二维)
  • 【Java】Java多线程编程基础
  • FFmpeg-4.2.4的去logo源码分析