模型开发-GBDT决策树模型开发代码

 

       GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。近些年更因为被用于各大数据竞赛而引起大家关注,本文开发调试了基本的模型开发代码共大家学习交流。

文件可以在这里下载调试:https://download.csdn.net/download/iqdutao/12676802

需要的文件及依赖文件列表为:

000000_train数据集示例如下:

 

一、GBDT决策树模型训练

1. 导入相关的依赖包

from sklearn.ensemble import GradientBoostingClassifier   #分类模型
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.metrics import confusion_matrix
from sklearn.externals import joblib
from sklearn import metrics
import numpy as np
import random
import os

2. 外部数据读取

def sampleDataFunction(fileName,sampleLines,seed):
    numFeat = len(open(fileName).readline().split(','))  # 计算有多少列
    labelMat = []
    countSum = 0
    print("总共有多少列: %.4f" % numFeat)
    with open(fileName, 'r') as finput:
        for line in finput:  # 遍历原始数据集每一行
            countSum = countSum + 1
            #print(countSum)
            labelMat.append(line)  # 再传进dataMat列表向量
    random.seed(seed)
    if sampleLines == all:
        sampleLines= countSum
    sampleData = random.sample(labelMat, sampleLines)
    return sampleData

sampleData = sampleDataFunction('000000_train',all,8)

外部数据读取函数 sampleDataFunction(fileName, sampleLines, seed)
其中fileName读取文件的路径,CSV和TXT格式都可以,要求里面的数据是以“,”分割,window下的文件路径需要替换为反斜杠;
其中sampleLines指取多少行文件里面的数据,当 “sampleLines=all” 时,表示取全部的文件内容;当 “sampleLines=10” 时,表示随机取文件中的10行内容,
其中seed表示随机种子;

3. 数据提取

def loadDataSet(slice):
    numFeat =  len(slice[1].split(',') )   # 计算有多少列
    dataMat = []
    labelMat = []
    countSum = 1
    print("总共有多少列: %.4f" % numFeat)
    print("总共有多少行: %.4f" % len(slice))
    for line in range(len(slice)):
        countSum = countSum + 1
       # print(countSum)
        lineArr =[]
        curLine = slice[line].split(',')          # 是一列表类型
        for i in range(2,numFeat-1):              # numFeat - 1的原因:因为原始数据的倒数第1列是类别,不是属性数据,从第2列到倒数第2列为变量
            lineArr.append(float(curLine[i]))    # 一个一个传进lineArr列表向量
        dataMat.append(lineArr)                  # 再传进dataMat列表向量
        labelMat.append(float(curLine[-1]))      # 写进标签列表,最后一列为标签列,-1表示最后一列
    return dataMat, labelMat

dataMat, labelMat = loadDataSet(sampleData)

数据提取函数dataMat, labelMat = loadDataSet(sampleData)
其中sampleData是上面函数的输出;其中dataMat, labelMat分别表示数据的变量部分和标签部分
其中for i in range(2, numFeat - 1)表示读取每一行的变量,需要指定每一行第几列-第几列为变量,其中第2列-倒数第二列为变量
其中labelMat.append(float(curLine[-1])),-1 表示在每一行数据中,标签所在的位置,-1 表示最后一列,

4. 数据集的划分

#x为数据集的feature熟悉,y为label.
x_train, x_test, y_train, y_test = train_test_split(dataMat, labelMat, test_size = 0.3, random_state=1)

其中 test_size = 0.3 表示划分的数据中,训练集占比70%,验证集占比30%;

5. 模型训练参数

#配置GBDT参数及调优
gbdt = GradientBoostingClassifier(
    loss='deviance',
    learning_rate=0.01, #学习速率
    n_estimators=80,    #训练迭代次数
    subsample=0.6,      #每次训练随机抽取的样本集大小为60%
    max_features= 'sqrt',
    max_depth=6,
    verbose = 2
)

gbdt_model = gbdt.fit(x_train, y_train)  #模型训练开始

6. 特征权重排序

#特征值权重排序
#feat_labels = x_train.columns[2:]   #特征列名
importances = gbdt_model.feature_importances_          #feature_importances_特征列重要性占比
indices = np.argsort(importances)[::-1]               #对参数从小到大排序的索引序号取逆,即最重要特征索引——>最不重要特征索引
print(indices)
print(len(indices))

