1、常用算法
(1)逻辑回归
算法简单,训练速度较快。在线性回归中得到一个预测值,再将该值映射到Sigmoid函数中就完成了由值到概率的转换。 自变量取值为任意实数,值域为[0,1],可将任意的输入映射到了0至1区间。
(2)决策树
从根节点开始一步步走到叶子节点(决策),所有的数据最终都会落到叶子节点。训练过程:首先选择根节点特征(分类的效果最好的特征),接下来应该选择什么特征,考虑如何进行特征切分,最终训练成一棵完整的树。目标即通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个特征作为根节点,以此类推。衡量标准即熵值,熵是表示随机变量不确定性的度量,当数据集内部数据类别越多,越杂乱,越不稳定,即熵值越大。看经过一次决策之后,分类完熵值下降的程度。我们希望通过节点分支后数据类别的熵值大还是小来区分特征对于分类是否有用。C4.5使用信息增益率来当衡量标准;CART使用GINI系数来当作衡量标准。决策树算法容易过拟合,导致泛化能力不强,需要考虑进行适当的剪枝。
(3)Xgboost
有多个分类器,可以理解为弱分类器,把他们组合在一起即集成的方法,使得分类器效果更强。基本原理是每加一个树后模型效果能够有所提升。即保留前面t-1轮的模型预测,加入一个新的函数后第t轮的模型预测效果有所提升。需要限制叶子节点数,防止过拟合。
(4)LightGBM
在Xgboost的那一套集成学习的方式,但是它更加关注模型的训练速度,相对于xgboost,具有训练速度快和内存占用率低的特点。
2、模型评估方法
关于数据集的划分,通常需要满足两个条件,训练集和测试集的分布要与样本真实分布一致,即训练集和测试集都要保证是从样本真实分布中独立同分布采样得到的;训练集和测试集要互斥。针对数据集充足的情况下,可以采用K折交叉验证法来进行训练集划分。k折交叉验证通常将训练集D分为k份,其中k-1份作为训练集,剩余的一份作为验证集,这样就可以获得k组训练/验证集,可以进行k次训练与验证,终返回的是k个测试结果的均值。
3、简单建模
5折交叉验证
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']
folds = 5
seed = 2020
kf = KFold(n_splits=folds, shuffle=True, random_state=seed)
使用Lightgbm进行建模
from sklearn.model_selection import train_test_split
import lightgbm as lgb
from sklearn import metrics from sklearn.metrics
import roc_auc_score
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)
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(roc_auc)