Sklearn中的交叉验证|保持方法|K-折交叉验证|LOOCV

189 阅读10分钟

简介:在今天的教程中,我们将看到Sklearn中的各种交叉验证技术,如K-fold交叉验证、分层K-fold交叉验证、缺一不可交叉验证。

在今天的教程中,我们将看到Sklearn中的各种交叉验证技术,如K-fold交叉验证、分层K-fold交叉验证、Leave one out交叉验证(LOOCV)和重复的随机训练测试分叉。我们将研究这些交叉验证技术是如何帮助更好地评估机器学习模型的,并举例说明。

K-Fold Cross Validation in Sklearn

资料来源

什么是机器学习中的交叉验证

当我们用监督学习技术创建一个机器学习模型时,在将其转移到生产之前评估模型的性能和稳健性是非常重要的。

评估模型质量的主要方面有

  • 模型的准确性如何
  • 模型的泛化程度如何

当我们开始建立一个模型,并用 "整个 "数据集来训练它,我们可以很好地计算它在这个训练数据集上的准确性。但我们无法测试这个模型在训练集中没有的新数据上的表现,因此无法确定它的泛化程度。

因此,我们需要技术来利用同一数据集进行模型的训练和测试。

在机器学习中,交叉验证是一种评估模型泛化程度和整体准确性的技术。为此,它从数据集中随机抽取数据来创建训练和测试集。有多种交叉验证的方法,如下所示

  1. 剔除法
  2. 撇开一个交叉验证法
  3. K-折交叉验证法
  4. 分层的K-Fold交叉验证法
  5. 重复的随机训练测试分割

1.搁置方法

在暂缓方法中,数据集以随机抽样的方式被分成训练集和测试集。训练集用于训练模型,测试集用于用未见过的数据测试其准确性。如果训练和准确率几乎相同,那么这个模型就可以说是泛化得很好。通常使用80%的数据进行训练,其余20%用于测试。

优点

  • 它简单易行
  • 执行时间短。

缺点

  • 如果数据集本身很小,留出一部分用于测试会降低模型的稳健性。这是因为训练样本可能不能代表整个数据集。
  • 由于训练集和测试集分割的随机性,评估指标可能会有所不同。
  • 尽管训练测试的80-20分割被广泛采用,但没有分割的经验法则,因此结果可能会根据训练测试的分割方式而变化。

2.漏掉一个交叉验证(LOOCV)

在这种技术中,如果数据集中有n个观测值,那么只有一个观测值被保留用于测试,其余的数据点被用于训练。这样重复n次,直到所有的数据点在每次迭代中都被用于测试目的。最后,通过结合每次迭代的准确性来计算平均准确性。

优势

  • 由于每个数据都参与了训练和测试,所以整体的准确度更加可靠。
  • 当数据集很小的时候,它是非常有用的。

劣势

  • 当数据观测值的数量很大时,LOOCV的使用并不实际。例如,设想一个有50万条记录的数据集,那么需要创建50万个模型,这其实是不可行的。
  • LOOCV方法有巨大的计算和时间成本。

3.K-折交叉验证法

在K-Fold交叉验证方法中,数据集被分割成K个折叠。现在,在第一次迭代中,第一个折子被保留用于测试,模型在其余k-1个折子的数据上进行训练。

在下一次迭代中,第二褶被保留用于测试,其余褶被用于训练。这样一直持续到第K次迭代。在每个迭代中获得的精确度被用来得出模型的总体平均精确度。

优点

  • K-Fold交叉验证法在数据集较小且不可能在不损失有用的训练数据的情况下将其分割成训练-测试集(保留方法)时非常有用。
  • 它有助于创建一个具有低方差和低偏差的稳健模型,因为它是在所有数据上进行训练的。

缺点

  • K-Fold交叉验证的主要缺点是,训练需要进行K次,因此它需要消耗更多的时间和资源。
  • 不建议用于连续的时间序列数据。
  • 当数据集不平衡时,K-折交叉验证可能不会得到好的结果。这是因为有些折叠可能只有少数类的几条或没有记录。

4.分层的K-折交叉验证法

当数据不平衡时,分层的K-折交叉验证很有用。在对数据进行K折抽样时,它能确保每个折中的所有类别的分布都得到保持。例如,如果数据集中98%的数据属于B类,2%的数据属于A类,分层抽样将确保每个折叠中的两个类的比例相同,即98%对2%。

优势

当数据集不平衡时,推荐使用分层的K-折交叉验证法。

5.反复随机测试-训练分割

重复随机测试-训练分割是传统训练-测试分割和K-折交叉验证方法的混合体。在这种技术中,我们将数据随机分割成训练-测试集,然后多次重复这个过程,就像交叉验证法一样。

Sklearn库中交叉验证法的例子

关于数据集

我们将使用帕金森病数据集作为Sklearn库中交叉验证的所有例子。我们的目标是预测某位患者是否患有帕金森病。我们将在所有的例子中使用决策树算法。

