Pandas高级数据分析快速入门之六

您所在的位置:网站首页 高考大数据分析预测 Pandas高级数据分析快速入门之六

Pandas高级数据分析快速入门之六

2023-10-15 13:09| 来源: 网络整理| 查看: 265

Pandas高级数据分析快速入门之一——Python开发环境篇 Pandas高级数据分析快速入门之二——基础篇 Pandas高级数据分析快速入门之三——数据挖掘与统计分析篇 Pandas高级数据分析快速入门之四——数据可视化篇 Pandas高级数据分析快速入门之五——机器学习特征工程篇 Pandas高级数据分析快速入门之六——机器学习预测分析篇

0. 训练集、测试集

标注客户交易特征数据集[4] ,经过流失标注(流失为1,不流失为0),拆分为训练集、测试集两部分,训练集用于建立模型,测试集评估模型的预测等能力。

如何拆分训练集和测试集?

train_test_split()函数是用来随机划分样本数据为训练集和测试集的,是从样本中随机的按比例选取train_data和test_target。

优点:随机客观的划分数据,减少人为因素

完整模板:

x_train,x_test, y_train, y_test = train_test_split(train_data,train_target,test_size=0.3,random_state=5)

参数解释:

train_data:待划分样本数据train_target:待划分样本数据的结果(标签)test_size:测试数据占样本数据的比例,若整数则样本数量random_state:设置随机数种子,保证每次都是同一个随机数。若为0或不填,则每次得到数据都不一样 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split import xgboost as xgb from xgboost import plot_importance import matplotlib.pyplot as plt from sklearn.metrics import accuracy_score,precision_score from sklearn.metrics import recall_score from sklearn.metrics import roc_auc_score

把数据集拆分为训练集和测试集。

Columns_Name = ['flag','carduser_id','balance','balancerate',...] df = pd.read_csv('train0605.csv') cols = Columns_Name.copy() cols.remove('carduser_id') df = df[cols] # 构建数据集 flag_col = 'flag' X = df.drop([flag_col],axis=1) Y = df[[flag_col]] # 2、拆分训练数据与测试数据,为了进行交叉验证 x_train,x_test, y_train, y_test = train_test_split(X,Y,test_size=0.3) 1. XGBoost分类模型训练

XGBoost号称“比赛夺冠的必备大杀器”,横扫机器学习Kaggle、天池、DataCastle、Kesci等国内外数据竞赛罕逢敌手,堪称机器学习算法中的王者,业界使用者众多!

在涉及非结构化数据(图像、文本等)的预测问题中,人工神经网络显著优于所有其他算法或框架。但当涉及到中小型结构/表格数据时,基于决策树的算法现在被认为是最佳方法。而基于决策树算法中最惊艳的,非XGBoost莫属了。

XGBoost最初由陈天奇开发。陈天奇是华盛顿大学计算机系博士生,研究方向为大规模机器学习。他曾获得KDD CUP 2012 Track 1第一名,并开发了SVDFeature,XGBoost,cxxnet等著名机器学习工具,是Distributed (Deep) Machine Learning Common的发起人之一。

1.1. 输入数据集

XGBoost中使用的数据矩阵DMatrix。

DMatrix是XGBoost使用的一种内部数据结构,它针对内存效率和训练速度进行了优化。您可以从多个不同的数据源构造DMatrix。

xgboost.DMatrix(data,label=None,*,weight=None…)

参数:

data(os.PathLike/string/numpy.array/scipy.sparse/pd.DataFrame/)–DMatrix的数据源。xgboost可以读取的二进制文件。

label – 训练数据的标签。

dtrain = xgb.DMatrix(x_train, label=y_train) dtest = xgb.DMatrix(x_test,label=y_test) 1.2. 超参数设置 学习任务参数objective

objective [默认= reg:squarederror]

