金融风控-TASK05模型融合
学习目标:将之前建模调参的结果进行模型融合。
内容
以下是模型融合的方式:
- 平均:
简单平均法
加权平均法 - 投票:
简单投票法
加权投票法 - 综合:
排序融合
log融合 - stacking:
构建多层模型,并利用预测结果再拟合预测。 - blending:
选取部分数据预测训练得到预测结果作为新特征,带入剩下的数据中预测。 - boosting/bagging
stacking\blending
Stacking和Blending都是模型自身融合方法。
推荐的博客的方法:
第一层:xgb和lgb
第二层:LinearRegressor
最后结果层面加权融合。
stacking:五折交叉验证,出来的五个结果就是第二层的训练集。
blending:第一层的预测结果取平均,作为第二层的训练集。
1分类任务的融合方式:voting//回归任务的融合方式:平均融合机制(Averaging)
1.1回归任务的加权融合
根据各个模型的最终预测表现分配不同的权重以改变其对最终结果影响的大小。对于正确率低的模型给予更低的权重,而正确率更高的模型给予更高的权重。
下面对三个模型进行加权融合:
def Weighted_method(test_pre1, test_pre2, test_pre3, w=[1/3, 1/3, 1/3]):
Weighted_result = w[0] * pd.Series(test_pre1) + w[1] * pd.Series(test_pre2) + w[2] * pd.Series(test_pre3)
return Weighted_result
#定义了一个加权融合的函数,输入是三个模型,和权重list。输出是预测结果。
模型融合的方式:除了加权取平均,还可以结果取平均,取中位数等。
加权融合 | 适用于回归任务中模型的结果层面 |
---|---|
voting | 适用于分类任务中结果结合策略 |
1.2分类任务中的voting
基本思想是选择所有机器学习算法当中输出最多的那个类。
让不同的算法对同一个问题进行预测,最终少数服从多数。即集成学习。
对于分类问题,假设有三个相互独立的模型,每个正确率都是0.7,采用少数服从多数的方式进行投票(那么认为正确的情况只有2种:3个都认为正确;2个认为正确,1个认为不正确,这一个不正确可以是三个模型任意一个,所以下面的公式×3)。
那么最终的正确率是:
0.7×0.7×0.7+0.7×0.7×0.3×3=0.343+0.441=0.784
因此正确率提高了0.08
使用voting的前提是:模型之间相互独立,结果之间没有相关性。越相近的模型进行融合,融合效果也会越差。
sklearn中的VotingClassifier是投票法的实现, 投票法的输出有两种类型:一种是直接输出类标签,另外一种是输出类概率,使用前者进行投票叫做硬投票(Majority/Hard voting),使用后者进行分类叫做软投票(Soft voting)。 这个是通过voting参数进行控制。
代码实现
1.平均
1.1简单平均
pre = (pre1 + pre2 + pre3 +...+pren )/n
其中,pre1 到pren分别是各个模型预测出来的结果。
1.2加权平均
pre = 0.3pre1 + 0.3pre2 + 0.4pre3
权重之和要为1
2.投票
2.1简单投票
from xgboost import XGBClassifier #XGB分类器
from sklearn.linear_model import LogisticRegression #逻辑回归
from sklearn.ensemble import RandomForestClassifier, VotingClassifier #随机森林,投票分类
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2, subsample=0.7,objective='binary:logistic')
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))
LogisticRegression参数说明:
LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1,
class_weight=None, random_state=None, solver='warn', max_iter=100, multi_class='warn', verbose=0, warm_start=False, n_jobs=None)
- penalty:惩罚项,可为11或12
调参时如果是为了解决过拟合,选择12正则化就够了。如果还是过拟合,在考虑11正则化。
若模型特征非常多,希望一些不重要的特征系数归0,让模型系数化,可用11正则化。 - dual:选择目标函数为原始形式还是对偶形式
- tol:优化算法停止的条件。当迭代前后的函数差值小于等于tol时就停止。
- C:正则化系数。
- fit_intercept:选择逻辑回归模型中是否会有常数项b
- intercept_scaling:float类型,default:1.0,
仅在使用solver为“liblinear”且fit_intercept=True时有用。 在这种情况下,x变为[x,intercept_scaling],即具有等于intercept_scaling的常数值的“合成”特征被附加到实例矢量。 截距变成了intercept_scaling * synthetic_feature_weight. - class_weight : 标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。
- random_state: 在随机数据混洗时使用的伪随机数生成器的种子。如果为None,则随机数生成器是np.random使用的RandomState实例。
- solver: 使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
- max_iter: 求解器收敛的最大迭代次数。
- multi_class:采用多分类器逻辑回归策略。
- verbose:用于开启/关闭迭代中间输出的日志。对于liblinear和lbfgs求解器,将verbose设置为任何正数以表示详细程度。
- warm_start:如果为True,那么使用前一次训练结果继续训练,否则从头开始训练。对于liblinear解算器没用。
- n_jobs:如果multi_class =‘ovr’,则在对类进行并行化时使用的CPU数量。 无论是否指定’multi_class’,当solver设置’liblinear’时,都会忽略此参数。 如果给定值-1,则使用所有CPU。
RandomForestClassifier参数说明
clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=4)
n_estimators : 随机森林中树的个数,即学习器的个数。
max_features : 划分叶子节点,选择的最大特征数目
n_features:在寻找最佳分割时要考虑的特征数量
max_depth : 树的最大深度,如果选择default=None,树就一致扩展,直到所有的叶子节点都是同一类样本,或者达到最小样本划分(min_samples_split)的数目。
min_samples_split : 最小样本划分的数目,就是样本的数目少于等于这个值,就不能继续划分当前节点了
min_samples_leaf : 叶子节点最少样本数,如果某叶子节点数目小于这个值,就会和兄弟节点一起被剪枝。
min_weight_fraction_leaf:叶子节点最小的样本权重和
max_leaf_nodes: 最大叶子节点数,默认是”None”,即不限制最大的叶子节点数
min_impurity_split:节点划分的最小不纯度,是结束树增长的一个阈值,如果不纯度超过这个阈值,那么该节点就会继续划分,否则不划分,成为一个叶子节点。
min_impurity_decrease : 最小不纯度减少的阈值,如果对该节点进行划分,使得不纯度的减少大于等于这个值,那么该节点就会划分,否则,不划分。
bootstrap :自助采样,又放回的采样,大量采样的结果就是初始样本的63.2%作为训练集。默认选择自助采样法。
oob_score : bool (default=False)
out-of-bag estimate,包外估计;是否选用包外样本(即bootstrap采样剩下的36.8%的样本)作为验证集,对训练结果进行验证,默认不采用。
n_jobs : 并行使用的进程数,默认1个,如果设置为-1,该值为总的核数。
random_state :随机状态,默认由np.numpy生成
verbose:显示输出的一些参数,默认不输出。
XGBClassifier参数说明
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2, subsample=0.7,objective='binary:logistic')
- learning_rate:学习率,控制每次迭代更新权重时的步长,默认0.3
- n_estimators:总共迭代的次数,即决策树的个数
- max_depth:树的深度,默认值为6,典型值3-10
- min_child_weight:值越大,越容易欠拟合;值越小,越容易过拟合(值较大时,避免模型学习到局部的特殊样本)。
- subsample:训练每棵树时,使用的数据占全部训练集的比例。
- objective:目标函数,binary:logistic—二分类。