1 交叉验证简介

1.1 交叉验证是什么

交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。---来自百科

1.2 为什么需要交叉验证

假设有个未知模型具有一个或多个待定的参数,且有一个数据集能够反映该模型的特征属性(训练集)。

适应的过程是对模型的参数进行调整,以使模型尽可能反映训练集的特征。

如果从同一个训练样本中选择独立的样本作为验证集合,当模型因训练集过小或参数不合适而产生过拟合时,验证集的测试予以反映。

总的来说:交叉验证是一种预测模型拟合性能的方法。

2 交叉验证常见的方法

2.1 Holdout 验证

将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此分类器的性能指标。

Python Code:

from sklearn.model_selection import train_test_split

import numpy as np

X = np.array([[1, 2], [3, 4],[5,6],[7, 8]])

y = np.array([1, 2, 2, 1])

X_train,X_test,y_train,y_test = train_test_split(X,y, test_size=0.50, random_state = 5)

print("X_train:\n",X_train)

print("y_train:\n",y_train)

print("X_test:\n",X_test)

print("y_test:\n",y_test)

输出

X_train:

[[5 6]

[7 8]]

y_train:

[2 1]

X_test:

[[1 2]

[3 4]]

y_test:

[1 2]

更好的holdout方法是将原始训练集分为三部分:训练集、验证集和测试集。训练机用于训练不同的模型,验证集用于模型选择。而测试集由于在训练模型和模型选择这两步都没有用到,对于模型来说是未知数据,因此可以用于评估模型的泛化能力。

Holdout方法的步骤

此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性。

2.2 K-fold cross-validation

K次交叉验证,将训练集分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10次交叉验证是最常用的。

10折交叉验证

Python Code

from sklearn.model_selection import KFold

import numpy as np

X = np.array([[1, 2], [3, 4],[5,6],[7, 8]])

y = np.array([1, 2, 2, 1])

kf = KFold(n_splits=2)

for train_index, test_index in kf.split(X):

print("Train:", train_index, "Validation:",test_index)

X_train, X_test = X[train_index], X[test_index]

y_train, y_test = y[train_index], y[test_index]

输出:

Train: [2 3] Validation: [0 1]

Train: [0 1] Validation: [2 3]

初次之外,sklearn还RepeatedKFold、StratifiedKFold

from sklearn.model_selection import RepeatedKFold

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])

y = np.array([0, 0, 1, 1])

rkf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=2652124)

for train_index, test_index in rkf.split(X):

print("TRAIN:", train_index, "TEST:", test_index)

X_train, X_test = X[train_index], X[test_index]

y_train, y_test = y[train_index], y[test_index]

StratifiedKFold是针对非平衡数据的分层采样。分层采样就是在每一份子集中都保持原始数据集的类别比例。比如原始数据集正类:负类=3:1,这个比例也要保持在各个子集中才行。

from sklearn.model_selection import StratifiedKFold

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])

y = np.array([0, 0, 1, 1])

skf = StratifiedKFold(n_splits=2)

skf.get_n_splits(X, y)

print(skf)

for train_index, test_index in skf.split(X, y):

print("TRAIN:", train_index, "TEST:", test_index)

X_train, X_test = X[train_index], X[test_index]

y_train, y_test = y[train_index], y[test_index]

2.3 Leave-One-Out Cross Validation

正如名称所建议, 留一验证(Leave-One-Out Cross Validation, LOOCV)意指只使用原本样本中的一项来当做验证资料, 而剩余的则留下来当做训练资料。 这个步骤一直持续到每个样本都被当做一次验证资料。 事实上,这等同于 K-fold 交叉验证是一样的,其中K为原本样本个数。

Python Code

from sklearn.model_selection import LeaveOneOut

import numpy as np

X = np.array([[1, 2], [3, 4],[5,6],[7, 8]])

y = np.array([1, 2, 2, 1])

loo = LeaveOneOut()

loo.get_n_splits(X)

for train_index, test_index in loo.split(X):

