数据划分方法小结-程序员宅基地

技术标签: 数据分析  机器学习  AI  

数据划分

留出法(Hold-Out)

定义与流程

就是有一个数据集 D D D,要分出 S , T 满 足 S ⋃ T = ∅ , S ⋂ T = D S,T满足S\bigcup T=\emptyset,S\bigcap T=D S,TST=,ST=D

S,T一个是训练集一个是测试集

就是把数据分成两个互不相交的部分,并保持数据分布大致一致

划分比例

  • 比例一般在 2 3 到 4 5 \frac{2}{3}到\frac{4}{5} 3254之间

  • 划分的时候保持数据分布大致一致,类似分层抽样

结果处理

  • 为了保证随机性,结果在多次划分中取平均值

优缺点

  • 优点:简单,快速
  • 缺点:容易出现局部极值

kNN、留出法、titanic

from pandas import *
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(filename1):
    fr = read_csv(filename1)
    return fr
def HoldOutSplit(dataSetO,P=0.7):
    dataSet=[];testSet=[]
    labelSet=[];testLabel=[]
    n=dataSetO.shape[0]
    S=0
    for i in dataSetO['Survived']:
        if(i==1.0):S+=1
    N=n-S
    S=P*S;N=P*N
    SS=NN=0
    for i in range(n):
        p=random.random()
        data=dataSetO.iloc[i]
        if(p<=P):
            if(data[0]==1.0)and(SS>=S):p=1.0-p
            if (data[0] == 0.0) and (NN >= N): p = 1.0 - p
        if(p<=P):
            if(data[0]==1.0):SS+=1
            else :NN+=1
            dataSet.append(data[1:]),labelSet.append(data[0])
        else:testSet.append(data[1:]),testLabel.append(data[0])
    return array(dataSet),array(testSet),labelSet,testLabel
#def crossTestSplit()
def kNN(dataSet,testSet,labelSet,testLabel,K):
    n=dataSet.shape[0]
    error=0;z=testSet.shape[0]
    for i in range(z):
        Dvalue=dataSet-tile(testSet[i],(n,1))
        Dvalue=Dvalue**2
        sumValue=Dvalue.sum(axis=1)
        sortValue=sumValue.argsort()
        survive=0
        for j in range(K):
            if(labelSet[sortValue[j]]==1.0):survive+=1
        survive=float(survive>K-survive)
        if(survive!=testLabel[i]):error+=1
    return (z-error)/z
def HoldOut():
    z=0
    dataSetO = loadDataSet('traingui.csv')
    for i in range(10):
        mxK = -inf
        dataSet, testSet, labelSet, testLabel = HoldOutSplit(dataSetO)
        for K in range(5, 25):
            accrury = kNN(dataSet, testSet, labelSet, testLabel, K)
            if (accrury > mxK):
                mxK = accrury
        z+=mxK
    return 1.0*z/10.0
if __name__=='__main__':
    print(HoldOut())

交叉验证法(Cross Validation,k折交叉验证)

定义与流程

把数据集分成k个互斥的集合,然后每次用一个作为测试集,其他k-1个作为训练集

划分与参数

  • 为了保证数据分布的一致性,从数据集中分层抽样得到这些集合
  • 交叉验证法评估结果的稳定性和保真性在很大的程度上取决与k的取值

结果处理

  • 返回k次结果的均值

优缺点

  • 优点:从有限的数据集尽可能的挖掘多的信息,从各种角度去学习,避免出现局部的极值
  • 缺点:当数据集比较大的时候,慢

kNN、交叉验证法、titanic

from pandas import *
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(filename1):
    fr = read_csv(filename1)
    return fr
def crossIndex(dataSetO):
    n = dataSetO.shape[0]
    dataIndex = [i for i in range(n)]
    for i in range(n):
        x = random.randint(1, n - 1)
        dataIndex[i], dataIndex[x] = dataIndex[x], dataIndex[i]
    return dataIndex
def crossTestSplit(dataSetO,dataIndex,head,Kc):
    dataSet = [];testSet = []
    labelSet = [];testLabel = []
    n = dataSetO.shape[0];size=n//Kc
    for i in range(n):
        data = dataSetO.iloc[dataIndex[i]]
        if(i>=head*size)and(i<(head+1)*size):testSet.append(data[1:]), testLabel.append(data[0])
        else:dataSet.append(data[1:]),labelSet.append(data[0])
    return array(dataSet), array(testSet), labelSet, testLabel