该数据集有21个属性和195行。帕金森病数据集的各个字段如下 -

  • MDVP:Fo(Hz) - 平均发声基音频率
  • MDVP:Fhi(Hz) - 最大声带基频
  • MDVP:Flo(Hz) - 最小声带基频
  • MDVP:Jitter(%),MDVP:Jitter(Abs),MDVP:RAP,MDVP:PPQ,Jitter:DDP - 几种衡量基频变化的方法
  • 衡量基本频率的变化
  • MDVP:Shimmer,MDVP:Shimmer(dB),Shimmer:APQ3,Shimmer:APQ5,MDVP:APQ,Shimmer:DDA - 衡量振幅变化的几种方法
  • NHR,HNR - 衡量声音中噪音和音调成分的比例的两种方法
  • status - 受试者的健康状况(1)--帕金森症,(0)--健康。
  • RPDE,D2 - 两种非线性动态复杂性测量方法
  • DFA--信号分形缩放指数
  • spread1,spread2PPE - 基频变化的三种非线性测量方法

同时阅读 - Python Sklearn中的决策树分类器与实例

导入必要的库

我们首先加载建立我们的模型所需的库。

在[53]中。

import

将CSV数据读入Pandas

接下来,我们将CSV文件中的数据集加载到pandas数据框中,并检查前5行。

在[52]中。

df

Out[52]:

名称MDVP:Fo(Hz)MDVP:Fhi(Hz)MDVP:Flo(Hz)MDVP:Jitter(%)MDVP:Jitter(Abs)MDVP:RAPMDVP:PPQ抖动:DDPMDVP:微光...Shimmer:DDA营养液HNR状态RPDEDFA传播1传播2D2PPE
0phon_R01_S01_1119.992157.30274.9970.007840.000070.003700.005540.011090.04374...0.065450.0221121.03310.4147830.815285-4.8130310.2664822.3014420.284654
1语音_R01_S01_2122.400148.650113.8190.009680.000080.004650.006960.013940.06134...0.094030.0192919.08510.4583590.819521-4.0751920.3355902.4868550.368674
2语音_R01_S01_3116.682131.111111.5550.010500.000090.005440.007810.016330.05233...0.082700.0130920.65110.4298950.825288-4.4431790.3111732.3422590.332634
3语音_R01_S01_4116.676137.871111.3660.009970.000090.005020.006980.015050.05492...0.087710.0135320.64410.4349690.819235-4.1175010.3341472.4055540.368975
4语音_R01_S01_5116.014141.781110.6550.012840.000110.006550.009080.019660.06425...0.104700.0176719.64910.4173560.823484-3.7477870.2345132.3321800.410335

5行×24列

数据预处理

名字 "这一列在训练模型时不会增加任何价值,可以被丢弃,所以我们在下面放弃它。

在[33]中。

df

接下来,我们将分离特征和目标矩阵,如下图所示。

在[35]中。

#Independent And dependent features

Sklearn中的搁置方法

通过使用sklearn.model_selection的train_test_split模块,可以应用hold-out方法。

在下面的例子中,我们对数据集进行了分割,创建了大小为30%的测试数据和大小为70%的训练数据。random_state数字保证了每次运行中的分割是确定的。

In[38]:

from sklearn.model_selection import train_test_split

X_train

Out[38]:

0.7796610169491526

K-Fold交叉验证

Sklearn中的K-Fold交叉验证可以通过使用 sklearn.model_selection的cross_val_score模块来应用 。

在下面的例子中,使用了10个折,产生了10个准确性分数,我们用它来计算平均分数。

In[40]:

from

Out[40]:

[0.7        0.8        0.8        0.8        0.8        0.78947368
 0.84210526 1.         0.68421053 0.36842105]
0.758421052631579

分层的K-折交叉验证

在Sklearn中,可以通过使用 sklearn.model_selection的 StratifiedKFold 模块来应用分层K折交叉验证。

在下面的例子中,数据集被分成了5个部分或折叠。它返回5个精度分数,我们用它来计算最终的平均分数。

In[41]:

from sklearn.model_selection import StratifiedKFold

skfold

Out[41]:

array([0.61538462, 0.79487179, 0.71794872, 0.74358974, 0.71794872])

0.717948717948718

留一手交叉验证(LOOCV)

在Sklearn中,通过使用 sklearn.model_selection的 LeaveOneOut 模块,可以应用留一出交叉验证(LOOCV)。

在[43]中。

from

Out[22]:

array([1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 0., 0., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       0., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1.,
       1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 0.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1.,
       1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1.,
       0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 0., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 0., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 0., 0., 1., 1., 0., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1.,
       1., 1., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 0., 0., 1., 1., 1.,
       1., 0., 1., 1., 1., 1., 1., 1., 0., 1., 1., 1., 1., 1., 1., 0., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0.,
       1., 1., 1., 1., 1., 1., 1., 1.])

在[44]中。

print

Out[44]:

0.8358974358974359

重复的随机测试-训练拆分

在Sklearn中,可以通过使用 sklearn.model_selection的 ShuffleSplit 模块来应用重复的随机测试-训练拆分。

在[45]中。

from

Out[45]:

array([0.79661017, 0.71186441, 0.79661017, 0.88135593, 0.72881356,
       0.84745763, 0.83050847, 0.77966102, 0.83050847, 0.81355932])

0.8016949152542372

The postCross Validation in Sklearn | Hold Out Approach | K-Fold Cross Validation | LOOCVappeared first onMLK - Machine Learning Knowledge.