Cross_Validation_Alg、Hold_out_Alg、LeaveOneOut算法的实现

交叉验证法实现:

"""
交叉验证法(cross validation)可以很好地解决留出法的问题,它对数据量的要求不高,并且样本信息损失不多。

交叉验证法先将数据集D划分为k个大小相似的互斥子集,即
D = D 1 ∪ D 2 ∪ . . . ∪ D k , D i ∩ D j = ∅ ( i ≠ j ) D = D_1 \cup D_2 \cup ...\cup D_k, D_i \cap D_j = \varnothing(i \neq j)

为了保证数据分布的一致性,从D中随机分层抽样即可。

之后,每次都用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样我们就可以获得k组训练/测试集,从而进行k次训练和测试,最终返回这k组测试的均值。

具体说来,我们以k=10为例:
第一次我们选取第10份数据为测试集,前9份为训练集;
第二次我们选取第9份数据为测试集,第1-8和10为训练集;
…
第十次我们选取第1份数据为测试集,第2-9为训练集;
由此,我们共获得10组训练集和测试集,进行10次训练和测试,最终返回10次测试结果的均值。
显然, 交叉验证法结果的稳定性和保真性很大程度取决于K的选择,为了强调这一点,交叉验证法也称为
K折交叉验证法,k的取值通常是10, 也有取5和20的。
"""

#交叉验证法的实现

import pandas as pd
from sklearn.model_selection import KFold
data = pd.read_excel("data")
kf = KFold(n_splits=4, shuffle=False, random_state=None)
"""
n_splits表示将数据分成了几份, shuffle 和random_state 表示是否随机生成
如果shuffle = False ,random_state=None, 重复运行将产生同样的结果
如果shuffle = True ,random_state=None, 重复运行将产生不同样的结果
如果shuffle = True ,random_state=(一个数值), 重复运行将产生同样的结果

"""
for train, test in kf.split(data):
    print("%s %s" % (train, test))

"""
#样例结果
    
[ 5  6  7  8  9 10 11 12 13 14 15 16 17 18] [0 1 2 3 4]
[ 0  1  2  3  4 10 11 12 13 14 15 16 17 18] [5 6 7 8 9]
[ 0  1  2  3  4  5  6  7  8  9 15 16 17 18] [10 11 12 13 14]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14] [15 16 17 18]

"""

留出法的实现:

"""留出法是最常用最直接最简单的方法,它直接将数据集D拆分成两个互斥的集合,其中一个作为训练集R,另一个作为测试集T。 即
D = S ∪ T , S ∩ T = ∅ D = S∪T,S∩T = \varnothing
D=S∪T,S∩T=∅

在使用留出法时,需要注意:
    1.要有足够的样本量,以保证训练模型的效果
    2.在划分市要注意保证数据分布的一致性,采用随机分层抽样即可
    3.为了减弱随机划分的影响,重复划分训练集和测试集,对得到的多次结果取平均作为最后的的结果
    4.一般训练集和测试集的比例在8:2或者是7:3


    当然留出法的缺点就是 它会损失一定的样本信息;同时需要的样本足够大
"""

# 留出法的实现

from sklearn.model_selection import train_test_split

train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state=0)
# X,为原始数据的自变量, Y为原始数据的因变量;
# train_X, test_X 是将X按照8:2划分所得到;
# train_Y, test_Y 是将Y按照8:2划分所得到;
# test_size 是划分的比列;
# random_state设置了是否使用随机数

留一法的实现:

"""
留一法,与留出法相比较,交叉验证的数据损失小,更加适合小样本的数据,但是其计算复杂度高, 存储空间变大
极端的来说,如皋将数据集D(m个样本)分成m份, 每次都是取m-1个样本为训练集,剩下的那一个为测试集,
共进行m次训练和测试,这种方法叫做留一法

"""

# 留一法的优点是只损失一个样本,并不会受到样本随机划分的影响, 但是其计算复杂度过高,空间存储占用过大

#留一法的实现

from sklearn.model_selection import LeaveOneOut
import numpy as np
X = np.array([[1, 2, 3, 4],
             [11, 12, 13, 14],
             [21, 22, 23, 24],
             [31, 32, 33, 34]])



y = np.array([1,1,0,0])

loo = LeaveOneOut()
for train_index, test_index in loo.split(X, y):
    print("Train Index:", train_index)
    print("Test Index:", test_index)
    print("X_train:", X[train_index])
    print("X_test:", X[test_index])
    print("")

代码是参照部分博客的,但是我忘记了博客的地址, 如有侵权还请联系删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值