xgboost 使用Dmatrix格式 转换
复制代码
1
2
3
4
5
6安装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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#皮马印第安人糖尿病数据集 包含很多字段:怀孕次数 口服葡萄糖耐量试验中血浆葡萄糖浓度 舒张压(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 |
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19data.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 '''
复制代码
1data.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 |
复制代码
1data.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 |
复制代码
1data.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 |
复制代码
1
2# 做数据切分 train,test = train_test_split(data) #把数据划分成训练集和测试集
复制代码
1
2
3
4
5
6
7
8
9
10
11#转换成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中。
复制代码
1
2
3
4
5
6
7#参数设定 param = {'max_depth':5, #树最大深度 'eta':0.1, #学习率 'silent':1, # 训练的过程中是否打印训练的信息 'subsample':0.7, # 行采样百分比 'colsample_bytree':0.7, # 列采样 'objective':'binary:logistic' } # 用logistic逻辑回归做分类器
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#设定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 '''
复制代码
1
2
3
4
5
6
7
8
9
10
11
12# 判断准确率 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可以将模型保存到磁盘并可在必要时重新运行
复制代码
1
2
3
4
5
6
7
8import 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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30# 用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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复