模型融合

参考:台大机器学习技法  http://blog.csdn.NET/lho2010/article/details/42927287

          stacking&blending  http://heamy.readthedocs.io/en/latest/usage.html

1.blending

比如数据分成train和test,对于model_i(比如xgboost) ,即对所有的数据训练模型model_i,预测test数据生成预测向量v_i, 然后对train做CV fold=5,  然后对其他4份做训练数据,另外一份作为val数据,得出模型model_i_j,然后对val预测生成向量t_i_j, 然后将5分向量concat生成t_i,这是对应t_i与v_i对应,  每个模型都能生成这样一组向量,然后在顶层的模型比如LR或者线性对t向量进行训练,生成blender模型对v向量进行预测

也就是需要生成如下的一个表,训练集数据为把数据切分交叉生成,测试集为训练数据全部训练对测试集预测生成

idmodel_1model_2model_3model_4label
10.10.20.140.150
20.20.220.180.31
30.80.70.880.61
40.30.30.20.220
50.50.30.60.51

blending 的优点是:比stacking简单,不会造成数据穿越,generalizers和stackers使用不同的数据,可以随时添加其他模型到blender中。

与stacking的区别是:

 stacking在预测 测试集上时直接基于训练数据的
 blender在预测 测试集上每次cv的子集都会预测下预测集, n次cv取平均

Blending:用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。
Stacking:划分训练数据集为两个不相交的集合,在第一个集合上训练多个学习器,在第二个集合上测试这几个学习器,把第三步得到的预测结果作为输入,把正确的回应作为输出,训练一个高层学习器。





