金融风控训练营TASK04学习笔记
本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/activity/promotion/aicampfr
学习知识点概要
- 建模与调参理论知识
- 建模与调参代码运行
学习内容
1. 模型相关原理介绍
- 逻辑回归模型
https://blog.csdn.net/han_xiaoyang/article/details/49123419
- 决策树模型
https://blog.csdn.net/c406495762/article/details/76262487
- GBDT模型
https://zhuanlan.zhihu.com/p/45145899
- XGBoost模型
https://blog.csdn.net/wuzhongqiang/article/details/104854890
- 1.5 LightGBM模型
https://blog.csdn.net/wuzhongqiang/article/details/105350579
- Catboost模型
https://mp.weixin.qq.com/s/xloTLr5NJBgBspMQtxPoFA
- 时间序列模型(选学)
推荐教材:
《机器学习》
https://book.douban.com/subject/26708119/《统计学习方法》
https://book.douban.com/subject/10590856/《面向机器学习的特征工程》
https://book.douban.com/subject/26826639/《信用评分模型技术与应用》
https://book.douban.com/subject/1488075/
2. 模型调参
2.1贪心调参
- 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。
- 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性(即某个状态以后的过程不会影响以前的状态,只与当前状态有关。)所以,对所采用的贪心策略一定要仔细分析其是否满足无后效性。
https://blog.csdn.net/zhangxiaolinxin/article/details/105256588 - 需要注意的是在树模型中参数调整的顺序,也就是各个参数对模型的影响程度,这里列举一下日常调参过程中常用的参数和调参顺序:
- ①:max_depth、num_leaves
- ②:min_data_in_leaf、min_child_weight
- ③:bagging_fraction、 feature_fraction、bagging_freq
- ④:reg_lambda、reg_alpha
- ⑤:min_split_gain
例:
from sklearn.model_selection import cross_val_score
# 调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
- 可依次将模型的参数通过上面的方式进行调整优化,并且通过可视化观察在每一个最优参数下模型的得分情况
基于适度贪婪调参策略下的XGBoost集成模型
2.2 网格搜索调参
机器学习——网格搜索
网格搜索(GridSearch)及参数说明,实例演示
2.3 贝叶斯优化调参
3. pickle保存
学习问题与解答
1. data_for_model文件
task04的文件读取是直接读取特征工程以后的文件,这样可以省去再一次做特征工程的时间,但是data_for_model的文件并没有给出来,所以我们得按着他的规则来自己生成data_for_model文件,首先来看一下规则:其中数据集中用特征’sample’来区分测试集和训练集。分别是data[‘sample’]=‘train’,data[‘sample’]=‘test’,按着这个规则,我写了一段代码,把task03处理过后的数据写成data_for_model.csv文件,在这之前,在特征选择里的生成x_train和x_test还有地方需要改动以适应task04的数据读取和处理,代码如下:
features = [f for f in data_train.columns if '_outliers' not in f]
x_train = data_train[features]
features.remove('isDefault')
x_test = data_test_a[features]
y_train = data_train['isDefault']
然后只要将task03训练好的x_train和x_test传进data_for_model()就OK了,代码如下:
def data_for_model(train,test):
train['sample']='train'
test['sample']='test'
data=pd.concat([train,test])
data.to_csv('data_for_model.csv',index=None)
注:记得要把task04数据读取时的dataset去掉,我们默认是没有dataset文件,除非自己新建一个再把改好后的数据放进去。
其次,里面的reduce_mem_usage()函数我在跑过之后,后面训练出来的结果感觉总比不跑要低一点,所以我选择不跑这个函数。
2. 随机森林建模与调参(尝试)
印象中随机森林好像也是属于集成类的模型,遂想来尝试一下该模型的效果
- 首先导一下可能会使用到的库
import numpy as np
import pandas as pd
from sklearn.model_selection import GridSearchCV,train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
import datetime
from tqdm import tqdm
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
import sklearn.ensemble as ensemble
- 读取train.csv与testA.csv(数据处理的话跟task03一样就行)
train=pd.read_csv("train.csv")
testA=pd.read_csv("testA.csv")
- 划分训练与测试集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(x_train,y_train,test_size=0.2, random_state=778)
- 建模与调参
param_grid = {
'criterion':['gini'],
'max_depth':[2,3,5,8,10], # 深度:这里是森林中每棵决策树的深度
'n_estimators':[2,5,7,8,10,15,20], # 决策树个数-随机森林特有参数
'max_features':[0.1,0.3,0.5,0.7],
# 每棵决策树使用的变量占比-随机森林特有参数(结合原理)
'min_samples_split':[3,5,10,15,20] # 叶子的最小拆分样本量
}
rfc = ensemble.RandomForestClassifier()
rfc_cv = GridSearchCV(estimator=rfc, param_grid=param_grid,
scoring='roc_auc', cv=4)
rfc_cv.fit(Xtrain, Ytrain)
- 对testA进行预测,由于随机森林对于NaN和inf数值无法处理,所以还需要对testA做一点点处理,使得预测可以运行(但是我也不清楚能不能对测试集做处理,并且能的话我的处理也不知道是不是规范,所以纯属尝试)
x_test.fillna(axis=0,method='ffill',inplace=True)
x_test.replace(np.inf,1<<31,inplace=True)
y_submission = rfc_cv.predict_proba(x_test)[:, 1]
然后再用我之前提到的to_csv()函数生成文件即可。之后提交到平台反馈的得分是0.7121,按照task01的说法0.61~0.75都属于还行的分数,但是比起之前的三个集成模型还是差了一点
3.调参遇到的问题
- 网格调参
- 贝叶斯优化
我也不知道为什么会出现这些Warning,且也没有出来调参结果。
学习思考与总结
- 调参给我的感受就好像一个比较“轻松”的任务,这里的轻松指的是在了解了调参需要的过程之后,不需要再去烧脑,只要按部就班地进行就好。调参的成本我认为都在时间这里,有时调参会花费的时间可能超出你的想象,比如这个随机森林的调参,用了一个晚上加一个上午的时间,大概有16个小时吧。有时调参不一定让你满意,于是还得再来一次枯燥的等待。。。总之,task04这项任务,更像是一个体力活,要求人们拥有很好的耐性,运行、等待、修改、再运行,如此反复。
- 从篇幅和原创内容就可以看出来,这次的task我确实有些跟不上了,希望有大佬可以看穿我的伪装(┬┬﹏┬┬)