def kNN(dataSet,testSet,labelSet,testLabel,K):
    n=dataSet.shape[0]
    error=0;z=testSet.shape[0]
    for i in range(z):
        Dvalue=dataSet-tile(testSet[i],(n,1))
        Dvalue=Dvalue**2
        sumValue=Dvalue.sum(axis=1)
        sortValue=sumValue.argsort()
        survive=0
        for j in range(K):
            if(labelSet[sortValue[j]]==1.0):survive+=1
        survive=float(survive>K-survive)
        if(survive!=testLabel[i]):error+=1
    return (z-error)/z
def crossTest():
    dataSetO = loadDataSet('traingui.csv')
    dataIndex=crossIndex(dataSetO)
    Kc=10;z=0
    for i in range(Kc):
        mxK = -inf
        dataSet, testSet, labelSet, testLabel =crossTestSplit(dataSetO,dataIndex,i,Kc)
        for K in range(5, 25):
            accrury = kNN(dataSet, testSet, labelSet, testLabel, K)
            if (accrury > mxK):
                mxK = accrury
        z+=mxK
    return 1.0 * z / 10.0
if __name__=='__main__':
    print(crossTest())

由于打分层抽样还没想到怎么打比较简短(留出法的分层抽样我就打的很丑),所以暂时还没有分层抽样,只是随机了一下

自助法(BootStrapping)

定义与流程

思想来源

上面的两个方法用来训练的数据都不是全部数据,这样在实际评估的时候会造成偏差。所以我们想----用我们所有的数据来训练模型----->自助法

步骤
  • 1.在数据集D中随机一个样本,D的大小为n
  • 2.把这个样本拷贝D’中(注意是拷贝,就是D并没有改变)[注意:部分D的样本可能会被多次选取]
  • 3.将步骤2重复进行n次
  • 4.D’为训练集,D-D’为测试集

原理

统计一个样本x不会在D’中出现的概率,并取极限

lim ⁡ n − > ∞ ( 1 − 1 n ) n = 1 e ≈ 0.368 \lim _{n->∞}(1-{1\over n})^n={1\over e}≈0.368 n>lim(1n1)n=e10.368
可见,一个样本不出现在D’中的概率大约为0.368,所以大约有0.368的样本没有出现在D’中

所以D-D’大约有0.368的数据

  • 综上:因为是直接在原数据中随机,最后得到的测试集的各项分布比例和训练集都一样
    • 这样就解决了不好划分(分层抽样)的问题
    • 还保证了训练集和测试集互斥

结果处理

  • 返回多次结果的均值

优缺点

  • 优点:
    • 在数据集较小、难以有效划分数据集和测试集的时候很有用
    • 在集成学习中,自助法能从初始数据集产生多个不同的训练集
    • 好打
  • 缺点:
    • 改变了初始数据集的分布,会引入估计误差。
    • 大数据集下表现没有上面的两种方法好

kNN、自助法、titanic

from pandas import *
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(filename1):
    fr = read_csv(filename1)
    return fr
def BSsplit(dataSetO):
    n = dataSetO.shape[0]
    dataSet = [];testSet = []
    labelSet = [];testLabel = []
    dataIndex=[]
    for i in range(n):
        x=random.randint(0,n-1)
        dataIndex.append(x)
    setIndex=set(dataIndex)
    for i in range(n):
        data = dataSetO.iloc[dataIndex[i]]
        dataSet.append(data[1:]), labelSet.append(data[0])
        data = dataSetO.iloc[i]
        if(i not in setIndex):testSet.append(data[1:]),testLabel.append(data[0])
    return array(dataSet), array(testSet), labelSet, testLabel
def kNN(dataSet,testSet,labelSet,testLabel,K):
    n=dataSet.shape[0]
    error=0;z=testSet.shape[0]
    for i in range(z):
        Dvalue=dataSet-tile(testSet[i],(n,1))
        Dvalue=Dvalue**2
        sumValue=Dvalue.sum(axis=1)
        sortValue=sumValue.argsort()
        survive=0
        for j in range(K):
            if(labelSet[sortValue[j]]==1.0):survive+=1
        survive=float(survive>K-survive)
        if(survive!=testLabel[i]):error+=1
    return (z-error)/z
def bootStrappingTest():
    z = 0
    dataSetO = loadDataSet('traingui.csv')
    for i in range(10):
        mxK = -inf
        dataSet, testSet, labelSet, testLabel = BSsplit(dataSetO)
        for K in range(5, 25):
            accrury = kNN(dataSet, testSet, labelSet, testLabel, K)
            if (accrury > mxK):
                mxK = accrury
        z += mxK
    return 1.0 * z / 10.0
if __name__=='__main__':
    print(bootStrappingTest())

留一法

定义

相当于n折交叉验证

就是每一用一个做测试集,其他做训练集

结果处理

  • 返回n次结果的均值

优缺点

  • 优点:好打,交叉验证的优点+++
  • 缺点:慢

