基於之前 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()
清楚明白。