[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. from __future__ import division  
  2. import numpy as np  
  3. import load_data  
  4. from sklearn.cross_validation import StratifiedKFold  
  5. from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier, GradientBoostingClassifier  
  6. from sklearn.linear_model import LogisticRegression  
  7. from utility import *  
  8. from evaluator import *  
  9.   
  10.   
  11.   
  12. def logloss(attempt, actual, epsilon=1.0e-15):  
  13.     """Logloss, i.e. the score of the bioresponse competition. 
  14.     """  
  15.     attempt = np.clip(attempt, epsilon, 1.0-epsilon)  
  16.     return - np.mean(actual * np.log(attempt) + (1.0 - actual) * np.log(1.0 - attempt))  
  17.   
  18.   
  19. if __name__ == '__main__':  
  20.   
  21.     np.random.seed(0# seed to shuffle the train set  
  22.   
  23.     # n_folds = 10  
  24.     n_folds = 5  
  25.     verbose = True  
  26.     shuffle = False  
  27.   
  28.   
  29.     # X, y, X_submission = load_data.load()  
  30.   
  31.     train_x_id, train_x, train_y = preprocess_train_input()  
  32.     val_x_id, val_x, val_y = preprocess_val_input()  
  33.   
  34.     X = train_x  
  35.     y = train_y  
  36.     X_submission = val_x  
  37.     X_submission_y = val_y  
  38.   
  39.     if shuffle:  
  40.         idx = np.random.permutation(y.size)  
  41.         X = X[idx]  
  42.         y = y[idx]  
  43.   
  44.   
  45.     skf = list(StratifiedKFold(y, n_folds))  
  46.   
  47.     clfs = [RandomForestClassifier(n_estimators=100, n_jobs=-1, criterion='gini'),  
  48.             RandomForestClassifier(n_estimators=100, n_jobs=-1, criterion='entropy'),  
  49.             ExtraTreesClassifier(n_estimators=100, n_jobs=-1, criterion='gini'),  
  50.             ExtraTreesClassifier(n_estimators=100, n_jobs=-1, criterion='entropy'),  
  51.             GradientBoostingClassifier(learning_rate=0.05, subsample=0.5, max_depth=6, n_estimators=50)]  
  52.   
  53.     print "Creating train and test sets for blending."  
  54.       
  55.     dataset_blend_train = np.zeros((X.shape[0], len(clfs)))  
  56.     dataset_blend_test = np.zeros((X_submission.shape[0], len(clfs)))  
  57.       
  58.     for j, clf in enumerate(clfs):  
  59.         print j, clf  
  60.         dataset_blend_test_j = np.zeros((X_submission.shape[0], len(skf)))  
  61.         for i, (train, test) in enumerate(skf):  
  62.             print "Fold", i  
  63.             X_train = X[train]  
  64.             y_train = y[train]  
  65.             X_test = X[test]  
  66.             y_test = y[test]  
  67.             clf.fit(X_train, y_train)  
  68.             y_submission = clf.predict_proba(X_test)[:,1]  
  69.             dataset_blend_train[test, j] = y_submission  
  70.             dataset_blend_test_j[:, i] = clf.predict_proba(X_submission)[:,1]  
  71.         dataset_blend_test[:,j] = dataset_blend_test_j.mean(1)  
  72.         print("val auc Score: %0.5f" % (evaluate2(dataset_blend_test[:,j], X_submission_y)))  
  73.   
  74.     print  
  75.     print "Blending."  
  76.     # clf = LogisticRegression()  
  77.     clf = GradientBoostingClassifier(learning_rate=0.02, subsample=0.5, max_depth=6, n_estimators=100)  
  78.     clf.fit(dataset_blend_train, y)  
  79.     y_submission = clf.predict_proba(dataset_blend_test)[:,1]  
  80.   
  81.     print "Linear stretch of predictions to [0,1]"  
  82.     y_submission = (y_submission - y_submission.min()) / (y_submission.max() - y_submission.min())  
  83.     print "blend result"  
  84.     print("val auc Score: %0.5f" % (evaluate2(y_submission, X_submission_y)))  
  85.     print "Saving Results."  
  86.     np.savetxt(fname='blend_result.csv', X=y_submission, fmt='%0.9f')  


2.rank_avg

这种融合方法适合排序评估指标,比如auc之类的


其中weight_i为该模型权重,权重为1表示平均融合

rank_i表示样本的升序排名 ,也就是越靠前的样本融合后也越靠前

能较快的利用排名融合多个模型之间的差异,而不用去加权样本的概率值融合


3.weighted

加权融合,给模型一个权重weight,然后加权得到最终结果

weight为1时为均值融合,result_i为模型i的输出


4.bagging

从特征,参数,样本的多样性差异性来做多模型融合,参考随机森林

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python模型融合是一种将多个模型组合在一起以提高整体表现的技术。在机器学习比赛中,特别是团队参与的比赛中,模型融合是一个重要的手段,可以在模型相差较大但表现良好的情况下显著提升结果。 在Python中,有几种常见的模型融合方法。其中一种是投票法(Voting),它通过集成多个模型的预测结果,并根据多数投票的原则来确定最终的预测结果。在使用Python进行投票法模型融合时,可以使用`sklearn.ensemble.VotingClassifier`类来实现。 另一种常见的模型融合方法是堆叠法(Stacking),它通过训练一个元模型融合多个基模型的预测结果。在Python中,可以使用`mlxtend.classifier.StackingClassifier`类来实现堆叠法模型融合。 除了投票法和堆叠法,还有其他的模型融合方法,如加权平均、Bagging等。这些方法都可以在Python中通过相应的库和函数来实现。选择何种方法取决于具体的问题和数据集的特点。 总结起来,Python模型融合是一种将多个模型组合在一起以提高整体表现的技术。投票法和堆叠法是常见的模型融合方法,在Python中可以使用相应的库和函数来实现。具体选择哪种方法需要根据问题和数据集的特点来决定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [模型融合](https://blog.csdn.net/Lemon_pudding/article/details/108813638)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python数据科学竞赛模型融合](https://blog.csdn.net/qq_43240913/article/details/110822100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值