最近科研用到分类器,师兄们说xgboost很好,于是便了解了一下:
xgboost是近年来很受追捧的机器学习算法,由华盛顿大学的陈天奇提出。最近在学习机器学习,所以需要安装这一利器。然而,在网上找了很多安装xgboost的教程,有些方法太复杂,要安装额外的几个软件,有些看着简单但是自己按步骤安装了一遍,进行测试的时候还是没有成功。
最近终于发现了一个超级简单的办法,主要是发现了这个网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
里面有许多库的.whl文件,在里面找到适合自己电脑的版本如(python 3.6+win64)。
下载下来之后把文件保存在一个文件夹中,如 D:\Anaconda3\mywhl。mywhl是在Anaconda3文件夹下自定义的一个文件夹。接下来启动 Anaconda Prompt. 将路径定位到放置.whl文件的目录下。
接下来输入 pip install xgboost-0.6+20171121-cp36-cp36m-win_amd64.whl,后边的一大串是完整的文件名,不要输错哦!!!
会提示你安装成功。
最后一行显示安装成功了,自己也可以使用命令 conda list 或者 pip list 查看清单里面是否有xgboost库。
最后来进行测试,打开spyder,建立一个.py文件,输入下列测试代码:
没有出错的话,就会提示下面的语句。
[0] eval-auc:0.5 train-auc:0.5
[1] eval-auc:0.5 train-auc:0.5
[2] eval-auc:0.5 train-auc:0.5
[3] eval-auc:0.5 train-auc:0.5
[4] eval-auc:0.5 train-auc:0.5
[5] eval-auc:0.5 train-auc:0.5
[6] eval-auc:0.5 train-auc:0.5
[7] eval-auc:0.5 train-auc:0.5
[8] eval-auc:0.5 train-auc:0.5
[9] eval-auc:0.5 train-auc:0.5
然后,下面的代码是我自己编写的二分类的code:
import scipy.io as sio
# 导入必要的工具包
import xgboost as xgb
import numpy as np
# 计算分类正确率
from sklearn.metrics import accuracy_score
# read in data,数据在xgboost安装的路径下的demo目录,现在我们将其copy到当前代码下的data目录
#my_workpath = './data/data/'
#dtrain = xgb.DMatrix(my_workpath + 'agaricus.txt.train')
#dtest = xgb.DMatrix(my_workpath + 'agaricus.txt.test')
from sklearn.model_selection import KFold
root='E:/xuhaohao/python/32feature/'
features0=(sio.loadmat(root+'feature0.mat'))['feature0']#加载.mat 58*608
features1=(sio.loadmat(root+'feature1.mat'))['feature1']
#加载.mat 58*608
y1=np.zeros((1411,1))
y2=np.ones((2226,1))
y=np.vstack((y1,y2))
X=np.vstack((features0,features1))
kf = KFold(n_splits=5,shuffle=True, random_state=1)
kf.get_n_splits(X)
m=np.zeros((1,5));
i=0;
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
dtrain = xgb.DMatrix( X_train, label=y_train)
dtest = xgb.DMatrix( X_test, label=y_test)
# specify parameters via map
#param = {'max_depth':2, 'eta':0.07, 'silent':0, 'objective':'multi:softmax','num_class': 2}
param = {
'booster': 'gbtree',
#'objective': 'binary:logistic', # 多分类的问题
'num_class': 2, # 类别数,与 multisoftmax 并用
'gamma': 0.1, # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
'max_depth': 7, # 构建树的深度,越大越容易过拟合
'lambda': 2, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
'subsample': 0.9, # 随机采样训练样本
'colsample_bytree': 0.7, # 生成树时进行的列采样
'min_child_weight': 3,
'silent': 1, # 设置成1则没有运行信息输出,最好是设置为0.
'eta': 0.1, # 如同学习率
'seed': 1000,
'nthread': 4,
'n_estimators':500 # cpu 线程数
}
#print(param)
# 设置boosting迭代计算次数
num_round = 20
#import time
#starttime = time.clock()
bst = xgb.train(param, dtrain, num_round) # dtrain是训练数据集
#endtime = time.clock()
#print (endtime - starttime)
train_preds = bst.predict(dtrain)
train_predictions = [round(value) for value in train_preds]
y_train = dtrain.get_label() #值为输入数据的第一行
train_accuracy = accuracy_score(y_train, train_predictions)
print ("Train Accuary: %.2f%%" % (train_accuracy * 100.0))
# make prediction
preds = bst.predict(dtest)
predictions = [round(value) for value in preds]
y_test = dtest.get_label()
test_accuracy = accuracy_score(y_test, predictions)
print("Test Accuracy: %.2f%%" % (test_accuracy * 100.0))
m[0][i]=test_accuracy
i=i+1;
n=np.mean(m);
print(n);