for f in range(len(indices)):
    print("%2d) %-*s %f" % (f, 30, indices[f], importances[indices[f]]))

GBDT模型在训练完成后,通过gbdt_model.feature_importances_输出每个变量对模型影响的权重,通过权重剔除一些无效变量

7. 模型保存

#保存模型
if os.path.exists("model_train.m"):
    os.remove("model_train.m")
    print("model_train.m 存在,并且删除")
joblib.dump(gbdt_model, "model_train.m")

8. 模型评估指标输出

#利用训练的模型来测试  训练集
prediction_train = gbdt_model.predict(x_train)
prediction_train_predprob = gbdt_model.predict_proba(x_train)[:,1]

# #利用训练的模型来测试  验证集集
prediction_test = gbdt_model.predict(x_test)
prediction_test_predprob = gbdt_model.predict_proba(x_test)[:,1]

print("总样本: %.4f" % len(dataMat))
print("训练样本: %.4f" % len(x_train))
print("验证样本: %.4f" % len(x_test))
print("正样本: %.4f" % labelMat.count(1))
print("负样本: %.4f" % labelMat.count(0))


print("------------------------------------------训练集指标")
testAccuracy = metrics.accuracy_score(y_train, prediction_train)
print("训练样本的准确率: %.4f" % testAccuracy)

average_precision = metrics.average_precision_score(y_train, prediction_train)
print("average_precision: %.4f" % average_precision)

#查准率
averagePrecisionScore = metrics.precision_score(y_train, prediction_train)
print("查准率: %.4f" % averagePrecisionScore)

##召回率
returnResultScore = metrics.recall_score(y_train, prediction_train)
print("召回率: %.4f" % returnResultScore)

##F1值
F1Score = metrics.f1_score(y_train, prediction_train)
print("F1-Score: %.4f" % F1Score)

#计算auc
roc_auc_predprob = metrics.roc_auc_score(y_train, prediction_train_predprob)
print("AUC-Score_predprob: %.4f" % roc_auc_predprob)


print("------------------------------------------验证集集指标")
testAccuracy = metrics.accuracy_score(y_test, prediction_test)
print("验证样本的准确率: %.4f" % testAccuracy)

#查准率
averagePrecisionScore = metrics.precision_score(y_test, prediction_test)
print("查准率: %.4f" % averagePrecisionScore)

##召回率
returnResultScore = metrics.recall_score(y_test, prediction_test)
print("召回率: %.4f" % returnResultScore)

##F1值
F1Score = metrics.f1_score(y_test, prediction_test)
print("F1-Score: %.4f" % F1Score)

#计算auc
roc_auc = metrics.roc_auc_score(y_test, prediction_test_predprob)
print("AUC-Score: %.4f" % roc_auc)

模型评估指标直接调用metrics的相关包使用

9. 结果输出

总共有多少列: 150.0000
总共有多少列: 150.0000
总共有多少行: 10000.0000
      Iter       Train Loss      OOB Improve   Remaining Time 
         1           1.3449           0.0093           19.39s
         2           1.3363           0.0081           14.51s
         3           1.3314           0.0087           12.54s
         4           1.3184           0.0079           10.92s
         5           1.3138           0.0064            9.71s
         6           1.3052           0.0076            9.34s
         7           1.2981           0.0083            8.92s
         8           1.2913           0.0077            8.38s
         9           1.2828           0.0084            7.97s
        10           1.2724           0.0082            7.67s
        11           1.2650           0.0070            7.34s
        12           1.2606           0.0070            7.20s

        *****************************************************

        76           0.9596           0.0026            0.38s
        77           0.9539           0.0023            0.28s
        78           0.9500           0.0029            0.19s
        79           0.9472           0.0029            0.09s
        80           0.9477           0.0025            0.00s


 0) 44                             0.127963
 1) 42                             0.096159
 2) 30                             0.089436
 3) 28                             0.075085
 4) 16                             0.067578
 5) 35                             0.046242
 6) 14                             0.041790

 *****************************************

142) 12                             0.000008
143) 108                            0.000006
144) 6                              0.000000
145) 26                             0.000000
146) 40                             0.000000