multi:softmax:设置XGBoost以使用softmax目标进行多类分类,还需要设置num_class(类数)multi:softprob:与softmax相同,但输出向量,可以进一步将其整形为矩阵。结果包含属于每个类别的每个数据点的预测概率。ndata * nclass 验证数据的评估指标eval_metric [根据目标默认] mlogloss:多分类的loglossmerror:多类分类错误率。计算公式为。#(wrong cases)/#(all cases) Tree Booster参数 eta[默认= 0.3,别名:learning_rate] 在更新中使用步长收缩以防止过度拟合。在每个增强步骤之后,我们都可以直接获得新特征的权重,并eta缩小特征权重以使增强过程更加保守。范围:[0,1]gamma[默认= 0,别名:min_split_loss] 在树的叶节点上进行进一步分区所需的最小损失减少。越大gamma,算法将越保守。范围:[0,∞]max_depth [默认= 6] 一棵树的最大深度。增加此值将使模型更复杂,并且更可能过度拟合。仅lossguided当tree_method设置为hist且表示深度没有限制时,才在增长策略中接受0 。注意,训练一棵深树时,XGBoost会大量消耗内存。范围:[0,∞](仅lossguided当tree_method设置为时,增长策略才接受0 hist)min_child_weight [默认值= 1] 子级中实例重量的最小总和(hessian)。如果树划分步骤导致叶节点的实例权重之和小于min_child_weight,则构建过程将放弃进一步的划分。在线性回归任务中,这仅对应于每个节点中需要的最少实例数。越大min_child_weight,算法将越保守。范围:[0,∞]

实际案例代码如下:

params ={'learning_rate': 0.1, 'max_depth': 10, # 构建树的深度,越大越容易过拟合 'num_boost_round':2000, 'gamma': 0.1, # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。 'objective': 'multi:softprob', # 多分类的问题 'random_state': 1, 'silent':0, 'subsample':0.8, # 用于训练模型的子样本占整个样本集合的比例 'min_child_weight':3, # [0,无穷],越大越趋于保守,有利于防止过拟合 'num_class':2, # 类别数,与 multisoftmax 并用 'colsample_bytree':0.9, # 特征比例 'seed':3, 'eval_metric':['mlogloss','merror'] #,'auc'], # 多分类情况 } 1.3. 模型训练 watchlist = [(dtrain,'train'),(dtest,'eval')] evals_result = {} best_nround = 200 model = xgb.train(params,dtrain,num_boost_round=best_nround,evals = watchlist,evals_result=evals_result)

(1)学习过程监控 训练过程监控输出,使用watchlist(list数据类型)不会影响模型训练。

[0] train-mlogloss:0.62928 train-merror:0.10594 eval-mlogloss:0.63007 eval-merror:0.11204 [1] train-mlogloss:0.57597 train-merror:0.09733 eval-mlogloss:0.57752 eval-merror:0.10408 [2] train-mlogloss:0.53121 train-merror:0.09527 eval-mlogloss:0.53324 eval-merror:0.10269 [3] train-mlogloss:0.49237 train-merror:0.09376 eval-mlogloss:0.49516 eval-merror:0.10094 [4] train-mlogloss:0.45872 train-merror:0.09190 eval-mlogloss:0.46240 eval-merror:0.09932 [5] train-mlogloss:0.43001 train-merror:0.09100 eval-mlogloss:0.43436 eval-merror:0.09835

(2)可视化输出学习过程,损失、错误率变换情况: 在这里插入图片描述

import matplotlib.pyplot as plt from sklearn.metrics import accuracy_score,precision_score from sklearn.metrics import recall_score from sklearn.metrics import roc_auc_score print('绘制训练AUC下降趋势图') #验证数据评估指标,与param参数,'eval_metric':['logloss','error','auc']相关 #验证包括训练和验证两个部分(train、eval),如上所示3个参数,则是6组数据 plt.figure(111) plt.rcParams['font.family']='sans-serif' plt.rcParams['font.sans-serif']=['KaiTi'] #显示中文 plt.rcParams['axes.unicode_minus']=False plt.grid() plt.plot(evals_result['train']['mlogloss'],label = '训练集-损失',color='green') plt.plot(evals_result['train']['merror'],label = '训练集-错误率',color='blue') plt.plot(evals_result['eval']['mlogloss'],label = '评估集-损失',color='deeppink') plt.plot(evals_result['eval']['merror'],label = '评估集-错误率',color='red') plt.xlabel('训练次数') # 显示图例 plt.legend()

(4)输出预测结果

y_pred=model.predict(xgb.DMatrix(x_test)) yprob = np.argmax(y_pred, axis=1) # return the index of the biggest pro predictions = [value for value in yprob] # 用于多分类 # 计算准确率 accuracy = accuracy_score(y_test, predictions) print("Accuracy: %.2f%%" % (accuracy * 100.0)) print(params) Accuracy: 96.12% {'learning_rate': 0.1, 'max_depth': 10, 'num_boost_round': 2000, 'gamma': 0.1, 'objective': 'multi:softprob', 'random_state': 1, 'silent': 0, 'subsample': 0.8, 'min_child_weight': 3, 'num_class': 2, 'colsample_bytree': 0.9, 'seed': 3, 'eval_metric': ['mlogloss', 'merror']} 绘制训练AUC下降趋势图 1.4. 模型持久化

训练结束时保存为模型文件。

test = False Model_Filename = 'XGboost0605.model' if test==False: model.save_model(Model_Filename) 2. 预测结果分析 2.1. 重要特征

完成模型训练,给出特征重要分值,如下图所示显示特征重要程度图(截取部分)。 在这里插入图片描述 XGBoost的特征重要性是如何得到的?某个特征的重要性(feature score),等于它被选中为树节点分裂特征的次数的和,比如特征“daysnum”在第一次迭代中(即第一棵树)被选中了1次去分裂树节点,在第二次迭代被选中2次……那么最终特征“daysnum”的feature score就是 1+2+….。

# 显示重要特征 fig,ax = plt.subplots(figsize=(15,15)) plt.rcParams['font.sans-serif']=['KaiTi'] #显示中文 plt.rcParams['font.family']='sans-serif' plt.rcParams['axes.unicode_minus']=False plot_importance(model, ax=ax, height=0.5, title='特征重要程度', xlabel='特征值', ylabel='特征') plt.subplots_adjust(left=0.4) 2.2. 模型评估

基于机器学习的混淆矩阵,以及常用的准确率、精准率、召回率、F1分数、ROC与AUC曲线等做为此二分类问题模型的评价指标。

ROC与AUC曲线如图所示。 在这里插入图片描述 模型评估工具,使用sklearn的metrics,metrics包含了许多模型评估指标括:分类、回归、聚类等模型评估工具。

由于此部分通用性较强,封装成类Multi_class_evaluation便于使用,详情参考博文[1]。

import Multi_class_evaluation Mce = Multi_class_evaluation.Multi_class_evaluation(y_test,y_pred,n_class=2,flag='flag') #多分类方式 def get_one_hot(y_pred): y_pred = np.round(y_pred) y_pred2 = [] for v in y_pred: v = int(v) tmp = np.zeros(2,dtype=np.int) tmp[v] = tmp[v] + 1 y_pred2.append(tmp) y_pred2 = np.array(y_pred2) return y_pred2 Mce.calculation_ROC_AUC() Mce.draw_ROC() y, y_ =Mce.y, Mce.y_pred precision = precision_score(y_test.values, np.array(predictions),average='macro') print('precision Score: %.2f%%' % (precision*100.0)) recall = recall_score(y_test.values, np.array(predictions),average='macro') print('Recall Score: %.2f%%' % (recall*100.0)) auc = roc_auc_score(y, y_ ,multi_class='ovo',average='macro') print('Roc Auc Score: %.2f%%' % (auc*100.0)) 3. XGBoost分类持久化模型应用

通过xgb.Booster()加载持久化模型文件,执行predict()预测方法预测。

XGB_Model = xgb.Booster(model_file=Model_Filename) x = xgb.DMatrix(x_test) #模型预测 y = XGB_Model.predict(x) yprob = np.argmax(y, axis=1) # return the index of the biggest pro print(yprob) # 取预测结果标识 y_pred = [value for value in yprob] #print(y_pred) # 取预测概率,索引第二列(1)为流失 yprob = np.round(y[:,1]*100,2) print(yprob) 附录:参数 学习任务参数objective

objective [默认= reg:squarederror]

multi:softmax:设置XGBoost以使用softmax目标进行多类分类,还需要设置num_class(类数)multi:softprob:与softmax相同,但输出向量,可以进一步将其整形为矩阵。结果包含属于每个类别的每个数据点的预测概率。ndata * nclass 其他配置reg:squarederror:损失平方回归。reg:squaredlogerror:对数损失平方回归 所有输入标签都必须大于-1。另外,请参阅指标rmsle以了解此目标可能存在的问题。reg:logistic:逻辑回归reg:pseudohubererror:使用伪Huber损失进行回归,这是绝对损失的两倍可微选择。binary:logistic:二元分类的逻辑回归,输出概率binary:logitraw:用于二进制分类的逻辑回归,逻辑转换之前的输出得分binary:hinge:二进制分类的铰链损失。这使预测为0或1,而不是产生概率。count:poisson –计数数据的泊松回归,泊松分布的输出平均值 max_delta_step 在泊松回归中默认设置为0.7(用于维护优化)survival:cox:针对正确的生存时间数据进行Cox回归(负值被视为正确的生存时间)。请注意,预测是按危险比等级返回的(即,比例危险函数中的HR = exp(marginal_prediction))。h(t) = h0(t) * HRsurvival:aft:用于检查生存时间数据的加速故障时间模型。有关详细信息,请参见具有加速故障时间的生存分析。aft_loss_distribution:survival:aft目标和aft-nloglik度量使用的概率密度函数。rank:pairwise:使用LambdaMART进行成对排名,从而使成对损失最小化rank:ndcg:使用LambdaMART进行列表式排名,使标准化折让累积收益(NDCG)最大化rank:map:使用LambdaMART进行列表平均排名,使平均平均精度(MAP)最大化reg:gamma:使用对数链接进行伽马回归。输出是伽马分布的平均值。例如,对于建模保险索赔的严重性或对可能是伽马分布的任何结果,它可能很有用。reg:tweedie:使用对数链接进行Tweedie回归。它可能有用,例如,用于建模保险的总损失,或用于可能是Tweedie分布的任何结果。 验证数据的评估指标eval_metric [根据目标默认] mlogloss:多分类的loglossmerror:多类分类错误率。计算公式为。#(wrong cases)/#(all cases) 其他配置:rmse:均方根误差rmsle:均方根对数误差

reg:squaredlogerror目标的默认指标。此指标可减少数据集中异常值所产生的错误。但是由于log采用功能,rmsle可能nan在预测值小于-1时输出。有关reg:squaredlogerror其他要求,请参见。

mae:平均绝对误差mape:平均绝对百分比误差mphe:平均伪Huber错误。reg:pseudohubererror目标的默认指标。logloss:负对数似然error:二进制分类错误率。计算公式为。对于预测,评估会将预测值大于0.5的实例视为肯定实例,而将其他实例视为否定实例。#(wrong cases)/#(all cases)error@t:可以通过提供’t’的数值来指定不同于0.5的二进制分类阈值。merror:多类分类错误率。计算公式为。#(wrong cases)/#(all cases)auc:曲线下面积aucpr:PR曲线下的面积ndcg:归一化累计折扣map:平均平均精度ndcg@n,map@n:'n’可以被指定为整数,以切断列表中的最高位置以进行评估。ndcg-,map-,ndcg@n-,map@n-:在XGBoost,NDCG和MAP将评估清单的比分没有任何阳性样品为1加入-在评价指标XGBoost将评估这些得分为0,是在一定条件下一致""。poisson-nloglik:泊松回归的负对数似然gamma-nloglik:伽马回归的对数似然比为负cox-nloglik:Cox比例风险回归的负对数似然率 -gamma-deviance:伽马回归的剩余偏差 -tweedie-nloglik:Tweedie回归的负对数似然(在tweedie_variance_power参数的指定值处)aft-nloglik:加速故障时间模型的负对数可能性。有关详细信息,请参见具有加速故障时间的生存分析。interval-regression-accuracy:其预测标签位于间隔检查的标签中的数据点的分数。仅适用于间隔检查的数据。有关详细信息,请参见具有加速故障时间的生存分析。

参考:

[1] . 肖永威 .不平衡多分类问题模型评估指标探讨与sklearn.metrics实践 ,CSDN博客 , 2021.05 [2] . 忆凡人生 .【ML-6-4-1】xgboost参数说明 ,博客园,yifanhunter, 2020.10 [3] . 肖永威 . XGBoost线性回归工控数据分析实践案例(原生篇) ,CSDN博客 ,2020.08 [4] . 肖永威 . Pandas高级数据分析快速入门之五——机器学习特征工程篇 ,CSDN博客 ,2021.09



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3