《数据挖掘原理、算法与应用(Python语言描述)》课件 【第四章】数据集划分与交叉验证_第1页
《数据挖掘原理、算法与应用(Python语言描述)》课件 【第四章】数据集划分与交叉验证_第2页
《数据挖掘原理、算法与应用(Python语言描述)》课件 【第四章】数据集划分与交叉验证_第3页
《数据挖掘原理、算法与应用(Python语言描述)》课件 【第四章】数据集划分与交叉验证_第4页
《数据挖掘原理、算法与应用(Python语言描述)》课件 【第四章】数据集划分与交叉验证_第5页
已阅读5页,还剩40页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章数据集划分与交叉验证数据挖掘原理、算法与应用(Python语言描述)学习目标(1)熟练掌握数据集的常用划分方法train_test_split。(2)掌握K折交叉划分以及应用方法。(3)掌握分层K折交叉划分以及应用方法。(4)了解乱序K次划分方法。(5)了解留一法、留P法以及自助法。(6)掌握交叉验证评分方法。目录数据集划分train_test_split方法K折交叉划分法分层K折交叉划分法乱序K次划分留一法留P法自助法交叉验证评分案例:房价预测数据集划分4.1数据集划分本章使用数据集如表4.1所示,该数据包含用户对不同车型满意度信息,共包含10个样本,没有缺失值。4.1数据集划分例4-1读取数据并分离特征与标签importpandasaspd#导包data_=pd.read_execel("./eg311.excel")#读入数据,存放在data_中。X=data_.iloc[:,:-1]#取特征Y=data_.iloc[:,-1]#取标签4.1.1train_test_split方法train_test_split方法按照指定的数量或者比例对数据集进行一次划分,是最常用的数据集划分方法。如果参数shuffle=False,则按顺序先取指定数量或比例的训练集样本,余下样本为测试集;否则,先对数据集乱序后再做训练集与测试集的划分。4.1.1train_test_split方法train_test_split参数说明:train_test_split(*arrays,#数据集,(X,y)test_size=None,#值为int型指定测试集样本数量,为0.0-1.0间的float的浮点数时,指定测试集占比例。train_size=None,#值为int型指定训练集样本数量,为0.0-1.0间的float的浮点数时,指定训练集样本占比例。random_state=None,#设置随机数种子,为int值,可保证多次运行,shuffle乱序的结果一样。shuffle=True,#缺省为True,将数据集乱序后做训练集与测试集的划分。stratify=None,#非None值时根据标签分层划分训练集与测试集,在样本不均衡时,可保证训练集与测试集中不同类的样本数量基本一致。)train_test_split返回值,按顺序分别为:训练集的X_train,测试集的X_test,训练集标签y_train,测试集标签y_test例4-2train_test_split数据集划分fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,Y,train_size=0.8,shuffle=False)X_train#输出训练集X输出结果如图4-1所示。X_train,X_test,y_train,y_test=train_test_split(X,Y,train_size=0.8,shuffle=True)X_train#输出训练集X输出结果如图4-2所示。4.1.1train_test_split方法4.1.2K折交叉划分法K折交叉划分将数据集K折划分,每次取K折中的一折为测试集,余下的K-1折用来对模型进行训练。用训练集训练模型,测试集评估模型的性能。通过多次的训练,数据集中的每一个部分都作为训练集参加过模型训练,也作为测试集验证过模型的性能,多次训练的性能均值作为模型的最终性能。图4-3为5折验证的示意图。K折交叉检验需要训练K个模型,增加了计算成本,但比单次划分训练集和测试集的方法所建的模型更加稳定、全面。但如果数据集中相同标签的样本连续存放,如前面的全为0类,后面的全为1类,可能会导致某次的训练集全部为0类,而测试集全为1类。这样会导致模型的训练效果以及性能评价都不可靠。4.1.2K折交叉划分法K折交叉划分将数据集K折划分,每次取K折中的一折为测试集,余下的K-1折用来对模型进行训练。用训练集训练模型,测试集评估模型的性能。通过多次的训练,数据集中的每一个部分都作为训练集参加过模型训练,也作为测试集验证过模型的性能,多次训练的性能均值作为模型的最终性能。图4-3为5折验证的示意图。KFold常用参数说明:kf=KFold(n_splits=5,#指定折数

shuffle=False,#是否乱序后再划分

