前言:由于在学习泰坦尼克预测的案例时,借用到了stacking的模型融合的方法,其中对StratifiedKFold的方法感到不是很理解,于是网上搜索了一些教程,特地记录如下,同时在文尾也会附上stacking的具体代码作为补充。

StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同。

from sklearn.model_selection import StratifiedKFold
X = np.array([[1, 2, 3, 4],
              [11, 12, 13, 14],
              [21, 22, 23, 24],
              [31, 32, 33, 34],
              [41, 42, 43, 44],
              [51, 52, 53, 54],
              [61, 62, 63, 64],
              [71, 72, 73, 74]])
 
y = np.array([1, 1, 0, 0, 1, 1, 0, 0])
 
stratified_folder = StratifiedKFold(n_splits=4, random_state=0, shuffle=False)
for train_index, test_index in stratified_folder.split(X, y):
    print("Stratified Train Index:", train_index)
    print("Stratified Test Index:", test_index)
    print("Stratified y_train:", y[train_index])
    print("Stratified y_test:", y[test_index],'\n')
 
结果:
Stratified Train Index: [1 3 4 5 6 7]
Stratified Test Index: [0 2]
Stratified y_train: [1 0 1 1 0 0]
Stratified y_test: [1 0] 
 
Stratified Train Index: [0 2 4 5 6 7]
Stratified Test Index: [1 3]
Stratified y_train: [1 0 1 1 0 0]
Stratified y_test: [1 0] 
 
Stratified Train Index: [0 1 2 3 5 7]
Stratified Test Index: [4 6]
Stratified y_train: [1 1 0 0 1 0]
Stratified y_test: [1 0] 
 
Stratified Train Index: [0 1 2 3 4 6]
Stratified Test Index: [5 7]
Stratified y_train: [1 1 0 0 1 0]
Stratified y_test: [1 0] 
从这里可以看出, StratifiedKFold返回值是对应元素的索引,如果要获取对应的元素可以借用索引的性质,来获取。

(注:当然分组还有其他的的方式,可以查看官方帮助文档)

模型融合stacking的思路
 关于stacking的方法,我在以前也做过具体的总结,但是却没有相应的代码支持,这里在学习一遍。也可参考文档

当使用stacking的结合策略时, 我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。

对于不是stacking的方法:
训练集输入->若干弱学习器-->若干弱学习器输出-->平均法投票法得到预测输出。
对于stacking方法:
训练集输入->若干弱学习器1-->若干学习器1输出(所有的输出作为学习器2的输入特征)-->次级学习器2-->学习器2输出即为预测输出。

对于stacking,次级学习器的输入不能理解为原样本的类别输出,而仅仅只是初级学习器的预测输出,这个输出对于次级学习器来说仅仅只是一个特征而已,至于是不是类别什么的并不重要。

从原理上讲,可以理解为初级学习器对原样本的特征进行了梳理,得到了更清晰的特征,方便次级学习器更容易的去学习清晰特征和类别输出的关系。

本文来自CSDN 博客,全文地址请点击:https://blog.csdn.net/qq_20412595/article/details/82561685?utm_source=copy

接下来是stacking的代码思路。

---------------------------------------------------------------------------->>>>>>>>>>>>>>>>

数据规约
线性模型需要用标准化的数据建模,而树类模型不需要标准化的数据
处理标准化的时候,注意将测试集的数据transform到test集上
from sklearn.preprocessing import StandardScaler
ss2 = StandardScaler()
ss2.fit(train_data_X)
train_data_X_sd = ss2.transform(train_data_X)
test_data_X_sd = ss2.transform(test_data_X)
 
模型融合 stacking
 
# 划分train数据集,调用代码,把数据集名字转成和代码一样
X = train_data_X_sd
X_predict = test_data_X_sd
y = train_data_Y
 
'''模型融合中使用到的各个单模型'''
from sklearn.linear_model import LogisticRegression
from sklearn import svm
import xgboost as xgb
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
 
clfs = [LogisticRegression(C=0.1,max_iter=100),
        xgb.XGBClassifier(max_depth=6,n_estimators=100,num_round = 5),
        RandomForestClassifier(n_estimators=100,max_depth=6,oob_score=True),
        GradientBoostingClassifier(learning_rate=0.3,max_depth=6,n_estimators=100)]
 
# 创建n_folds
from sklearn.cross_validation import StratifiedKFold
n_folds = 5
skf = list(StratifiedKFold(y, n_folds))
 
# 创建零矩阵
dataset_blend_train = np.zeros((X.shape[0], len(clfs)))
dataset_blend_test = np.zeros((X_predict.shape[0], len(clfs)))
 
# 建立模型
for j, clf in enumerate(clfs):
    '''依次训练各个单模型'''
    # print(j, clf)
    dataset_blend_test_j = np.zeros((X_predict.shape[0], len(skf)))
    for i, (train, test) in enumerate(skf):
        '''使用第i个部分作为预测,剩余的部分来训练模型,获得其预测的输出作为第i部分的新特征。'''
        # print("Fold", i)
        X_train, y_train, X_test, y_test = X[train], y[train], X[test], y[test]
        clf.fit(X_train, y_train)
        y_submission = clf.predict_proba(X_test)[:, 1]
        dataset_blend_train[test, j] = y_submission
        dataset_blend_test_j[:, i] = clf.predict_proba(X_predict)[:, 1]
    '''对于测试集,直接用这k个模型的预测值均值作为新的特征。'''
    dataset_blend_test[:, j] = dataset_blend_test_j.mean(1)
 
# 用建立第二层模型
clf2 = LogisticRegression(C=0.1,max_iter=100)
clf2.fit(dataset_blend_train, y)
y_submission = clf2.predict_proba(dataset_blend_test)[:, 1]
 
