日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XGBoost 与 信用卡诈骗数据集

發(fā)布時間:2023/12/20 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XGBoost 与 信用卡诈骗数据集 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在Github 上面找到了一個信用卡詐騙數(shù)據(jù)集:

https://github.com/georgymh/ml-fraud-detection

數(shù)據(jù)源于 kaggle 的信用卡詐騙數(shù)據(jù)。

其中給出了三種大方法,分別是神經(jīng)網(wǎng)絡(luò),kmeans,以及邏輯回歸。

但是今天我想要用XGBoost 試一試。

import sklearn as sk import xgboost as xgb import numpy as np import pandas as pd from sklearn.model_selection import train_test_split # 功能:數(shù)據(jù)集按比例切分為訓(xùn)練集和測試集 from sklearn.metrics import precision_score from sklearn.metrics import recall_score from sklearn.preprocessing import scale # 數(shù)據(jù)集標(biāo)準(zhǔn)化 import matplotlib.pyplot as plt from pandas_ml import ConfusionMatrix # 引入混淆矩陣 # https://github.com/pandas-ml/pandas-ml/df = pd.read_csv('creditcard.csv', low_memory=False)X = df.iloc[:,:-1] # 基于位置的純整數(shù)索引 y = df['Class'] # 類別 X_scaled = scale(X) # 標(biāo)準(zhǔn)化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)param = { # --------------- Tree Booster 參數(shù) --------------- 'eta':0.3, # 每個循環(huán)的學(xué)習(xí)步長,就是sklearn的learning_rate'booster':'gbtree', # gbtree使用基于樹的模型進(jìn)行提升計算,gblinear使用線性模型進(jìn)行提升計算'max_depth':5, # 每棵樹的最大深度,默認(rèn)6'silent':1, # 默認(rèn)0,而1表示靜默模式開啟,不會輸出任何信息# ---------------------------------------------------------------------'num_class':2, # 類別個數(shù),記得改!# ---------------------------------------------------------------------'min_child_weight':1.0, # 決定最小葉子節(jié)點(diǎn)樣本權(quán)重和# 'max_leaf_nodes': # 樹上最大的節(jié)點(diǎn)或葉子的數(shù)量。 可以替代max_depth的作用。'scale_pos_weight':1.0, # 調(diào)節(jié)正負(fù)樣本不均衡問題'gamma':0.1, # 這個參數(shù)的值越大,算法越保守,默認(rèn)0'max_delta_step':0, # 這參數(shù)限制每棵樹權(quán)重改變的最大步長。0意味著沒有約束。'subsample':1.0, # 控制對于每棵樹,隨機(jī)采樣的比例。 # 減小這個參數(shù)的值,算法會更加保守,避免過擬合。# 如果這個值設(shè)置得過小,它可能會導(dǎo)致欠擬合。一般0.5-1'colsample_bytree':1.0, # 用來控制每棵隨機(jī)采樣的列數(shù)的占比(每一列是一個特征)。一般0.5-1'colsample_bylevel':1.0, # 控制樹的每一級的每一次分裂,對列數(shù)的采樣的占比。# 'scale_pos_weight':1, # 在各類別樣本十分不平衡時,把這個參數(shù)設(shè)定為一個正值,可以使算法更快收斂# --------------- Linear Booster 參數(shù) ---------------# 'lambda_bias':0, # 在偏置上的L2正則# 'lambda':1, # 權(quán)重的L2正則化項。默認(rèn)1# 'alpha':1, # 權(quán)重的L1正則化項。默認(rèn)1# --------------- Task 參數(shù) ---------------'objective':'multi:softprob', # 定義學(xué)習(xí)任務(wù)及相應(yīng)的學(xué)習(xí)目標(biāo)#'objective':'reg:linear', # 線性回歸#'objective':'reg:logistic', # 邏輯回歸#'objective':'binary:logistic', # 二分類的邏輯回歸問題,輸出為概率#'objective':'binary:logitraw', # 二分類的邏輯回歸問題,輸出結(jié)果為 wTx,wTx指機(jī)器學(xué)習(xí)線性模型f(x)=wTx+b#'objective':'count:poisson' # 計數(shù)問題的poisson回歸,輸出結(jié)果為poisson分布#'objective':'multi:softmax' # 讓XGBoost采用softmax目標(biāo)函數(shù)處理多分類問題,同時需要設(shè)置參數(shù)num_class#'objective':'multi:softprob' # 和softmax一樣,但是輸出的是ndata * nclass的向量,# 可以將該向量reshape成ndata行nclass列的矩陣。# 每行數(shù)據(jù)表示樣本所屬于每個類別的概率。'base_score':0.5, # 所有實例的初始預(yù)測評分, global bias# 'eval_metric''seed':0 # 默認(rèn)為0 } num_round = 20 # 循環(huán)次數(shù)bst = xgb.train(param, dtrain, num_round) # 參數(shù) + 訓(xùn)練集 + 循環(huán)次數(shù) preds = bst.predict(dtest) # 對測試集作出預(yù)測 print("訓(xùn)練完成")best_preds = np.asarray([np.argmax(line) for line in preds]) # np.argmax(line) 返回沿著line軸的最大值的索引# np.asarray 將列表轉(zhuǎn)換為數(shù)組# 精確度(Precision): # P = TP/(TP+FP) ; 反映了被分類器判定的正例中真正的正例樣本的比重 print("精確度(Precision):", precision_score(test_y, best_preds, average='macro')) # 97.32% print("召回率(Recall):", recall_score(test_y, best_preds, average='macro')) # 90.34%predicted_y = np.array(best_preds) right_y = np.array(test_y)# 混淆矩陣的每一列代表了預(yù)測類別, # 每一列的總數(shù)表示預(yù)測為該類別的數(shù)據(jù)的數(shù)目; # 每一行代表了數(shù)據(jù)的真實歸屬類別, # 每一行的數(shù)據(jù)總數(shù)表示該類別的數(shù)據(jù)實例的數(shù)目。 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: 150 NegativeTest: 99533 TP: 142 TN: 99499 FP: 8 FN: 34 TPR: 0.806818181818 TNR: 0.999919603646 PPV: 0.946666666667 NPV: 0.99965840475 FPR: 8.03963540253e-05 FDR: 0.0533333333333 FNR: 0.193181818182 ACC: 0.999578664366 F1_score: 0.871165644172 MCC: 0.87374835762 informedness: 0.806737785464 markedness: 0.946325071417 prevalence: 0.00176559694231 LRP: 10035.5071023 LRN: 0.193197350544 DOR: 51944.3308824 FOR: 0.000341595249817 '''
講道理注釋已經(jīng)很清楚了,最后的結(jié)果也不差。

進(jìn)一步的問題在于,如何使用類似 SKlearn 中的 balance 參數(shù),讓少數(shù)的詐騙1和大多數(shù)的非詐騙0均衡一下,讓1的學(xué)習(xí)權(quán)重更重。

這樣的后果就是 False Negative 值降低,但是False Positive 值急劇增高。關(guān)鍵看采用哪種策略吧。


目前的研究在于這個

'scale_pos_weight':1.0, # 調(diào)節(jié)正負(fù)樣本不均衡問題

這個參數(shù)是 XGBoost 的 SKlearn API中的,如果直接使用XGBoost好像就沒有這個參數(shù)?當(dāng)然也可能是我不明白。反正目前的參數(shù)是不錯的。


相對的,在 Github 中的程序有一個線性回歸的例子就帶有這個 balance 參數(shù),效果很奇妙...

總結(jié)

以上是生活随笔為你收集整理的XGBoost 与 信用卡诈骗数据集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。