使用交叉验证评估模型

使用交叉验证评估模型

描述

交叉验证(cross-validation)是一种常用的模型评估方法,在交叉验证中,数据被多次划分(多个训练集和测试集),在多个训练集和测试集上训练模型并评估。相对于单次划分训练集和测试集来说,交叉验证能够更准确、更全面地评估模型的性能。

本任务的主要实践内容:

1、 应用k-折交叉验证(k-fold)

2、 应用留一法交叉验证(leave-one-out)

3、 应用打乱划分交叉验证(shuffle-split)

源码下载

环境

  • 操作系统:Windows10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    scikit-learn	0.24.2
    

分析

任务数据集采用鸢尾花(iris)数据集,使用逻辑回归和K-最近邻创建分类模型,分别练习三种交叉验证方法的使用。

本任务涉及以下环节:

a)k-折交叉验证评估模型

b)留一法交验证评估模型

c)打乱划分交叉验证评估模型

实施

步骤1、使用K-折交叉验证评估模型

from sklearn.model_selection import cross_val_score # 交叉验证函数
from sklearn.datasets import load_iris 
from sklearn.linear_model import LogisticRegression 
 
iris = load_iris() # 加载iris数据集
model = LogisticRegression() # 创建逻辑回归模型

# 交叉验证,参数依次为:模型、数据、数据标签、cv(即折数K)
scores = cross_val_score(model, iris.data, iris.target, cv=3) # cv=3,即3折交叉,输出3个评估成绩
print(scores) # 每次的评估成绩(数组)
print(scores.mean()) # 计算平均成绩

输出结果:

[0.98 0.96 0.98]
0.9733333333333333

说明:

  1. Scikit-learn交叉验证函数为cross_val_score,参数cv表示划分的折数k,通常取值3、5或10。

本例中cv=3,表示将数据集分为3份进行交叉验证,其返回值为3次评估的成绩

  1. 本例中cv=3,表示将数据集分为3份进行交叉验证,其返回值为3次评估的成绩。

步骤2、使用留一法(leave-one-out)交叉验证评估模型

from sklearn.datasets import load_iris
from sklearn.model_selection import LeaveOneOut, cross_val_score
from sklearn.neighbors import KNeighborsClassifier 

iris = load_iris() # 加载数据集
model = KNeighborsClassifier() # 创建模型

loo = LeaveOneOut() # 定义留一法策略,作为cv参数的值
scores = cross_val_score(model, iris.data, iris.target, cv=loo)

print(len(scores)) # 留一法输出150个评估成绩(因为样本数为150)
print(scores.mean()) # 计算平均成绩

输出结果:

150
0.9666666666666667

说明:

1、 留一法交叉验证可以看作是极端情况下的k-折交叉验证。每次选1个样本做测试集、其他样本做训练集进行评估,有多少样本就会评估多少次。

2、 本例中样本数为150,因此交叉验证返回150个结果。

步骤3、使用打乱划分(shuffle-split)交叉验证评估模型

from sklearn.datasets import load_iris
from sklearn.model_selection import ShuffleSplit, cross_val_score
from sklearn.linear_model import LogisticRegression 

iris = load_iris()
model = LogisticRegression()

# 划分5次,每次取100个样本作为训练集,10个样本作为测试集
shuffle_split = ShuffleSplit(train_size=100, test_size=10, n_splits=5) 
scores = cross_val_score(model, iris.data, iris.target, cv=shuffle_split) 
print(scores)
print(scores.mean())

# 除指定样本个数外,还可以指定百分比
# 这里就是划分5次,每次取80%为训练集,20%为测试集
shuffle_split = ShuffleSplit(train_size=0.8, test_size=0.2, n_splits=5) 

输出结果:

[1. 1. 1. 1. 1.]
1.0

说明:

  1. 该方法可以同时指定划分次数和训练集与测试集大小。

  2. 参数说明:

    • n_splits 划分次数
    • train_size 训练集样本数量或比例
    • Test_size 测试集样本数量或比例
  3. 该方法允许只取部分样本参与训练和评估,因此适用于比较大的数据集。

你可能感兴趣的:(机器学习,机器学习,python,人工智能)