print("train:", train_index, "validation:", test_index)

X_train, X_test = X[train_index], X[test_index]

y_train, y_test = y[train_index], y[test_index]

输出:

train: [1 2 3] validation: [0]

train: [0 2 3] validation: [1]

train: [0 1 3] validation: [2]

train: [0 1 2] validation: [3]

3 交叉验证实例

print(__doc__)

import numpy as np

from scipy import interp

import matplotlib.pyplot as plt

from itertools import cycle

from sklearn import svm, datasets

from sklearn.metrics import roc_curve, auc

from sklearn.model_selection import StratifiedKFold

# #############################################################################

# Data IO and generation

# Import some data to play with

iris = datasets.load_iris()

X = iris.data

y = iris.target

X, y = X[y != 2], y[y != 2]

n_samples, n_features = X.shape

# Add noisy features

random_state = np.random.RandomState(0)

X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]

# #############################################################################

# Classification and ROC analysis

# Run classifier with cross-validation and plot ROC curves

cv = StratifiedKFold(n_splits=6)

classifier = svm.SVC(kernel='linear', probability=True,

random_state=random_state)

tprs = []

aucs = []

mean_fpr = np.linspace(0, 1, 100)

i = 0

for train, test in cv.split(X, y):

probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test])

# Compute ROC curve and area the curve

fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])

tprs.append(interp(mean_fpr, fpr, tpr))

tprs[-1][0] = 0.0

roc_auc = auc(fpr, tpr)

aucs.append(roc_auc)

plt.plot(fpr, tpr, lw=1, alpha=0.3,

label='ROC fold %d (AUC = %0.2f)' % (i, roc_auc))

i += 1

plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',

label='Chance', alpha=.8)

mean_tpr = np.mean(tprs, axis=0)

mean_tpr[-1] = 1.0

mean_auc = auc(mean_fpr, mean_tpr)

std_auc = np.std(aucs)

plt.plot(mean_fpr, mean_tpr, color='b',

label=r'Mean ROC (AUC = %0.2f $\pm$ %0.2f)' % (mean_auc, std_auc),

lw=2, alpha=.8)

std_tpr = np.std(tprs, axis=0)

tprs_upper = np.minimum(mean_tpr + std_tpr, 1)

tprs_lower = np.maximum(mean_tpr - std_tpr, 0)

plt.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,

label=r'$\pm$ 1 std. dev.')

plt.xlim([-0.05, 1.05])

plt.ylim([-0.05, 1.05])

plt.xlabel('False Positive Rate')

plt.ylabel('True Positive Rate')

plt.title('Receiver operating characteristic example')

plt.legend(loc="lower right")

plt.show()

4 参考资料

