使用交叉验证评估模型

使用交叉验证评估模型

描述

交叉验证(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. 该方法允许只取部分样本参与训练和评估,因此适用于比较大的数据集。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用`GridSearchCV`来选择最优的逻辑回归模型参数,并使用交叉验证评估模型性能。以下是一个示例代码: ```python from sklearn.model_selection import GridSearchCV, cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris # 加载数据集 iris = load_iris() # 定义逻辑回归模型 model = LogisticRegression() # 定义超参数范围 param_grid = {'penalty': ['l1', 'l2'], 'C': [0.1, 1, 10]} # 使用GridSearchCV选择最优的超参数组合 grid_search = GridSearchCV(model, param_grid, cv=5, verbose=0) grid_search.fit(iris.data, iris.target) # 输出最优的超参数组合和对应的模型 print('Best parameters:', grid_search.best_params_) print('Best model:', grid_search.best_estimator_) # 使用交叉验证评估模型性能 scores = cross_val_score(grid_search.best_estimator_, iris.data, iris.target, cv=5) average_score = scores.mean() # 输出模型的平均性能 print("Average score:", average_score) ``` 上面的代码中,我们首先加载了`iris`数据集。然后,我们定义了一个逻辑回归模型,并定义了超参数范围`param_grid`。我们使用`GridSearchCV`来选择最优的超参数组合,其中`cv=5`表示采用5倍交叉验证,`verbose=0`表示不输出详细信息。 然后,我们输出了最优的超参数组合和对应的模型。接着,我们使用交叉验证评估模型的性能,其中`grid_search.best_estimator_`表示使用最优的超参数组合得到的模型。 最后,我们输出了模型的平均性能。需要注意的是,这里使用了`cross_val_score`函数来对模型进行交叉验证,并得到模型的平均性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值