XGBoost与信⽤卡诈骗数据集在Github 上⾯找到了⼀个信⽤卡诈骗数据集:
数据源于 kaggle 的信⽤卡诈骗数据。
其中给出了三种⼤⽅法,分别是神经⽹络,kmeans,以及逻辑回归。
但是今天我想要⽤XGBoost 试⼀试。
import sklearn as sk
import xgboost as xgb
import numpy as np
安全教案大班import pandas as pd
del_lection import train_test_split # 功能:数据集按⽐例切分为训练集和测试集
ics import precision_score
ics import recall_score
from sklearn.preprocessing import scale # 数据集标准化
import matplotlib.pyplot as plt
from pandas_ml import ConfusionMatrix # 引⼊混淆矩阵
# /pandas-ml/pandas-ml/
df = pd.read_csv('creditcard.csv', low_memory=Fal)
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)
导入方法
param = {
# --------------- Tree Booster 参数 ---------------
'eta':0.3, # 每个循环的学习步长,就是sklearn的learning_rate
'booster':'gbtree', # gbtree使⽤基于树的模型进⾏提升计算,gblinear使⽤线性模型进⾏提升计算
'max_depth':5, # 每棵树的最⼤深度,默认6
特务j歌词
'silent':1, # 默认0,⽽1表⽰静默模式开启,不会输出任何信息
# ---------------------------------------------------------------------
'num_class':2, # 类别个数,记得改!
# ---------------------------------------------------------------------
'min_child_weight':1.0, # 决定最⼩叶⼦节点样本权重和
# 'max_leaf_nodes': # 树上最⼤的节点或叶⼦的数量。可以替代max_depth的作⽤。
'scale_pos_weight':1.0, # 调节正负样本不均衡问题
'gamma':0.1, # 这个参数的值越⼤,算法越保守,默认0
'max_delta_step':0, # 这参数限制每棵树权重改变的最⼤步长。0意味着没有约束。
'subsample':1.0, # 控制对于每棵树,随机采样的⽐例。
# 减⼩这个参数的值,算法会更加保守,避免过拟合。
# 如果这个值设置得过⼩,它可能会导致⽋拟合。⼀般0.5-1
'colsample_bytree':1.0, # ⽤来控制每棵随机采样的列数的占⽐(每⼀列是⼀个特征)。⼀般0.5-1
'colsample_bylevel':1.0, # 控制树的每⼀级的每⼀次分裂,对列数的采样的占⽐。
# 'scale_pos_weight':1, # 在各类别样本⼗分不平衡时,把这个参数设定为⼀个正值,可以使算法更快收敛 # --------------- Linear Booster 参数 ---------------
# 'lambda_bias':0, # 在偏置上的L2正则
# 'lambda':1, # 权重的L2正则化项。默认1
# 'alpha':1, # 权重的L1正则化项。默认1
# --------------- Task 参数 ---------------
'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':'count:poisson' # 计数问题的poisson回归,输出结果为poisson分布
#'objective':'multi:softmax' # 让XGBoost采⽤softmax⽬标函数处理多分类问题,同时需要设置参数num_class #'objective':'multi:softprob' # 和softmax⼀样,但是输出的是ndata * nclass的向量,
冬去春来# 可以将该向量reshape成ndata⾏nclass列的矩阵。
# 每⾏数据表⽰样本所属于每个类别的概率。
'ba_score':0.5, # 所有实例的初始预测评分, global bias
# 'eval_metric'
'ed':0 # 默认为0
}
num_round = 20 # 循环次数
bst = ain(param, dtrain, num_round) # 参数 + 训练集 + 循环次数
preds = bst.predict(dtest) # 对测试集作出预测
print("训练完成")
best_preds = np.asarray([np.argmax(line) for line in preds]) # np.argmax(line) 返回沿着line轴的最⼤值的索引 # np.asarray 将列表转换为数组
# 精确度(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)
# 混淆矩阵的每⼀列代表了预测类别,
# 每⼀列的总数表⽰预测为该类别的数据的数⽬;
# 每⼀⾏代表了数据的真实归属类别,
# 每⼀⾏的数据总数表⽰该类别的数据实例的数⽬。
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.0396*******e-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
'''
关于国防的演讲稿讲道理注释已经很清楚了,最后的结果也不差。
进⼀步的问题在于,如何使⽤类似 SKlearn 中的 balance 参数,让少数的诈骗1和⼤多数的⾮诈骗0均衡⼀下,让1的学习权重更重。
这样的后果就是 Fal Negative 值降低,但是Fal Positive 值急剧增⾼。关键看采⽤哪种策略吧。
⽬前的研究在于这个
'scale_pos_weight':1.0, # 调节正负样本不均衡问题
这个参数是 XGBoost 的 SKlearn API中的,如果直接使⽤XGBoost好像就没有这个参数?当然也可能是我不明⽩。反正⽬前的参数是不错的。
相对的,在 Github 中的程序有⼀个线性回归的例⼦就带有这个 balance 参数,效果很奇妙...