机器学习 -测试集和训练集的划分

这里记录在机器学习中,使用几种方法来做对数据集进行拆分成训练集测试集

  • 留出法 (hold-out)

    • 通常训练集和测试集的比例可以为 7 : 3 或者 8 : 2
    • 训练集和测试集的划分要尽可能保持数据分布的一致性,避免因数据集在划分过程中引入额外偏差而对最终结果产生影响。
    • 对打乱样本集的数据重新进行划分,模型评估的结果往往也会不相同,所以需要对样本集进行若干次随机划分,重复实验取平均值,避免单次使用这方法带来的不稳定性。
  • 交叉验证法 (cross validation)

    • 将数据集D划分成 k 个大小相同或者相似的互斥的子集,每次使用 k - 1 个子集的并集作为训练集,剩余的子集作为测试集,进行k次训练和测试,计算模型在测试集上的准确率,最终返回k个测试结果的平均值 (k 最常用的取值是10)

下面是用代码来实现这两种方法,用到的数据集是 Iris Dataset。
并且用到了 sklearn 库中的 sklearn.datasets 的模块。

这里多介绍 sklearn.datasets 模块中包含了哪些经典的数据集,例如:

  • 鸢尾花数据集 (Iris Dataset): 包含了三种瓶中的鸢尾花的特征数据,是一个用于分类任务的经典数据集
  • 手写数字数据集 (Digits Dataset): 包含了一系列手写数字的图片数据,是一个用于识别手写数字的数据集,通常用于图像分类任务。
  • 波士顿房价数据集 (Boston House Prices Dataset): 包含了波士顿地区的房屋特征数据和对应的放假数据,通常用于回归任务。
  • 乳腺癌数据集 (Breast Cancer Dataset): 包含了乳腺癌肿瘤的特征数据和对应的良性/恶性标签,通常用于分类任务。
  • 新闻数据集 (20 Newsgroups Dataset): 包含了一系列新闻组文章的文本数据,通常用于文本分类任务。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split 
from sklearn.model_selection import KFold 
from sklearn.model_selection import StratifiedKFold 
from collections import Counter 

iris = load_iris()

# 特征变量
# 花萼长度,花萼宽度,花瓣长度,花瓣宽度
x = iris.data  

# 类别变量
# Setosa, Versicolour, Virginica
y = iris.target  

print("*****留出法******")
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1, shuffle = True, stratify=y)
count = Counter(y_train)
for k,v in count.items():
    ratio = v / len(y_train)
    print("class:{0}, ration:{1:.2f}".format(k, ratio))

print("****交叉验证法******")
sp = 10 
x_train1, x_test1, y_train1, y_test1 = [], [], [], [] 
kf = KFold(n_splits=sp, shuffle=True, random_state=1)
for train_index, test_index in kf.split(x, y):
    x_test = x[test_index]
    x_train = x[train_index]
    y_test = y[test_index]
    y_train = y[train_index]
i = 0
count1 = Counter(y_train)
for train_index, test_index in kf.split(x, y):
    if i == 3:
        break 
    print("未使用分层采样")
    for k,v in count1.items():
        ratio = v / len(y_train)
        print("class:{0}, ration:{1:.2f}".format(k, ratio))
    i += 1 

x_train2, x_test2, y_train2, y_test2 = [], [], [], []
skf = StratifiedKFold(n_splits=sp, random_state=1, shuffle=True)
for train_index, test_index in skf.split(x, y):
    x_test2 = x[test_index]
    x_train2 = x[train_index]
    y_test2 = y[test_index]
    y_train2 = y[train_index]
count2 = Counter(y_train2)
i = 0
for train_index, test_index in skf.split(x, y):
    if i == 3:
        break 
    print("使用分层采样")
    for k,v in count2.items():
        ratio = v / len(y_train2)
        print("class:{0}, ration: {1:.2f}".format(k, ratio))
    i += 1 

运行结果如下:

*****留出法******
class:0, ration:0.33
class:2, ration:0.33
class:1, ration:0.33
****交叉验证法******
未使用分层采样
class:0, ration:0.35
class:1, ration:0.33
class:2, ration:0.33
未使用分层采样
class:0, ration:0.35
class:1, ration:0.33
class:2, ration:0.33
未使用分层采样
class:0, ration:0.35
class:1, ration:0.33
class:2, ration:0.33
使用分层采样
class:0, ration: 0.33
class:1, ration: 0.33
class:2, ration: 0.33
使用分层采样
class:0, ration: 0.33
class:1, ration: 0.33
class:2, ration: 0.33
使用分层采样
class:0, ration: 0.33
class:1, ration: 0.33
class:2, ration: 0.33

都看到这里,点个赞支持一下咯~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值