Sklearn中的StratifiedKFold与stacking模型的融合方法
前言:由于在学习泰坦尼克预测的案例时,借用到了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模型的融合方法相关推荐
- python使用sklearn中的make_classification函数生成分类模型(classification)需要的仿真数据、使用pandas查看生成数据的特征数据、目标数据
python使用sklearn中的make_classification函数生成分类模型(classification)需要的仿真数据.使用pandas查看生成数据的特征数据(features).目标 ...
- sklearn中GBDT的一些参数、属性、方法的理解
文章目录 GBDT 分类器 引入 重要参数 loss learning_rate subsample n_estimators criterion max_depth min_samples_leaf ...
- Python之 sklearn:sklearn中的train_test_split函数的简介及使用方法之详细攻略
Python之 sklearn:sklearn中的train_test_split函数的简介及使用方法之详细攻略 目录 sklearn中的train_test_split函数的简介 train_tes ...
- Python之 sklearn:sklearn中的RobustScaler 函数的简介及使用方法之详细攻略
Python之 sklearn:sklearn中的RobustScaler 函数的简介及使用方法之详细攻略 目录 sklearn中的RobustScaler 函数的简介及使用方法 sklearn中的R ...
- sklearn中的朴素贝叶斯模型及其应用
1.使用朴素贝叶斯模型对iris数据集进行花分类 尝试使用3种不同类型的朴素贝叶斯: (1)多项式型 from sklearn import datasets iris=datasets.load_i ...
- sklearn中的线性回归大家族
1 概述 1.1 线性回归大家族 回归是一种应用广泛的预测建模技术,这种技术的核心在于预测的结果是连续型变量.决策树.随机森林.支持向量机的分类器等分类算法的预测标签是分类变量,多以{0,1}来表示, ...
- sklearn构建stacking模型进行堆叠多模型分层级回归分析
sklearn构建stacking模型进行堆叠多模型分层级回归分析 Stacking 就是当用初始训练数据学习出若干个基学习器后,将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器.Stac ...
- Python中sklearn中HistGradientBoostingRegressor回归器配置单调约束参数monotonic_cst提高回归模型的抗噪声以及局部扰动的能力
Python中sklearn中HistGradientBoostingRegressor回归器配置单调约束参数monotonic_cst提高回归模型的抗噪声以及局部扰动的能力 目录
- python交叉验证函数_python – 在sklearn中使用交叉验证和AUC-ROC作为逻辑回归模型...
我正在使用sklearn包来构建逻辑回归模型,然后对其进行评估.具体来说,我想使用交叉验证,但无法通过cross_val_score函数找出正确的方法. 根据我看到的documentation和exa ...
- 【机器学习技巧】回归模型的几个常用评估指标(R2、Adjusted-R2、MSE、RMSE、MAE、MAPE)及其在sklearn中的调用方式
目录 回归模型评估的两个方面 1. 预测值的拟合程度 2. 预测值的准确度 以糖尿病数据集的回归模型为计算示例-计算各指标 1. 决定系数R2 1.1 R2求解方式一----从metrics调用r2_ ...
最新文章
- 【廖雪峰python入门笔记】tuple_“元素可变”
- 【董天一】IPFSFilecoin和复制证明
- CentOS7 安装 Jenkins( 构建 Vue 和 dotNET Core )
- 分布式系统开发注意点_分布式系统注意事项
- 敏捷开发一千零一问系列之二:序言及解决问题的心法(无住)
- php 保护变量,PHP安全:变量的前世今生
- Python实战(3)指定的文本列求和求平均
- mysql adodb_MySql AdoDB基本的函数
- Windows10彻底关闭安全中心
- 深入浅出MMC子系统
- 25款操作系统全面接触 [8]
- 【python】pygame 使用rect记录surface对象的位置并显示会造成卡顿(已解决)
- Redis-NoSql结构化数据库
- 汉明码纠错java_汉明码(Hamming)编码与纠错原理
- 消息通知的三种方式总结
- 时尚新享受,告别鼠标手
- 从距离、范数、內积,线性结构到度量空间、赋范空间、內积空间、欧几里得空间、巴拿赫空间、希尔伯特空间
- 别把“IT信息化”不当“超级工程”
- 傅里叶变化(一)—— 复数
- 论文:CVPR2020 | Strip Pooling:语义分割新trick,条纹池化取代空间池化
热门文章
- C++项目实战——简易版日期计算器(Date类改编)
- Codeforces 408 E. Curious Array
- 华为 USG 双机热备
- Virtual-Taobao: Virtualizing Real-World Online Retail Environment for Reinforcement Learning
- FireFox-background
- c#Form未能加载文件或程序集的解决方法
- 最新版X-Helios、X-Medusa、X-Ladon、X-Argus逆向与风控分析
- android 常用机型尺寸_安卓手机屏幕多大合适?6.4英寸是“黄金尺寸”吗?
- R 中 facet_wrap() 和 facet_grid() 的区别
- python的合法命名,以下不是Python语言合法命名的是:A、MyGod5B、5MyGodC、_...