赞
踩
交叉验证是在机器学习建立模型和验证模型参数时常用的办法。顾名思义,交叉验证就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏,在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。
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个部分,其中一个单独的样本作为测试集,而其余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交叉验证(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)
运行结果
本节我们学习了交叉验证的相关知识。最有效的交叉验证方法就是针对整个数据集进行重复测试模型。
自学自用,希望可以和大家积极沟通交流,小伙伴们加油鸭,如有错误还请指正,不喜勿喷,喜欢的小伙伴帮忙点个赞支持,蟹蟹呀
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。