Python sklearn KFold 生成交叉验证数据集的方法


Posted in Python onDecember 11, 2018

源起:

1.我要做交叉验证,需要每个训练集和测试集都保持相同的样本分布比例,直接用sklearn提供的KFold并不能满足这个需求。

2.将生成的交叉验证数据集保存成CSV文件,而不是直接用sklearn训练分类模型。

3.在编码过程中有一的误区需要注意:

这个sklearn官方给出的文档

>>> import numpy as np
>>> from sklearn.model_selection import KFold
 
>>> X = ["a", "b", "c", "d"]
>>> kf = KFold(n_splits=2)
>>> for train, test in kf.split(X):
...  print("%s %s" % (train, test))
[2 3] [0 1]
[0 1] [2 3]

我之前犯的一个错误是将train,test理解成原数据集分割成子数据集之后的子数据集索引。而实际上,它就是原始数据集本身的样本索引。

源码:

# -*- coding:utf-8 -*-
# 得到交叉验证数据集,保存成CSV文件
# 输入是一个包含正常恶意标签的完整数据集,在读数据的时候分开保存到datasetBenign,datasetMalicious
# 分别对两个数据集进行KFold,最后合并保存
 
from sklearn.model_selection import KFold
import csv
 
def writeInFile(benignKFTrain, benignKFTest, maliciousKFTrain, maliciousKFTest, i, datasetBenign, datasetMalicious):
 newTrainFilePath = "E:\\hadoopExperimentResult\\5KFold\\AllDataSetIIR10\\dataset\\ImbalancedAllTraffic-train-%s.csv" % i
 newTestFilePath = "E:\\hadoopExperimentResult\\5KFold\\AllDataSetIIR10\\dataset\\IImbalancedAllTraffic-test-%s.csv" % i
 newTrainFile = open(newTrainFilePath, "wb")# wb 为防止空行
 newTestFile = open(newTestFilePath, "wb")
 writerTrain = csv.writer(newTrainFile)
 writerTest = csv.writer(newTestFile)
 for index in benignKFTrain:
  writerTrain.writerow(datasetBenign[index])
 for index in benignKFTest:
  writerTest.writerow(datasetBenign[index])
 for index in maliciousKFTrain:
  writerTrain.writerow(datasetMalicious[index])
 for index in maliciousKFTest:
  writerTest.writerow(datasetMalicious[index])
 newTrainFile.close()
 newTestFile.close()
 
 
def getKFoldDataSet(datasetPath):
 # CSV读取文件
 # 开始从文件中读取全部的数据集
 datasetFile = file(datasetPath, 'rb')
 datasetBenign = []
 datasetMalicious = []
 readerDataset = csv.reader(datasetFile)
 for line in readerDataset:
  if len(line) > 1:
   curLine = []
   curLine.append(float(line[0]))
   curLine.append(float(line[1]))
   curLine.append(float(line[2]))
   curLine.append(float(line[3]))
   curLine.append(float(line[4]))
   curLine.append(float(line[5]))
   curLine.append(float(line[6]))
   curLine.append(line[7])
   if line[7] == "benign":
    datasetBenign.append(curLine)
   else:
    datasetMalicious.append(curLine)
 
 # 交叉验证分割数据集
 K = 5
 kf = KFold(n_splits=K)
 benignKFTrain = []; benignKFTest = []
 for train,test in kf.split(datasetBenign):
  benignKFTrain.append(train)
  benignKFTest.append(test)
 maliciousKFTrain=[]; maliciousKFTest=[]
 for train,test in kf.split(datasetMalicious):
  maliciousKFTrain.append(train)
  maliciousKFTest.append(test)
 for i in range(K):
  print "======================== "+ str(i)+ " ========================"
  print benignKFTrain[i], benignKFTest[i]
  print maliciousKFTrain[i],maliciousKFTest[i]
  writeInFile(benignKFTrain[i], benignKFTest[i], maliciousKFTrain[i], maliciousKFTest[i], i, datasetBenign,
     datasetMalicious)
 
 datasetFile.close()
 
 
if __name__ == "__main__":
 
 getKFoldDataSet(r"E:\hadoopExperimentResult\5KFold\AllDataSetIIR10\dataset\ImbalancedAllTraffic-10.csv")

以上这篇Python sklearn KFold 生成交叉验证数据集的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python入门篇之字典
Oct 17 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 Python
详谈Python基础之内置函数和递归
Jun 21 Python
Numpy数组的保存与读取方法
Apr 04 Python
使用Python来开发微信功能
Jun 13 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
在python中使用xlrd获取合并单元格的方法
Dec 26 Python
Python+selenium点击网页上指定坐标的实例
Jul 05 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 Python
想学python 这5本书籍你必看!
Dec 11 #Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
Dec 11 #Python
Python3爬虫学习入门教程
Dec 11 #Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 #Python
python绘制散点图并标记序号的方法
Dec 11 #Python
pandas分别写入excel的不同sheet方法
Dec 11 #Python
使用Python横向合并excel文件的实例
Dec 11 #Python
You might like
星际争霸任务指南——虫族
2020/03/04 星际争霸
提升PHP速度全攻略
2006/10/09 PHP
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
Javascript实现打鼓效果
2021/01/29 Javascript
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
python使用any判断一个对象是否为空的方法
2014/11/19 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
python在文本开头插入一行的实例
2018/05/02 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
pandas的排序和排名的具体使用
2019/07/31 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
主题班会演讲稿
2014/05/22 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
《静夜思》教学反思
2016/02/17 职场文书