使用交叉验证评估模型
描述
交叉验证(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
说明:
- Scikit-learn交叉验证函数为cross_val_score,参数cv表示划分的折数k,通常取值3、5或10。
本例中cv=3,表示将数据集分为3份进行交叉验证,其返回值为3次评估的成绩
- 本例中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
说明:
-
该方法可以同时指定划分次数和训练集与测试集大小。
-
参数说明:文章来源:https://www.toymoban.com/news/detail-412188.html
- n_splits 划分次数
- train_size 训练集样本数量或比例
- Test_size 测试集样本数量或比例
-
该方法允许只取部分样本参与训练和评估,因此适用于比较大的数据集。文章来源地址https://www.toymoban.com/news/detail-412188.html
到了这里,关于使用交叉验证评估模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!