test = pd.read_csv("test.csv")
test["Survived"] = clf2.predict(dataset_blend_test)
test[['PassengerId','Survived']].set_index('PassengerId').to_csv('stack3.csv')

参考资料:

https://blog.csdn.net/fontthrone/article/details/79220127
————————————————
版权声明:本文为CSDN博主「且行且安~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20412595/article/details/82889655

Sklearn中的StratifiedKFold与stacking模型的融合方法相关推荐

  1. python使用sklearn中的make_classification函数生成分类模型(classification)需要的仿真数据、使用pandas查看生成数据的特征数据、目标数据

    python使用sklearn中的make_classification函数生成分类模型(classification)需要的仿真数据.使用pandas查看生成数据的特征数据(features).目标 ...

  2. sklearn中GBDT的一些参数、属性、方法的理解

    文章目录 GBDT 分类器 引入 重要参数 loss learning_rate subsample n_estimators criterion max_depth min_samples_leaf ...

  3. Python之 sklearn:sklearn中的train_test_split函数的简介及使用方法之详细攻略

    Python之 sklearn:sklearn中的train_test_split函数的简介及使用方法之详细攻略 目录 sklearn中的train_test_split函数的简介 train_tes ...

  4. Python之 sklearn:sklearn中的RobustScaler 函数的简介及使用方法之详细攻略

    Python之 sklearn:sklearn中的RobustScaler 函数的简介及使用方法之详细攻略 目录 sklearn中的RobustScaler 函数的简介及使用方法 sklearn中的R ...

  5. sklearn中的朴素贝叶斯模型及其应用

    1.使用朴素贝叶斯模型对iris数据集进行花分类 尝试使用3种不同类型的朴素贝叶斯: (1)多项式型 from sklearn import datasets iris=datasets.load_i ...

  6. sklearn中的线性回归大家族

    1 概述 1.1 线性回归大家族 回归是一种应用广泛的预测建模技术,这种技术的核心在于预测的结果是连续型变量.决策树.随机森林.支持向量机的分类器等分类算法的预测标签是分类变量,多以{0,1}来表示, ...

  7. sklearn构建stacking模型进行堆叠多模型分层级回归分析

    sklearn构建stacking模型进行堆叠多模型分层级回归分析 Stacking 就是当用初始训练数据学习出若干个基学习器后,将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器.Stac ...

  8. Python中sklearn中HistGradientBoostingRegressor回归器配置单调约束参数monotonic_cst提高回归模型的抗噪声以及局部扰动的能力

    Python中sklearn中HistGradientBoostingRegressor回归器配置单调约束参数monotonic_cst提高回归模型的抗噪声以及局部扰动的能力 目录

  9. python交叉验证函数_python – 在sklearn中使用交叉验证和AUC-ROC作为逻辑回归模型...

    我正在使用sklearn包来构建逻辑回归模型,然后对其进行评估.具体来说,我想使用交叉验证,但无法通过cross_val_score函数找出正确的方法. 根据我看到的documentation和exa ...

  10. 【机器学习技巧】回归模型的几个常用评估指标(R2、Adjusted-R2、MSE、RMSE、MAE、MAPE)及其在sklearn中的调用方式

    目录 回归模型评估的两个方面 1. 预测值的拟合程度 2. 预测值的准确度 以糖尿病数据集的回归模型为计算示例-计算各指标 1. 决定系数R2 1.1 R2求解方式一----从metrics调用r2_ ...

最新文章

  1. 【廖雪峰python入门笔记】tuple_“元素可变”
  2. 【董天一】IPFSFilecoin和复制证明
  3. CentOS7 安装 Jenkins( 构建 Vue 和 dotNET Core )
  4. 分布式系统开发注意点_分布式系统注意事项
  5. 敏捷开发一千零一问系列之二:序言及解决问题的心法(无住)
  6. php 保护变量,PHP安全:变量的前世今生
  7. Python实战(3)指定的文本列求和求平均
  8. mysql adodb_MySql AdoDB基本的函数
  9. Windows10彻底关闭安全中心
  10. 深入浅出MMC子系统
  11. 25款操作系统全面接触 [8]
  12. 【python】pygame 使用rect记录surface对象的位置并显示会造成卡顿(已解决)
  13. Redis-NoSql结构化数据库
  14. 汉明码纠错java_汉明码(Hamming)编码与纠错原理
  15. 消息通知的三种方式总结
  16. 时尚新享受,告别鼠标手
  17. 从距离、范数、內积,线性结构到度量空间、赋范空间、內积空间、欧几里得空间、巴拿赫空间、希尔伯特空间
  18. 别把“IT信息化”不当“超级工程”
  19. 傅里叶变化(一)—— 复数
  20. 论文:CVPR2020 | Strip Pooling:语义分割新trick,条纹池化取代空间池化

热门文章

  1. C++项目实战——简易版日期计算器(Date类改编)
  2. Codeforces 408 E. Curious Array
  3. 华为 USG 双机热备
  4. Virtual-Taobao: Virtualizing Real-World Online Retail Environment for Reinforcement Learning
  5. FireFox-background
  6. c#Form未能加载文件或程序集的解决方法
  7. 最新版X-Helios、X-Medusa、X-Ladon、X-Argus逆向与风控分析
  8. android 常用机型尺寸_安卓手机屏幕多大合适?6.4英寸是“黄金尺寸”吗?
  9. R 中 facet_wrap() 和 facet_grid() 的区别
  10. python的合法命名,以下不是Python语言合法命名的是:A、MyGod5B、5MyGodC、_...