总样本: 10000.0000
训练样本: 7000.0000
验证样本: 3000.0000
正样本: 3990.0000
负样本: 6010.0000
-----------------------------------------训练集指标
训练样本的准确率: 0.8774
average_precision: 0.7996
查准率: 0.9364
召回率: 0.7447
F1-Score: 0.8296
AUC-Score_predprob: 0.9438
------------------------------------------验证集集指标
验证样本的准确率: 0.8553
查准率: 0.9033
召回率: 0.7097
F1-Score: 0.7949
AUC-Score: 0.9327

 

二、GBDT决策树模型预测

1.模型预测代码

数据导入、数据提取模块代码没有变动,增加模型读取,测试集数据验证等代码


from sklearn.ensemble import GradientBoostingClassifier   #分类模型
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.metrics import confusion_matrix
from sklearn.externals import joblib
from sklearn import metrics
import numpy as np
import random
import os

def sampleDataFunction(fileName, sampleLines, seed):
    numFeat = len(open(fileName).readline().split(','))  # 计算有多少列
    labelMat = []
    countSum = 0
    print("总共有多少列: %.4f" % numFeat)
    with open(fileName, 'r') as finput:
        for line in finput:  # 遍历原始数据集每一行
            countSum = countSum + 1
            # print(countSum)
            labelMat.append(line)  # 再传进dataMat列表向量
    random.seed(seed)
    if sampleLines == all:
        sampleLines = countSum
    sampleData = random.sample(labelMat, sampleLines)
    return sampleData

sampleData = sampleDataFunction('000000_test',all,8)


def loadDataSet(slice):
    numFeat = len(slice[1].split(','))  # 计算有多少列
    dataMat = []
    labelMat = []
    countSum = 1
    print("总共有多少列: %.4f" % numFeat)
    print("总共有多少行: %.4f" % len(slice))
    for line in range(len(slice)):
        countSum = countSum + 1
        # print(countSum)
        lineArr = []
        curLine = slice[line].split(',')  # 是一列表类型
        for i in range(2, numFeat - 1):  # numFeat - 1的原因:因为原始数据的倒数第1列是类别,不是属性数据
            lineArr.append(float(curLine[i]))  # 一个一个传进lineArr列表向量
        dataMat.append(lineArr)  # 再传进dataMat列表向量
        labelMat.append(float(curLine[-1]))  # 写进标签列表
    return dataMat, labelMat

dataMat, labelMat = loadDataSet(sampleData)

#导入模型
gbdt_model = joblib.load("model_train.m")
print(gbdt_model)

# 利用训练的模型来测试  测试集
prediction_test = gbdt_model.predict(dataMat)
prediction_test_predprob = gbdt_model.predict_proba(dataMat)[:, 1]

print("------------------------------------------测试集指标")
testAccuracy = metrics.accuracy_score(labelMat, prediction_test)
print("测试样本的准确率: %.4f" % testAccuracy)

# 查准率
averagePrecisionScore = metrics.precision_score(labelMat, prediction_test)
print("查准率: %.4f" % averagePrecisionScore)

##召回率
returnResultScore = metrics.recall_score(labelMat, prediction_test)
print("召回率: %.4f" % returnResultScore)

##F1值
F1Score = metrics.f1_score(labelMat, prediction_test)
print("F1-Score: %.4f" % F1Score)

# 计算auc
roc_auc = metrics.roc_auc_score(labelMat, prediction_test_predprob)
print("AUC-Score: %.4f" % roc_auc)

2. 模型评价结果输出

总共有多少列: 150.0000
总共有多少列: 150.0000
总共有多少行: 1000.0000
GradientBoostingClassifier(criterion='friedman_mse', init=None,
              learning_rate=0.01, loss='deviance', max_depth=6,
              max_features='sqrt', max_leaf_nodes=None,
              min_impurity_decrease=0.0, min_impurity_split=None,
              min_samples_leaf=1, min_samples_split=2,
              min_weight_fraction_leaf=0.0, n_estimators=80,
              n_iter_no_change=None, presort='auto', random_state=None,
              subsample=0.6, tol=0.0001, validation_fraction=0.1,
              verbose=2, warm_start=False)
------------------------------------------测试集指标
测试样本的准确率: 0.7920
查准率: 0.8955
召回率: 0.5714
F1-Score: 0.6977
AUC-Score: 0.9055

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值