kNN、留一法、titanic

from pandas import *
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(filename1):
    fr = read_csv(filename1)
    return fr
def leaveOneSplit(dataSetO,test):
    n = dataSetO.shape[0]
    dataSet = [];testSet = []
    labelSet = [];testLabel = []
    for i in range(n):
        data = dataSetO.iloc[i]
        if(test!=i):dataSet.append(data[1:]), labelSet.append(data[0])
        else:testSet.append(data[1:]), testLabel.append(data[0])
    return array(dataSet), array(testSet), labelSet, testLabel
def kNN(dataSet,testSet,labelSet,testLabel,K):
    n=dataSet.shape[0]
    error=0;z=testSet.shape[0]
    for i in range(z):
        Dvalue=dataSet-tile(testSet[i],(n,1))
        Dvalue=Dvalue**2
        sumValue=Dvalue.sum(axis=1)
        sortValue=sumValue.argsort()
        survive=0
        for j in range(K):
            if(labelSet[sortValue[j]]==1.0):survive+=1
        survive=float(survive>K-survive)
        if(survive!=testLabel[i]):error+=1
    return (z-error)/z
def leaveOneTest():
    z = 0
    dataSetO = loadDataSet('traingui.csv')
    for i in range(dataSetO.shape[0]):
        mxK = -inf
        dataSet, testSet, labelSet, testLabel = leaveOneSplit(dataSetO,i)
        #for K in range(5, 25):
        K=20
        accrury = kNN(dataSet, testSet, labelSet, testLabel, K)
        if (accrury > mxK):
            mxK = accrury
        z += accrury
    return 1.0 * z / dataSetO.shape[0]
if __name__=='__main__':
    print(leaveOneTest())
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/doyouseeman/article/details/108647032

智能推荐

VMware Workstation和hyper-v不兼容问题_虚拟机与hyper-v不兼容services.msc-程序员宅基地

文章浏览阅读8k次,点赞6次,收藏27次。VMware Workstation使用时报错如下:原因是VMware和hyper-V两个虚拟化软件同时运行不兼容导致。解决办法就是停止并清除有关hyper-v的所有程序和设置:第一步:“win+ R“打开运行,输入gpedit.msc,确定打开本地组策略编辑器转到本地计算机策略 > 计算机配置 > 管理模板>系统 > Device Guard打开 基于虚拟化的安全设置为“已禁用”第二步:“win+ R“打开运行,输入services.msc,确定_虚拟机与hyper-v不兼容services.msc

【Hi3516A开发板】初步调试分析--uboot_"set \"debug\" kernel parameter (in bootloader con-程序员宅基地

文章浏览阅读961次。安装USB转串口驱动:CP2102 USB to UART Bridge Controller链接:https://pan.baidu.com/s/1IPtQt08wfTuTFSPosYY5oQ 提取码:y6rj原有的的uboot,kernel,rootfsU-BOOT 2010.6Linux version 3.4.35jffs2机器平台:hi3516a开发板连接电脑;在Sec..._"set \"debug\" kernel parameter (in bootloader config file or config_cmdline)"

Linux系统下,如何获取一个文件夹内所有的内容,并且打印出文件大小和最后修改日期,并用tree的方式打印_遍历一个文件夹下所有文件,并打印文件大小和日期-程序员宅基地

文章浏览阅读1.5k次。Linux系统下,如何获取一个文件夹内所有的内容,并且打印出文件大小和最后修改日期,并用tree的方式打印1. 解题思路二. 代码解析三. 任务总结1. 解题思路二. 代码解析头文件#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <dirent.h>#_遍历一个文件夹下所有文件,并打印文件大小和日期

获取系统当前时间存入数据库_数据库录入时间按照系统时间录入-程序员宅基地

文章浏览阅读1.4k次。在数据库中设置时间类型为date,如何在获取系统当前时间然后存入数据库呢?这里需要用到java.sql.Date,它是java.util.Date的子类。解决方法如下: Date date=new Date(); java.sql.Date sqlDate=new java.sql.Date(date.getTime()); team.setTitime(sqlDate);..._数据库录入时间按照系统时间录入

paascloud开源项目学习(4) -- 项目中分布式定时任务框架 Elastic-Job 的使用_paascloud_master 用户手册-程序员宅基地

文章浏览阅读1.5k次。目录1 前言1.1 paascloud-master1.2 Elastic-Job2 如何使用2.1 本项目需求2.2定时清理消息2.3 zk 注册中心数据结构1 前言1.1 paascloud-mastergithub 开源项目–paascloud-master:https://github.com/paascloud/paascloud-masterpaascloud-master ..._paascloud_master 用户手册

