模型开发-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 os2. 外部數據讀取
def sampleDataFunction(fileName,sampleLines,seed):numFeat = len(open(fileName).readline().split(',')) # 計算有多少列labelMat = []countSum = 0print("總共有多少列: %.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= countSumsampleData = random.sample(labelMat, sampleLines)return sampleDatasampleData = 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 = 1print("總共有多少列: %.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, labelMatdataMat, 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.0000Iter Train Loss OOB Improve Remaining Time 1 1.3449 0.0093 19.39s2 1.3363 0.0081 14.51s3 1.3314 0.0087 12.54s4 1.3184 0.0079 10.92s5 1.3138 0.0064 9.71s6 1.3052 0.0076 9.34s7 1.2981 0.0083 8.92s8 1.2913 0.0077 8.38s9 1.2828 0.0084 7.97s10 1.2724 0.0082 7.67s11 1.2650 0.0070 7.34s12 1.2606 0.0070 7.20s*****************************************************76 0.9596 0.0026 0.38s77 0.9539 0.0023 0.28s78 0.9500 0.0029 0.19s79 0.9472 0.0029 0.09s80 0.9477 0.0025 0.00s0) 44 0.1279631) 42 0.0961592) 30 0.0894363) 28 0.0750854) 16 0.0675785) 35 0.0462426) 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 osdef sampleDataFunction(fileName, sampleLines, seed):numFeat = len(open(fileName).readline().split(',')) # 計算有多少列labelMat = []countSum = 0print("總共有多少列: %.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 = countSumsampleData = random.sample(labelMat, sampleLines)return sampleDatasampleData = sampleDataFunction('000000_test',all,8)def loadDataSet(slice):numFeat = len(slice[1].split(',')) # 計算有多少列dataMat = []labelMat = []countSum = 1print("總共有多少列: %.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, labelMatdataMat, 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?
?
總結
以上是生活随笔為你收集整理的模型开发-GBDT决策树模型开发代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 风控业务-模型稳定性评价指标PSI
- 下一篇: 机器学习-特征中的相关性及相关系数、卡方