机器学习基础篇(四)——交叉验证

机器学习基础篇(四)——交叉验证

一、概述

交叉验证是在机器学习建立模型和验证模型参数时常用的办法。顾名思义,交叉验证就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏,在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。

二、Holdout交叉验证

Holdout 交叉验证就是将原始的数据集随机分成两组,一组为测试集,一组作为训练集。我们使用训练集对模型进行训练,再使用测试集对模型进行测试。记录最后的模型准确度作为衡量模型性能的指标。
这是最简单的交叉验证的方法,当我们需要针对大量数据进行简单快速的验证时,Holdout 验证是一个不错的方法。
注:
通常,Holdout 交叉验证会将数据集的20%——30%作为测试集,而其余的数据作为训练集。
当测试集的占比较高的时候,会导致训练的数据不足,模型较为容易出错,准确度较低。
当测试集的占比较低的时候,会导致训练的数据过多,模型可能会出现过拟合或者欠拟合的问题。

# 使用holdout交叉验证的示例代码
import pandas
from sklearn import datasets
from sklearn.model_selection import train_test_split
# step1 将训练集的比例设为70%,测试集的比例设为30%
train_split=0.7
# step2 设置一下diabetes数据集的列名
columns=['age','sex','bmi','map','tc','ldl','hdl','tch','ltg','glu']
# step3 导入diabetes数据集
dataset=datasets.load_diabetes()
# step4 创建数据集的dataframe
dataframe=pandas.DataFrame(dataset.data,columns=columns)
# step5 查看数据集
print(dataframe.head())
# step6 使用train_test_split对数据集进行分割
x_train,x_test,y_train,y_test=train_test_split(dataframe,dataset.target,train_size=train_split,test_size=1-train_split)
# step7 查看数据集的条数
print('完整数据集的条数:{}'.format(len(dataframe.index)))
# step8 看下训练集和测试集的数据比例
print('训练集的条数(占比):{}(~{}%)'.format(len(x_train),train_split*100))
print('测试集的条数(占比):{}(~{}%)'.format(len(x_test),(1-train_split)*100))

运行结果
在这里插入图片描述

三、K-Fold交叉验证

K-Fold交叉验证会将数据集分成k个部分,其中一个单独的样本作为测试集,而其余k-1个样本作为训练集。交叉重复验证k次,每个子集都会作为测试集,对模型进行测试。最终平均k次所得的结果,最终得出一个单一的模型
例如: 假如我们有100个数据点,并且分成十次交叉验证,那么我们会将数据分成十个部分,每个部分有十个数据点,我们可以分别对十个数据点进行验证,而对使用另外的90个数据点进行训练,重复十次这样的操作,将得到十个模型,我们对这些模型进行平均,最终得出一个适合的模型。
K-Fold 交叉验证适用于数据集样本比较小的情况。

# 使用K-Fold交叉验证的示例代码
import numpy as np
from sklearn.model_selection import KFold
# step1 设置K值为3
num_split=3
# step2 创建一个数据集方便使用KFold
data=np.array([[1,2],[3,4],[5,6],[7,8],[9,10],[11,12]])
# step3 查看数据
print(data)
# step4 导入KFold交叉验证,将K值设置为3
kfold=KFold(n_splits=num_split)
# step5 使用kfold分割数据
split_data=kfold.split(data)
# step6 使用循环分别导出三次KFold的情况下训练集和测试集的数据内容,将训练集设置为'-',测试集设置为'T'
for train,test in split_data:
    output_train=''#初始输出设置为空
    output_test=''
    bar=['-']*(len(train)+len(test))#出事case设置为'-'
    for i in train:#子循环
        output_train='{}({}:{})'.format(output_train,i,data[i])#输出训练集的内容以及训练集的数据编号
    for i in test:
        bar[i]='T'#将测试集的case改为'T'
        output_test='{}({}:{})'.format(output_test,i,data[i])#输出测试集的内容以及测试集的数据编号
    # step7 查看测试集和训练集的直观标志
    print('[{}]'.format(' '.join(bar)))
    print('训练集:{}'.format(output_train))
    print('测试集:{}\n'.format(output_test))

运行结果
在这里插入图片描述

四、Leave-P-Out交叉验证

Leave-P-Out交叉验证(LPOCV)使用样本中的某几项当做测试集,从样本中选取某几项的可能种类称为P值,例如: 当我们有时四个数据点,而我们要将其中的两个数据点当做数据集,则我们一共有6种可能性,直观的展现如下:(T代表测试集,-代表训练集)

1: [ T T - - ]  
2: [ T - T - ]  
3: [ T - - T ]  
4: [ - T T - ]  
5: [ - T - T ]  
6: [ - - T T ]

LPOCV可以迅速提高模型的精确度,准确的描摹大样本数据集的特征信息。

LPOCV的一个极端案例是LOOCV( Leave-One-Out Cross Validation)。LOOCV限定了P的值等于1,这使得我们将迭代N次来评估模型,LOOCV也可以看做是KFold交叉验证,其中k=n。
与KFold类似,LPOCV和LOOCV都可以遍历整个数据集。因此,针对于小型的数据集,LPOCV和LOOCV十分有效。

# 使用LPOCV、LOOCV交叉验证的示例代码
import numpy as np
from sklearn.model_selection import LeaveOneOut,LeavePOut
# step1 设置P值为2
p_val=2
# step2 定义一个导出分割数据的函数
def print_result(split_data):
    for train,test in split_data:
        output_train=''#初始输出设置为空
        output_test=''
        bar=['-']*(len(train)+len(test))#出事case设置为'-'
        for i in train:#子循环
            output_train='{}({}:{})'.format(output_train,i,data[i])#输出训练集的内容以及训练集的数据编号
        for i in test:
            bar[i]='T'#将测试集的case改为'T'
            output_test='{}({}:{})'.format(output_test,i,data[i])#输出测试集的内容以及测试集的数据编号
        # step7 查看测试集和训练集的直观标志
        print('[{}]'.format(' '.join(bar)))
        print('训练集:{}'.format(output_train))
        print('测试集:{}\n'.format(output_test))
# step3 创建一个需要分割的数据集
data=np.array([[1,2],[3,4],[5,6],[7,8]])
# step4 分别导入LOOCV个LPOCV模型
loocv=LeaveOneOut()
lpocv=LeavePOut(p=p_val)
# step5 分别使用loocv和lpocv来分割数据
split_loocv=loocv.split(data)
split_lpocv=lpocv.split(data)
# step6 分别输出LOOCV和LPOCV 所对应的分割数据
print('LOOCV:\n')
print_result(split_loocv)
print('LPOCV(where p={}):\n'.format(p_val))
print_result(split_lpocv)

运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、小结

本节我们学习了交叉验证的相关知识。最有效的交叉验证方法就是针对整个数据集进行重复测试模型。
自学自用,希望可以和大家积极沟通交流,小伙伴们加油鸭,如有错误还请指正,不喜勿喷,喜欢的小伙伴帮忙点个赞支持,蟹蟹呀

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚子味的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值