千月2021全新改版影视app系统源码 影视app全新双端开源系统 全开源 带投屏 带教程_2021全网影视vip源码带投屏-程序员宅基地

文章浏览阅读5.5k次。介绍:影视app全新双端开源系统,这次没什么好说的,教程都在文件!可以自定义易支付接口,带投屏,带选集,对接苹果苹果CMS 10【程序源码】全新双端美化开源系统源码自带独家有效完美防黑功能前端和后端 数据库都在里面了还有教程只要有眼睛都可以搭建成功 稳定运营安装说明:后端替换域名app.stb789.cn前端替换域名app.stb789.cn软件名字:畅视影院 都替换后台设置自己看情况使用,有些功能或者说明是没用的。后台路径:域名/login/login管理登录admin_2021全网影视vip源码带投屏

随便推点

PCIe学习笔记之pcie结构和配置空间_pcie class code-程序员宅基地

文章浏览阅读3.3w次,点赞51次,收藏347次。pcie硬件描述_pcie class code

微软 Windows 10 1903 九月更新官方 ISO 镜像_ed2k://|file|cn_windows_10_business_editions_versi-程序员宅基地

文章浏览阅读7.2k次。前两天微软更新了最新的Windows 10,发布了九月更新ISO镜像,镜像依然想往常那样,此次镜像分为消费者版(consumer)和企业版(business)。欢迎关注我们微信公众号,我们会定期发送DEll电脑最新渠道报价,以及一些技术文章下载地址(注意:仅64位版是9月更新镜像,32位依然是7月版)Windows10 x64 消费者版,Version 1903..._ed2k://|file|cn_windows_10_business_editions_version_1903_updated_sept_2019_

jqGrid的选中行事件_jqgrid 行选中事件-程序员宅基地

文章浏览阅读426次,点赞7次,收藏10次。aRowids为选定行ID的数组(哪些行的复选框与头复选框相同)。status为头复选框的选定的布尔值,true为选中,false为未选中。rowid 为行的ID,e为事件对象该事件将返回布尔值true(行被选中)或false(行未被选中)。后来楼主又发现一个问题,当我们设置multiselect为true时,选择任何的单元格,都会选中该行。其中,rowId是想要获取行数据的行ID。然而,以上这些并不能够满足楼主的需求,楼主需要的是在表格加载完时,就能选中已被标记的行。1、获取单个选中行的行ID。_jqgrid 行选中事件

LS1028A|基于NXP LS1028A应用于边缘计算网关-飞凌方案分享_nxp ls1028 低功耗实现-程序员宅基地

文章浏览阅读402次。随着物联网、大数据、人工智能等技术的快速发展与应用,给传统的云计算模式带来了巨大的挑战,这也催生出了计算模式的变革,边缘计算由此诞生。所谓边缘计算,是指在靠近物或数据源头的一侧,采用网络、计算、存储、应用核心能力为一体的开放平台,就近提供最近端服务。通俗的讲,就是在数据采集的本地完成对数据的计算、处理后(譬如打上时间戳,数据格式化、对事件和过程数据分类),根据结果进行“就地”决策,并将处理完成的数据进行存储、转发云平台等操作。边缘计算相比云计算具备以下优势:安全性..._nxp ls1028 低功耗实现

理解web标准、w3c规范_web标准以及w3c标准是什么?-程序员宅基地

文章浏览阅读769次。W3C规范定义了HTML、CSS、XML、DOM、SVG等一系列网页技术的标准,旨在促进网络技术的发展和标准化。这些标准包括HTML、CSS、XML、JavaScript等技术,可以确保Web页面在不同浏览器和设备上的兼容性、可访问性、可用性和可维护性。W3C规范是W3C组织发布的标准和规范,包括HTML、CSS、XML、DOM等Web技术和协议。Web标准是一个广泛的术语,涵盖了若干个由不同组织或机构颁发的标准、规范和指南,以确保Web应用程序在不同的平台和设备上都能够实现良好的互操作性和可访问性。_web标准以及w3c标准是什么?

数据库系统(上)——模型与语言 讨论答案_视图和三级模式两层映像有什么对应关系吗-程序员宅基地

文章浏览阅读900次,点赞2次,收藏8次。课程里面讨论的问题都特别有趣,第一章是明确为什么需要学习数据库,为什么学习数据库,学习数据库哪些东西,然后是每章的重要知识点,用于巩固学到的知识,有一个有趣的现象,当你很认真的学完视频并不能完全回答上来这些问题,这就提醒我们要深入的思考,课后利用这些讨论的问题查漏补缺,将学习到的东西转化成自己的。_视图和三级模式两层映像有什么对应关系吗

推荐文章

热门文章

相关标签