Advertisement

金融风控训练营建模与调参学习笔记

阅读量:

本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,学习链接为

https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.20850282.J_3678908510.8.f2984d57yjzdFf&postId=170951

一、学习知识点概要

  • 金融风险控制领域中常见的机器学习模型包括二分类算法、决策树算法以及集成学习方法等
    • 机器学习模型的构建过程及其参数优化流程是两个关键环节

二、学习内容

2.1逻辑回归模型

该模型以线性回归为基础进行优化,由于线性回归无法有效区分分类变量的特性,在此基础上进行了优化。为了将输出值限定在合理的范围内,通过Sigmoid函数将输出值映射至(0,1)区间,进而实现概率预测。

逻辑回归的优点为:

  • 该方法具有较高的训练效率,在分类任务中,其计算复杂度仅与特征数量相关。
    • 该模型设计简洁直观且易于理解,在可解释性方面表现出色。通过分析各特征的权重值(weight values),可以清晰地观察到不同特征对模型输出结果的影响机制。
    • 该算法特别适用于解决二分类问题,在数据预处理阶段无需进行输入特征的缩放处理。
    • 资源占用较低,在内存管理方面表现出色——仅需存储各个维度(dimensions)对应的特征值(feature values)。

缺点为:

逻辑回归需要预先处理缺失值和异常值【可参考task3特征工程】

对于非线性问题而言,Logistic回归并不适合用来解决该类问题;这是因为该模型基于线性分隔器的设计基础。

对多重共线性数据较为敏感,且很难处理数据不平衡的问题;

准确率并不是很高,因为形式非常简单,很难去拟合数据的真实分布;

查看数据在空间的分布

复制代码
 from numpy import loadtxt, where

    
 from pylab import scatter, show, legend, xlabel, ylabel
    
  
    
 #load the dataset
    
 data = loadtxt('/home/HanXiaoyang/data/data1.txt', delimiter=',')
    
  
    
 X = data[:, 0:2]
    
 y = data[:, 2]
    
  
    
 pos = where(y == 1)
    
 neg = where(y == 0)
    
 scatter(X[pos, 0], X[pos, 1], marker='o', c='b')
    
 scatter(X[neg, 0], X[neg, 1], marker='x', c='r')
    
 xlabel('Feature1/Exam 1 score')
    
 ylabel('Feature2/Exam 2 score')
    
 legend(['Fail', 'Pass'])
    
 show()
    
  
    
 ————————————————
    
 版权声明:本文为博主「寒小阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    
 原文链接:
    
    
    
    
    AI写代码

写好计算sigmoid函数、代价函数、和梯度下降的程序:

复制代码
 def sigmoid(X):

    
     '''Compute sigmoid function '''
    
     den =1.0+ e **(-1.0* X)
    
     gz =1.0/ den
    
     return gz
    
 def compute_cost(theta,X,y):
    
     '''computes cost given predicted and actual values'''
    
     m = X.shape[0]#number of training examples
    
     theta = reshape(theta,(len(theta),1))
    
     
    
     J =(1./m)*(-transpose(y).dot(log(sigmoid(X.dot(theta))))- transpose(1-y).dot(log(1-sigmoid(X.dot(theta)))))
    
     
    
     grad = transpose((1./m)*transpose(sigmoid(X.dot(theta))- y).dot(X))
    
     #optimize.fmin expects a single value, so cannot return grad
    
     return J[0][0]#,grad
    
 def compute_grad(theta, X, y):
    
     '''compute gradient'''
    
     theta.shape =(1,3)
    
     grad = zeros(3)
    
     h = sigmoid(X.dot(theta.T))
    
     delta = h - y
    
     l = grad.size
    
     for i in range(l):
    
         sumdelta = delta.T.dot(X[:, i])
    
         grad[i]=(1.0/ m)* sumdelta *-1
    
     theta.shape =(3,)
    
     return  grad
    
  
    
  
    
 ————————————————
    
 版权声明:本文为博主「寒小阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    
 原文链接:
    
    
    
    
    AI写代码

得到的图像

使用判定边界对training data做一个预测,并比对准确率:

结果为89.2%

复制代码
 def predict(theta, X):

    
     '''Predict label using learned logistic regression parameters'''
    
     m, n = X.shape
    
     p = zeros(shape=(m,1))
    
     h = sigmoid(X.dot(theta.T))
    
     for it in range(0, h.shape[0]):
    
         if h[it]>0.5:
    
             p[it,0]=1
    
         else:
    
             p[it,0]=0
    
     return p
    
 #Compute accuracy on our training set
    
 p = predict(array(theta), it)
    
 print'Train Accuracy: %f'%((y[where(p == y)].size / float(y.size))*100.0)
    
 ————————————————
    
 版权声明:本文为博主「寒小阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    
 原文链接:
    
    
    
    
    AI写代码

2.2模型评估的标准

以ROC曲线与坐标轴围成的区域面积作为模型评估的标准,在机器学习领域中常用AUC值来衡量分类器的性能表现。具体而言,在二分类问题中,其值越接近1,则表明模型性能越优;反之,则表明模型预测能力较弱。

ROC 曲线越靠近左上角,则该分类器的性能越佳,并且其泛化能力就越强。对于两个模型而言,在以下两种情况下进行比较:当模型 A 的 ROC 曲线下方区域完全覆盖了模型 B 时,则认为模型 A 优于 model B;如果两条 ROCCurve 存在交叉,则需通过比较两曲线下方区域与坐标轴围成的面积来进行判断。

