概述
xgboost 使用Dmatrix格式 转换
安装xghoost包:pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple
import numpy as np
import pandas as pd
import pickle #pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上
import xgboost as xgb
from sklearn.model_selection import train_test_split
#皮马印第安人糖尿病数据集 包含很多字段:怀孕次数 口服葡萄糖耐量试验中血浆葡萄糖浓度 舒张压(mm Hg) 三头肌组织褶厚度(mm)
#2小时血清胰岛素(μU/ ml) 体重指数(kg/(身高(m)^2) 糖尿病系统功能 年龄(岁)
# 基本例子,从csv文件中读取数据,做二分类
# 用pandas读入数据
data = pd.read_csv('pima-indians-diabetes.csv')
'''
Pregnancies:怀孕次数
Glucose:葡萄糖
BloodPressure:血压 (mm Hg)
SkinThickness:皮层厚度 (mm)
Insulin:胰岛素 2小时血清胰岛素(mu U / ml
BMI:体重指数 (体重/身高)^2
DiabetesPedigreeFunction:糖尿病谱系功能
Age:年龄 (岁)
Outcome:类标变量 (0或1)
'''
data.head()
Pregnancies | Glucose | BloodPressure | SkinThickness | Insulin | BMI | DiabetesPedigreeFunction | Age | Outcome | |
---|---|---|---|---|---|---|---|---|---|
0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
data.info() #没有缺失值
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Pregnancies 768 non-null int64
1 Glucose 768 non-null int64
2 BloodPressure 768 non-null int64
3 SkinThickness 768 non-null int64
4 Insulin 768 non-null int64
5 BMI 768 non-null float64
6 DiabetesPedigreeFunction 768 non-null float64
7 Age 768 non-null int64
8 Outcome 768 non-null int64
dtypes: float64(2), int64(7)
memory usage: 54.1 KB
'''
data.describe()
Pregnancies | Glucose | BloodPressure | SkinThickness | Insulin | BMI | DiabetesPedigreeFunction | Age | Outcome | |
---|---|---|---|---|---|---|---|---|---|
count | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 | 768.000000 |
mean | 3.845052 | 120.894531 | 69.105469 | 20.536458 | 79.799479 | 31.992578 | 0.471876 | 33.240885 | 0.348958 |
std | 3.369578 | 31.972618 | 19.355807 | 15.952218 | 115.244002 | 7.884160 | 0.331329 | 11.760232 | 0.476951 |
min | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.078000 | 21.000000 | 0.000000 |
25% | 1.000000 | 99.000000 | 62.000000 | 0.000000 | 0.000000 | 27.300000 | 0.243750 | 24.000000 | 0.000000 |
50% | 3.000000 | 117.000000 | 72.000000 | 23.000000 | 30.500000 | 32.000000 | 0.372500 | 29.000000 | 0.000000 |
75% | 6.000000 | 140.250000 | 80.000000 | 32.000000 | 127.250000 | 36.600000 | 0.626250 | 41.000000 | 1.000000 |
max | 17.000000 | 199.000000 | 122.000000 | 99.000000 | 846.000000 | 67.100000 | 2.420000 | 81.000000 | 1.000000 |
data.groupby(['Outcome']).count()
Pregnancies | Glucose | BloodPressure | SkinThickness | Insulin | BMI | DiabetesPedigreeFunction | Age | |
---|---|---|---|---|---|---|---|---|
Outcome | ||||||||
0 | 500 | 500 | 500 | 500 | 500 | 500 | 500 | 500 |
1 | 268 | 268 | 268 | 268 | 268 | 268 | 268 | 268 |
data.corr()
Pregnancies | Glucose | BloodPressure | SkinThickness | Insulin | BMI | DiabetesPedigreeFunction | Age | Outcome | |
---|---|---|---|---|---|---|---|---|---|
Pregnancies | 1.000000 | 0.129459 | 0.141282 | -0.081672 | -0.073535 | 0.017683 | -0.033523 | 0.544341 | 0.221898 |
Glucose | 0.129459 | 1.000000 | 0.152590 | 0.057328 | 0.331357 | 0.221071 | 0.137337 | 0.263514 | 0.466581 |
BloodPressure | 0.141282 | 0.152590 | 1.000000 | 0.207371 | 0.088933 | 0.281805 | 0.041265 | 0.239528 | 0.065068 |
SkinThickness | -0.081672 | 0.057328 | 0.207371 | 1.000000 | 0.436783 | 0.392573 | 0.183928 | -0.113970 | 0.074752 |
Insulin | -0.073535 | 0.331357 | 0.088933 | 0.436783 | 1.000000 | 0.197859 | 0.185071 | -0.042163 | 0.130548 |
BMI | 0.017683 | 0.221071 | 0.281805 | 0.392573 | 0.197859 | 1.000000 | 0.140647 | 0.036242 | 0.292695 |
DiabetesPedigreeFunction | -0.033523 | 0.137337 | 0.041265 | 0.183928 | 0.185071 | 0.140647 | 1.000000 | 0.033561 | 0.173844 |
Age | 0.544341 | 0.263514 | 0.239528 | -0.113970 | -0.042163 | 0.036242 | 0.033561 | 1.000000 | 0.238356 |
Outcome | 0.221898 | 0.466581 | 0.065068 | 0.074752 | 0.130548 | 0.292695 | 0.173844 | 0.238356 | 1.000000 |
# 做数据切分
train,test = train_test_split(data) #把数据划分成训练集和测试集
#转换成Dmatrix格式。是Xgboost特有的
# 特征列
feature_columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
'BMI', 'DiabetesPedigreeFunction', 'Age']
#目标列
target_column = 'Outcome'
xgtrain = xgb.DMatrix(train[feature_columns].values,train[target_column].values) #训练集
xgtest = xgb.DMatrix(test[feature_columns].values,test[target_column].values) #测试集
#Xgboost自带的读取格式DMatrix()
#XGBoost可以加载libsvm格式的文本数据,加载的数据格式可以为Numpy的二维数组和XGBoost的二进制的缓存文件。
#加载的数据存储在对象DMatrix中。
#参数设定
param = {'max_depth':5, #树最大深度
'eta':0.1, #学习率
'silent':1, # 训练的过程中是否打印训练的信息
'subsample':0.7, # 行采样百分比
'colsample_bytree':0.7, # 列采样
'objective':'binary:logistic' } # 用logistic逻辑回归做分类器
#设定watchlist 用于查看模型状态
watchlist = [(xgtest,'eval'),(xgtrain,'train')]
bst = xgb.train(param,xgtrain,10,watchlist) #参数设定,训练集数据,10次,查看状态
# 使用模型预测
preds = bst.predict(xgtest)
'''
[0] eval-logloss:0.66464 train-logloss:0.65518
[1] eval-logloss:0.64236 train-logloss:0.62582
[2] eval-logloss:0.62212 train-logloss:0.60128
[3] eval-logloss:0.60074 train-logloss:0.57535
[4] eval-logloss:0.58476 train-logloss:0.55096
[5] eval-logloss:0.56853 train-logloss:0.53070
[6] eval-logloss:0.55099 train-logloss:0.50928
[7] eval-logloss:0.54226 train-logloss:0.49490
[8] eval-logloss:0.53426 train-logloss:0.47898
[9] eval-logloss:0.52509 train-logloss:0.46670
'''
# 判断准确率
labels = xgtest.get_label() #预测的标签要和正确的做对比
print ('错误类为%f' %
#preds[i]>0.5 做为预测为1的阈值
(sum(1 for i in range(len(preds)) if int(preds[i]>0.5)!=labels[i]) /float(len(preds)))
# 模型存储
bst.save_model('1.model')
错误类为0.21354166666666666
使用xgboost的sklearn包
Joblib是一组用于在Python中提供轻量级流水线的工具。特点:·透明的磁盘缓存功能和懒惰的重新评估(memoize模式)·简单的并行计算
Joblib可以将模型保存到磁盘并可在必要时重新运行
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
import pickle
import xgboost as xgb
from sklearn.model_selection import train_test_split
import joblib
# 用pandas读入数据
data = pd.read_csv('Pima-Indians-Diabetes.csv')
# 做数据切分
train, test = train_test_split(data)
# 取出特征X和目标y的部分
feature_columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']
target_column = 'Outcome'
train_X = train[feature_columns].values
train_y = train[target_column].values
test_X = test[feature_columns].values
test_y = test[target_column].values
# 初始化模型
xgb_classifier = xgb.XGBClassifier(n_estimators=20,
max_depth=4,
learning_rate=0.1,
subsample=0.7,
colsample_bytree=0.7)
# 拟合模型
xgb_classifier.fit(train_X, train_y)
# 使用模型预测
preds = xgb_classifier.predict(test_X)
# 判断准确率
print ('错误类为%f' %((preds!=test_y).sum()/float(test_y.shape[0])))
#错误类为0.270833
# 模型存储
#joblib.dump(xgb_classifier, '2.model')
XGBoost 和GBDT 区别
-
相同点: 基本原理都是一样的
-
xgboost 也是串行训练 一棵树一棵树训练
-
特征的处理是并行的
-
-
对比GBDT优点
-
训练速度快
-
支持自定义损失函数
-
传统的GBDT是以CART树作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑回归(分类问题)或者线性回归(回归问题),泛化能力更强
-
可以调节的参数更多
-
最后
以上就是背后糖豆为你收集整理的xgboost 案例分析的全部内容,希望文章能够帮你解决xgboost 案例分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复