XGBoost 與 信用卡詐騙數據集 三

基於之前 SKlearn API ,增加了儲存模型和讀取模型的功能,分別寫在兩段代碼裏面。

第一段是訓練和保存模型,和之前差不多:

import sklearn as sk 
import xgboost as xgb 
import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split # 功能:數據集按比例切分爲訓練集和測試集
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.preprocessing import scale # 數據集標準化
import matplotlib.pyplot as plt
from pandas_ml import ConfusionMatrix # 引入混淆矩陣
from xgboost.sklearn import XGBClassifier
from sklearn.externals import joblib # 保存和讀取模型用

df = pd.read_csv('creditcard.csv', low_memory=False)

X = df.iloc[:,:-1] # 基於位置的純整數索引
y = df['Class'] # 類別
X_scaled = scale(X) # 標準化

train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.35 ,random_state = 12) 

# dtrain = xgb.DMatrix(train_X, label = train_y)
# dtest = xgb.DMatrix(test_X, label = test_y)

XGBC = xgb.XGBClassifier(
    gamma = 0.1,                      # Gamma指定了節點分裂所需的最小損失函數下降值,值越大,算法越保守。
    learning_rate = 0.3,              # 學習速率
    max_delta_step = 0,               # 限制每棵樹權重改變的最大步長。0爲沒有限制,越大越保守。可用於樣本不平衡的時候。
    max_depth = 5,                    # 樹的最大深度
    min_child_weight = 6,             # 最小葉子節點樣本權重和。低避免過擬合,太高導致欠擬合。
    missing = None,                   # 如果有缺失值則替換。默認 None 就是 np.nan
    n_estimators = 250,               # 樹的數量
    nthread = 8,                      # 並行線程數量
    objective = 'binary:logistic',    # 指定學習任務和相應的學習目標或要使用的自定義目標函數
    #'objective':'multi:softprob',    # 定義學習任務及相應的學習目標
    #'objective':'reg:linear',        # 線性迴歸
    #'objective':'reg:logistic',      # 邏輯迴歸
    #'objective':'binary:logistic',   # 二分類的邏輯迴歸問題,輸出爲概率
    #'objective':'binary:logitraw',   # 二分類的邏輯迴歸問題,輸出結果爲 wTx,wTx指機器學習線性模型f(x)=wTx+b
    #'objective':'count:poisson'      # 計數問題的poisson迴歸,輸出結果爲poisson分佈
    #'objective':'multi:softmax'      # 讓XGBoost採用softmax目標函數處理多分類問題,同時需要設置參數num_class
    #'objective':'multi:softprob'     # 和softmax一樣,但是輸出的是ndata * nclass的向量,
                                      # 可以將該向量reshape成ndata行nclass列的矩陣。
                                      # 每行數據表示樣本所屬於每個類別的概率。
    reg_alpha = 1,                    # 權重的L1正則化項。默認1
    reg_lambda = 1,                   # 權重的L2正則化項。默認1
    scale_pos_weight = 10000,         # 數字變大,會增加對少量詐騙樣本的學習權重,這裏10000比較好
    seed = 0,                         # 隨機種子
    silent = True,                    # 靜默模式開啓,不會輸出任何信息
    subsample = 0.9,                  # 控制對於每棵樹,隨機採樣的比例。減小會更加保守,避免過擬,過小會導致欠擬合。
    base_score = 0.5)                 # 所有實例的初始預測評分,全局偏差 

bst = XGBC.fit(train_X, train_y)
preds = bst.predict(test_X) # 對測試集作出預測
print("訓練完成!")
print("保存模型...")
joblib.dump(bst,'XGBmodel.pkl') # 保存模型
print("保存成功!")

# 精確度(Precision):
# P = TP/(TP+FP) ;  反映了被分類器判定的正例中真正的正例樣本的比重
print("精確度(Precision):", precision_score(test_y, preds, average='macro')) # ?? %
print("召回率(Recall):", recall_score(test_y, preds, average='macro')) # ?? %

predicted_y = np.array(preds)
right_y = np.array(test_y)

# 混淆矩陣的每一列代表了預測類別,
# 每一列的總數表示預測爲該類別的數據的數目;
# 每一行代表了數據的真實歸屬類別,
# 每一行的數據總數表示該類別的數據實例的數目。
confusion_matrix = ConfusionMatrix(right_y, predicted_y)
# print("Confusion matrix:\n%s" % confusion_matrix)
# confusion_matrix.plot(normalized=True)
# plt.show()
confusion_matrix.print_stats()

'''
population: 99683
P: 176
N: 99507
PositiveTest: 170
NegativeTest: 99513
TP: 147
TN: 99484
FP: 23
FN: 29
TPR: 0.835227272727
TNR: 0.999768860482
PPV: 0.864705882353
NPV: 0.999708580788
FPR: 0.000231139517823
FDR: 0.135294117647
FNR: 0.164772727273
ACC: 0.999478346358
F1_score: 0.849710982659
MCC: 0.849577974181
informedness: 0.834996133209
markedness: 0.864414463141
prevalence: 0.00176559694231
LRP: 3613.52000988
LRN: 0.164810821567
DOR: 21925.2593703
FOR: 0.00029141921156s
'''


理論上這樣就成功保存模型了,接下來就是讀取模型直接用,注意路徑。

import sklearn as sk 
import xgboost as xgb 
import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split # 功能:數據集按比例切分爲訓練集和測試集
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.preprocessing import scale # 數據集標準化
import matplotlib.pyplot as plt
from pandas_ml import ConfusionMatrix # 引入混淆矩陣
from xgboost.sklearn import XGBClassifier
from sklearn.externals import joblib

df = pd.read_csv('creditcard.csv', low_memory=False)

X = df.iloc[:,:-1] # 基於位置的純整數索引
y = df['Class'] # 類別
X_scaled = scale(X) # 標準化

train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.35 ,random_state = 99) 

print("讀取模型...")
bst = joblib.load("XGBmodel.pkl")
print("讀取成功!")

preds = bst.predict(test_X) # 對測試集作出預測
print("精確度(Precision):", precision_score(test_y, preds, average='macro')) # ?? %
print("召回率(Recall):", recall_score(test_y, preds, average='macro')) # ?? %

predicted_y = np.array(preds)
right_y = np.array(test_y)

confusion_matrix = ConfusionMatrix(right_y, predicted_y)
confusion_matrix.print_stats()

清楚明白。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章