2.3简单建模

建模前的处理

复制代码
 from sklearn.model_selection import KFold

    
 # 分离数据集,方便进行交叉验证
    
 X_train = data.loc[data['sample']=='train', :].drop(['id','issueDate','isDefault', 'sample'], axis=1)
    
 X_test = data.loc[data['sample']=='test', :].drop(['id','issueDate','isDefault', 'sample'], axis=1)
    
 y_train = data.loc[data['sample']=='train', 'isDefault']
    
  
    
 # 5折交叉验证
    
 folds = 5
    
 seed = 2020
    
 kf = KFold(n_splits=folds, shuffle=True, random_state=seed)
    
    
    
    
    AI写代码

使用Lightgbm建模

复制代码
 """对训练集数据进行划分,分成训练集和验证集,并进行相应的操作"""

    
 from sklearn.model_selection import train_test_split
    
 import lightgbm as lgb
    
 # 数据集划分
    
 X_train_split, X_val, y_train_split, y_val = train_test_split(X_train, y_train, test_size=0.2)
    
 train_matrix = lgb.Dataset(X_train_split, label=y_train_split)
    
 valid_matrix = lgb.Dataset(X_val, label=y_val)
    
  
    
 params = {
    
         'boosting_type': 'gbdt',
    
         'objective': 'binary',
    
         'learning_rate': 0.1,
    
         'metric': 'auc',
    
         'min_child_weight': 1e-3,
    
         'num_leaves': 31,
    
         'max_depth': -1,
    
         'reg_lambda': 0,
    
         'reg_alpha': 0,
    
         'feature_fraction': 1,
    
         'bagging_fraction': 1,
    
         'bagging_freq': 0,
    
         'seed': 2020,
    
         'nthread': 8,
    
         'silent': True,
    
         'verbose': -1,
    
 }
    
  
    
 """使用训练集数据进行模型训练"""
    
 model = lgb.train(params, train_set=train_matrix, valid_sets=valid_matrix, num_boost_round=20000, verbose_eval=1000, early_stopping_rounds=200)
    
    
    
    
    AI写代码

对验证集进行预测

复制代码
 from sklearn import metrics

    
 from sklearn.metrics import roc_auc_score
    
  
    
 """预测并计算roc的相关指标"""
    
 val_pre_lgb = model.predict(X_val, num_iteration=model.best_iteration)
    
 fpr, tpr, threshold = metrics.roc_curve(y_val, val_pre_lgb)
    
 roc_auc = metrics.auc(fpr, tpr)
    
 print('未调参前lightgbm单模型在验证集上的AUC:{}'.format(roc_auc))
    
 """画出roc曲线图"""
    
 plt.figure(figsize=(8, 8))
    
 plt.title('Validation ROC')
    
 plt.plot(fpr, tpr, 'b', label = 'Val AUC = %0.4f' % roc_auc)
    
 plt.ylim(0,1)
    
 plt.xlim(0,1)
    
 plt.legend(loc='best')
    
 plt.title('ROC')
    
 plt.ylabel('True Positive Rate')
    
 plt.xlabel('False Positive Rate')
    
 # 画出对角线
    
 plt.plot([0,1],[0,1],'r--')
    
 plt.show()
    
    
    
    
    AI写代码

2.4模型调参

贪心调参

首先采用对模型影响最为显著的参数进行微调,在当前参数设置下使模型达到最佳状态;随后采用次 influential 参数继续微调;需要注意的是这种方法可能导致模型陷入局部最优而非全局最优的情况;虽然这一过程可能较为繁琐但逐步优化能够有效提升整体性能

复制代码
 # 调objective

    
 best_obj = dict()
    
 for obj in objective:
    
     model = LGBMRegressor(objective=obj)
    
     """预测并计算roc的相关指标"""
    
     score = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc').mean()
    
     best_obj[obj] = score
    
    
    
    
    AI写代码
复制代码
 # num_leaves

    
 best_leaves = dict()
    
 for leaves in num_leaves:
    
     model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0], num_leaves=leaves)
    
     """预测并计算roc的相关指标"""
    
     score = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc').mean()
    
     best_leaves[leaves] = score
    
    
    
    
    AI写代码

三、学习问题

逻辑回归中hθ(x)=g(θTX)≥0.5, 则θTX≥0, 此时意味着预估y=1 不明白什么意思

h_θ(x)的输出范围限定在[0,1]之间,并且其图形呈现出以坐标原点为中心的轴对称特征(如Sigmoid函数曲线所示)。因此将输出结果等于等于临界值的情况定义为边界条件:当且仅当h_θ(x)=g(θ^T x)= ½时成立。由此可得参数向量满足条件:当且仅当输入空间中的样本特征向量满足特定关系式时才达到该临界状态。在实际应用中用于分类的任务中将类别标签划分为两个互斥的部分:对于所有满足h_θ(x) ≥ ½ 的样本实例赋予类别标记1;而对于所有满足h_θ(x) ≤ ½ 的样本实例则赋予类别标记0;这样的判别方式使得分类器能够清晰地区分不同类别的样本数据分布区域

四、学习的思考与总结

在探讨逻辑回归与线性回归之间的关系时,在分析过程中我们发现这一发现为我们提供了一个有效的解决方案思路。通过适当的数学函数映射使分类数据得以区分。

引用:逻辑回归<>

金融风控学习平台第四期课程https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.20850282.J_3678908510.8.f2984d57yjzdFf&postId=170951

全部评论 (0)

还没有任何评论哟~