十折交叉验证python_机器学习(十二)交叉验证实例相关推荐

  1. 验证的管理篇之二:验证管理的三要素

    本文转自:http://www.eetop.cn/blog/html/28/1561828-513774.html 有一句关于项目成功或者失败的话,比较受用,在这里与君分享:"每个项目的失败 ...

  2. 缘分天空之我的机器学习--(二)Tensorflow实例:利用LSTM预测股票每日最高价

    转载 http://blog.csdn.net/mylove0414/article/details/56969181 http://blog.csdn.net/mylove0414/articl ...

  3. Shopify payments二次验证

    解决Shopify payments二次验证说明文档 一旦您的Shopify payments进入二次验证状态,美国Shopify 请务必将Shopify 登录在美国VPS中(美国IP),语言设置为英 ...

  4. 身份证二要素验证的使用场景介绍

    移动互联网的高速发展,带动了互联网平台的进步,网络平台为了满足监管部门网络实名制的要求,一般都需要对新的注册用户进行身份核验,其中最基础的身份证实名验证接口就是身份证二要素验证了. 顾名思义,二要素验 ...

  5. 什么是运营商二要素验证?

    目前有许多平台需要验证您的身份信息,以减少平台遇到的各种问题,但由于许多平台验证方式不同,导致验证速度也有问题,现在有许多平台在注册时,会要求用户在平台上输入手机号码,进行验证,这就是利用运营商验证接 ...

  6. 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集

    机器学习 数据挖掘 数据集划分 训练集 验证集 测试集 Q:如何将数据集划分为测试数据集和训练数据集? A:three ways: 1.像sklearn一样,提供一个将数据集切分成训练集和测试集的函数 ...

  7. 周志华西瓜书3.4题——用十折交叉验证法和留一法估计对率回归的误差

    周志华西瓜书3.4题. 本文所编写的代码均使用python3.7进行调试,依靠的sklearn进行的实验. 第一步,导入iris数据集,数据集使用sklearn包里面自带的. from sklearn ...

  8. R语言选模型/用AIC BIC adjustRsq 十折交叉验证 LOOCV等验证/择参 以fama三因子模型和CAMP模型为例@[理科班的习习同学

    R语言选模型/用AIC BIC adjustRsq 十折交叉验证 LOOCV等验证/择参 以fama三因子模型和CAMP模型为例@理科班的习习同学 引入包与数据预处理 install.packages ...

  9. 机器学习(二十八)——Monte-Carlo

    动态规划(续) Value Iteration vk+1(s)=maxa∈A(Ras+γ∑s′∈SPass′vk(s′))vk+1(s)=maxa∈A(Rsa+γ∑s′∈SPss′avk(s′)) v ...

  10. 机器学习(二十)——EMD, LSA, HMM

    http://antkillerfarm.github.io/ P-R.ROC和AUC 很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大 ...

最新文章

  1. php hasattribute,PHP DOMElement hasAttribute()用法及代码示例
  2. 蝴蝶扇了一下翅膀,混沌就诞生了
  3. access开发精要(8)-设置行高、列宽、隐藏字段,取消隐藏字段,冻结列,取消冻结列,网格线
  4. 【Node.js学习笔记一】什么是Node.js?[概念总结]
  5. linux 粘贴内容命令行,Linux下命令行中的复制和粘贴
  6. 深度学习(四)——RNN, LSTM, 神经元激活函数进阶
  7. echart高级使用_Vue:在Vue中使用echarts
  8. 商业智能bi能带来什么价值
  9. 基于富士通编译器Softune的堆栈、变量、常量理解
  10. 更新了 pe_xscan 和 ClosePc
  11. 蓝桥杯质数c语言,2017年第八届蓝桥杯C/C++程序设计本科B组省赛 等差素数列(结果填空)(素数筛)...
  12. Ubuntu安装Sopcast
  13. 如何设置需要密码才能访问的共享文件夹?
  14. ssh: connect to host master port 22: No route to host
  15. RuntimeError: weight tensor should be defined either for all or no classes
  16. 解决电脑com口被占用与修改COM号问题
  17. 大学人机交互课小组作业(刚入坑菜鸟一枚,求别喷吼吼)
  18. java五位随机验证码的实现。要求前四位是随机大小写的字母,最后一位是数字的组合。例如qWrY4
  19. html制作模拟考试试卷,网页设计与制作模拟试题
  20. 内网渗透之MSF框架模块详细作用介绍

热门文章

  1. 机器学习读书笔记:贝叶斯公式
  2. 上大计算机专业在哪校区,好消息!成都理工大学在川扩招751人,宜宾校区新增计算机443人...
  3. 汇编版|电子印章在各类业务文件中的应用
  4. 大一计算机理论知识测试题,2017计算机基础大一考试试题「附答案」
  5. 西门子cnc sinumerik_2020邯郸cnc加工中心编程要多久就是工厂傅
  6. java做抽奖小程序_随机抽奖小程序
  7. 酷狗社招面试 java_前端面试社招经验(网易,酷狗)
  8. gms认证流程_Android P(9.0)GMS认证新要求
  9. Bean 工厂和Application contexts有什么区别?
  10. 免费顺丰快递单号查询电子面单api接口对接【快递鸟API】