【交叉验证】iris数据集

交叉验证

当我们构建分类器时,有可能会存在过拟合现象。如何利用有限的数据降低模型的过拟合?——交叉验证

我们把每个数据集分成两个子集

一个用于构建分类器(模型),称为训练集(training set)

另一个用于评估分类器,称为测试集(test set)

根据训练集和测试集的挑选方法,一般可分为简单交叉验证、k折交叉验证、留一法交叉验证。

一、简单交叉验证(hold-out cross validation)

1、从全部数据集S中选择80%的样本的作为训练集(一般时8/2分,8为训练集,2为测试集),剩余未测试集。

2、在测试集中进行训练,得到分类模型

3、在验证集中,用分类模型进行预测,并记录相关指标如敏感性、特异性、AUC

4、选择分类效果好的分类模型

优点:处理简单,只需把随机数据分两份

缺点:有些样本可能从未做过训练或测试数据,而有些样本不止一次选为训练或测试数据。另外训练集样本数太少,通常不足以代表母体样本的分布,导致 test 阶段辨识率容易出现明显落差。

二、k折交叉验证(k-fold cross validation)

1、 将全部训练集 S分成 k个不相交的子集,假设 S中的训练样例个数为 m,那么每一个子 集有 m/k 个训练样例,,相应的子集称作 {s1,s2,…,sk},一般是10 fold。
2、每次从分好的子集中里面,拿出一个作为测试集,其它k-1个作为训练集

3、在测试集中进行训练,得到分类模型
4、 把这个模型放到测试集上,得到分类率。

5、计算k次求得的分类率的平均值,作为该模型或者假设函数的真实分类率。

优点: K-CV使得每一个样本数据都既被用作训练数据,也被用作测试数据,可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性。

缺点: K值的选择,计算比较繁琐,需要训练k次,测试k次。

三、留一法交叉验证(leave-one-out cross validation)

每次只留下一个样本做测试集,其它样本做训练集,如果有k个样本,则需要训练k次,测试k次。

优点: 
a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠;
b. 实验没有随机因素,整个过程是可重复的。
缺点: 计算成本高,当N非常大时,计算耗时。除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间。
数据集分割原则
原始数据集分割为训练集与测试集,必须遵守两个要点:
1、训练集中样本数量必须够多,一般至少大于总样本数的 50%;
2、两组子集必须从完整集合中均匀取样。均匀取样的目的是希望尽量减少训练集/测试集与完整集合之间的偏差。一般的作法是随机取样,当样本数量足够时,便可达到均匀取样的效果。
 

参考:https://blog.csdn.net/yawei_liu1688/java/article/details/79138202

留一法
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
accuracy = 0;
for train, test in loo.split(X):
log_model.fit(X[train], y[train])  # fitting
y_p = log_model.predict(X[test])
if y_p == y[test] : accuracy += 1
print(accuracy / np.shape(X)[0])
交叉验证(10折)
log_model = LogisticRegression(solver=‘liblinear’)
y_pred = cross_val_predict(log_model, X, y, cv=10)
print(metrics.accuracy_score(y, y_pred))
————————————————
版权声明:本文为CSDN博主「MuyeeyuM」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a751375/java/article/details/86606953