random_state=None,#设置随机数种子,为int值,可保证多次运行,shuffle乱序的结果一样。shuffle=False时,该参数值必为None。

)4.1.2K折交叉划分法例4-3K折交叉划分数据集fromsklearn.model_selectionimportKFoldkf=KFold(n_splits=3,#指定折数3

shuffle=False,#是否乱序后再划分)#KFold划分数据集kf_cv=kf.split(X,Y)#3折划分[train_indicesfortrain_indices,_inkf_cv]#列表推导式获取训练集的索引3折划分时,第一折为样本0、1、2、3,第二折为样本4、5、6,第三折为样本7、8、9。第一次取第2,3折为训练集,第二次取1、3折为训练集,第三次取1、2折为训练集。每次取训练集后余下为对应的测试集。4.1.2K折交叉划分法4.1.3分层K折交叉划分法

分层K折交叉划分法使每个折中不同类别的比例与整个数据集中的类别比例相当。采用分层K折交叉验证是根据标签划分,是对有标签数据的划分,一般用于分类数据集。StratifiedKFold常用参数说明:skf=StratifiedKFold(n_splits=2,shuffle=True,#乱序random_state=1)skf_cv=skf.split(X,y)#分层K折交叉划分,X为要划分的数据集,y为对应的标签4.1.3分层K折交叉划分法由图可见,每次划分中不同标签的比例与原始数据集保持一致,40%的acc。例4-44.1.3分层K折交叉划分fromsklearn.model_selectionimportStratifiedKFoldskf=StratifiedKFold(n_splits=2,shuffle=True,#乱序random_state=1)skf_cv=skf.split(X,Y)#分层K折交叉划分,X为要划分的数据集,y为对应的标签。foriin[train_indicesfortrain_indices,_inskf_cv]:#输出划分结果

forjini:print(Y[j+1],"",end="")#输出索引对应的标签

print()输出结果如图4-5所示。4.1.4乱序K次划分将数据集打乱顺序后,做K次的训练集与测试集的划分。与其他交叉K折划分策略不同,随机拆分不保证每次的划分测试集样本不重叠,且训练集的大小取决test_size或train_size的设置。ShuffleSplit常用参数说明:Shs=ShuffleSplit(n_splits=2,random_state=10,test_size=0.3)#实例化乱序划分,#缺省测试集大小为0.1Shs_cv=Shs.split(X)#乱序2次划分数据集4.1.4乱序K次划分例4-5乱序K次划分fromsklearn.model_selectionimportShuffleSplitShs=ShuffleSplit(n_splits=2,random_state=10,test_size=0.3)#实例化乱序划分,#缺省测试集大小为0.1Shs_cv=Shs.split(X)#乱序2次划分数据集[train_indicesfortrain_indices,_inShs_cv]#获取划分的训练集的索引输出结果如图4-6所示。由图4-6可见,两次乱序划分都包含了0、1、6、7、9作为训练集样本,而样本5在两次划分中都作为测试集样本使用。4.1.5留一法留一法(leave-one-outcrossvalidation)就是每次只留下一个样本做测试集,其他样本做训练集,如果有k个样本,则需要训练k次,测试k次。例4-6留一法fromsklearn.model_selectionimportLeaveOneOutloo=LeaveOneOut()#实例化LeaveOneOutk=0forx,yinloo.split(X):print(x,y)#输出

ifk>10:#输出前10个拆分结果

break

k=k+14.1.6留P法留P法就是每次留下P个样本做测试集,遍历所有不同的P个样本的组合,其他样本做训练集,如果有k个样本,则需要训练k!/(k-p)!次,测试k!/(k-p)!次,运算量非常大。当P=1时,就是留一法。例4-7留一法fromsklearn.model_selectionimportLeavePOutlpo=LeavePOut(3)k=0forx,yinlpo.split(X):

print(x,y)#输出

ifk>10:#输出前10个划分结果

break

k=k+14.1.7自助法自助法(bootstrapping)以自主采样(bootstrapsampling)为基础,使用有放回的重复采样的方式进行训练集、测试集的构建。如为了构建m个样本的训练集,每次从数据集中采样放入训练集,然后有放回重新采样,重复m次得到m个样本的训练集,然后将没有被采样到的样本作为测试集。在每次采样时,每个样本经过m次始终没有被采到的概率是:当m趋于无穷大时,大约有36.8%的样本不会出现在训练集中,被称为带外样本,通常用这些样本作为测试集。4.1.7自助法例4-8自助法划分train=X.sample(15,replace=True)#有放回的抽取15个样本作为训练集test=X.loc[X.index.difference(train.index)].copy()#余下样本作为测试集train由结果可得,有放回抽取的15个样本时,多个样本被重复抽取。目录数据集划分交叉验证评分案例:房价预测数据集划分4.2交叉验证评分交叉验证评分(cross_val_score)根据不同的数据集划分,训练模型,并对训练模型进行评分,通常结合数据集的K折划分。cross_val_score常用参数说明:cross_val_score(

estimator,#使用的模型

X,#自变量

y=None,#标签

scoring=None,

#评估指标

cv=None,

#交叉验证的折数

n_jobs=None,

#并行的作业数

verbose=0,

#日志详细程度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出

fit_params=None,#传递给估计器的拟合方法的参数

pre_dispatch='2*n_jobs',

#控制并行执行期间调度的作业数量。)目录数据集划分交叉验证评分案例:房价预测数据集划分目标数据集介绍实现代码4.3.1目标本案例采用不同的数据集划分方法,划分数据集并可视化划分结果。在不同数据集划分的基础上,建立并评价一元线性回归模型的性能。4.3.2数据集介绍本案例数据集来源UCI。该数据集为某市房地产历史数据,包含6个特征。X1=交易日期(例如2013.250=2013年3月、2013.500=2013年6月等)X2=房屋年龄(单位:年)X3=最近地铁站的距离(单位:米)X4=步行生活圈内便利店数量(整数)X5=地理坐标,纬度。(单位:度)X6=地理坐标,经度。(单位:度)预测目标为单位面积房价YY=单位面积房价数据集下载地址:/ml/datasets/Real+estate+valuation+data+set4.3.3实现代码1.导入必要的数据包importnumpyasnpimportmatplotlib.pyplotasplt%matplotlibinlineimportpandasaspdimportwarningswarnings.filterwarnings("ignore")2.读入数据文件data=pd.read_excel("d:/datasets/Realestatevaluationdataset.xlsx")4.3.3实现代码3.数据探索()输出结果如下:数据集共414个样本,数据无缺失。4.3.3实现代码3.数据探索去掉No,以及X1transactiondatedata.drop(["No","X1transactiondate"],axis=1,inplace=True)data.describe()输出结果如下:4.3.3实现代码4.特征标签分离data=data.head(30)#为更好观测数据集的划分情况,本案例取数据集的前30个样本做可视化。X=data.drop(["Yhousepriceofunitarea"],axis=1)#取特征y=data["Yhousepriceofunitarea"]#取标签5.导入数据集划分模块fromsklearn.model_selectionimportKFoldfromsklearn.model_selectionimportShuffleSplitfromsklearn.model_selectionimportStratifiedKFold4.3.3实现代码6.train_test_split划分shuffle=FalseX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=8,shuffle=False)plt.figure(figsize=(12,2))plt.scatter(X_train.index,[1]*len(X_train.index),marker="o",c="r",label="train")plt.scatter(X_test.index,[1]*len(X_test.index),marker="v",c="b",label="test")plt.yticks([1],[""])plt.legend()4.3.3实现代码shuffle=False时,按顺序分别取指定数量的样本作为训练集与测试集。输出结果如下:4.3.3实现代码shuffle=True时,先乱序样本,这样划分的训练集与测试集交错分布。输出结果如下:4.3.3实现代码7.可视化K折划分,k=3,每次选其中一折作为测试集,其他为训练集。fromsklearn.model_selectionimportKFold

kf=KFold(n_splits=4,#指定折数4shuffle=False,#是否乱序后再划分)#KFold划分数据集kf_cv=kf.split(X)#4折划分k=1plt.figure(figsize=(10,3))k=1fortrain_indices,test_indicesinkf_cv:plt.scatter(train_indices,[k]*len(train_indices),marker="o",c="r")plt.scatter(test_indices,[k]*len(test_indices),marker="v",c="b")k=k+1k=k-1plt.scatter(train_indices,[k]*len(train_indices),marker="o",c="r",label="训练集")plt.scatter(test_indices,[k]*len(test_indices),marker="v",c="b",label="测试集")plt.title("KFlod划分结果可视化")plt.legend(loc="centerright")4.3.3实现代码7.可视化K折划分,k=3,每次选其中一折作为测试集,其他为训练集。4.3.3实现代码8.可视化乱序后,K折划分,k=4,每次选其中一折作为测试集,其他为训练集。fromsklearn.model_selectionimportKFoldkf=KFold(n_splits=4,#指定折数4shuffle=True,#是否乱序后再划分)#KFold划分数据集kf_cv=kf.split(X)#4折划分plt.figure(figsize=(10,3))k=1fortrain_indices,test_indicesinkf_cv:plt.scatter(train_indices,[k]*len(train_indices),marker="o",c="r")plt.scatter(test_indices,[k]*len(test_indices),marker="v",c="b")k=k+1k=k-1plt.scatter(train_indices,[k]*len(train_indices),marker="o",c="r",label="训练集")plt.scatter(test_indices,[k]*len(test_indices),marker="v",c="b",label="测试集")plt.title("KFlod划分结果可视化")plt.legend(loc="centerright")4.3.3实现代码8.可视化乱序后,K折划分,k=4,每次选其中一折作为测试集,其他为训练集。4.3.3实现代码9.可视化层次k折划分,k=3层次k折划分,每次选其中一折作为测试集,其他为训练集,确保在每次划分时不同类别的样本在测试集与训练集中按比例划分,分层需要根据类别标签y来实现。本数据集的标签为连续性数值,需要先做离散化。本例用标签均值作为阈值离散化,将回归问题变为分类问题。4.3.3实现代码fromsklearn.preprocessingimportBinarizerskf=StratifiedKFold(n_splits=3)Bi_=Binarizer(threshold=41.443333)#取均值二值化标签y1=Bi_.fit_transform(data[["Yhousepriceofunitarea"]])#y1为离散化的标签skf_cv=skf.split(X,y1)kk=[k*jfork,jinenumerate(y1)ifj!=0]k=1plt.figure(figsize=(10,2))fortrain_indices,test_indicesinskf_cv:plt.scatter(train_indices,[k]*len(train_indices),marker=".",c="r")plt.scatter(test_indices,[k]*len(test_indices),marker="v",c="b")k=k+1plt.scatter(train_indices,[k-1]*len(train_indices),marker=".",c="r",label="train")plt.scatter(test_indices,[k-1]*len(test_indices),marker="v",c="b",label="test")plt.scatter(kk,[k]*len(kk),marker="+",c="b",label="label")plt.yticks([1,2,3,4],["1","2","3","label"])plt.ylabel("iteration")plt.xlabel("index")plt.title("StratifiedKFold划分结果可视化")plt.legend(loc="upperright")

4.3.3实现代码9.可视化层次k折划分,k=3label为样本真实标签,图中“+”表示对应index的样本类别为“1”,其他为“0”。10.可视化乱序k次ShuffleSplit,将数据乱序后拆分为训练集和测试集,返回对应的索引。test_size缺省的大小为0.1。Shs=ShuffleSplit(n_splits=3,random_state=10,test_size=0.3)#乱序,划分3次,测试集占比30%Shs_cv=Shs.split(X)k=1plt.figure(figsize=(10,2))fortrain_indices,test_indicesinShs_cv:plt.scatter(train_indices,[k]*len(train_indices),marker=".",c="r")plt.scatter(test_indices,[k]*len(test_indices),marker="v",c="b")k=k+1plt.scatter(train_indices,[k-1]*len(train_indices),marker=".",c="r",label="train")plt.scatter(test_indices,[k-1]*len(test_indices),marker="v",c="b",label="test")plt.yticks([1,2,3],["1","2","3"])plt.ylabel("iteration")plt.xlabel("index")plt.title("ShuffleSplit划分结果可视化")plt.legend(loc="upperright")4.3.3实现代码10.可视化乱序k次4.3.3实现代码与其他划分策略不同,随机拆分不保证每次的划分都完全不同。上例可看到测试集中样本20被反复使用。11.交叉验证

用交叉验证思想,建立一元线性回归模型,并评估模型的的性能。线性回归fromsklearn.model_selectionimportcross_val_scorefromsklearn.linear_modelimportLinearRegressionprint(cross_val_score(LinearRegression(),X,y,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论