机器学习中val_如何在机器学习中使用交叉验证(实例)

f4974d8c6f7627df39d06012823afa23.png

今天我们来说说在机器学习中,针对中小型数据集常用的一种用于观察模型稳定性的方法——交叉验证。

一、什么是交叉验证?

概述

交叉验证是用来观察模型的稳定性的一种方法,我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。

63bc7ac142225a73b9ac777dd9cfb9cf.png

实质

将数据集进行多次划分,一部分做为训练集来训练模型,另一部分做为测试集,以此多次计算,最终评价模型效果。

二、为什么要用交叉验证?(适用范围)

  1. 交叉验证可以用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,在一定程度上减小过拟合。
  2. 可以从有限的数据中获取尽可能多的有效信息。
  3. 在数据量较少时,更方便找到适合的模型参数。

注~

交叉验证适用于中小型的数据集,数据量较大(或做深度学习)时,不推荐使用。

  1. 没必要
  2. 训练时间拉长了,时间成本高

三、实例操作

在之前的文章中,我们使用肝炎数据集进行了数据分析及建立了决策树模型:

侦探L:Pandas与机器学习实例——肝炎数据集(2)​zhuanlan.zhihu.com
635ef5c07e8d95fc819a9675ac3b5110.png

当时我们指定了拆分系数为0.3,也是说将7/10的数据作为训练集,剩下3/10的数据作为测试集。

最后得到模型在测试集上的准确度是0.787。

这次我们不使用拆分系数进行划分,采用交叉验证的方法进行数据集划分。

首先还是一样,回顾一下我们的数据:

1e4d14b74d334e2d0ccfc45988fac0ca.png

将原数据集按特征和目标进行分割:

df_x=df.drop(labels='是否生还',axis=1)
df_y=df.loc[:,'是否生还']

特征:

e34b144afe5cdc83039ff6f0d9476529.png

目标:

c62093c256cdb5950adae231de2064b1.png

导入我们实验索要用的库:

#决策树
from sklearn import tree

#交叉验证
from sklearn.model_selection import cross_val_score

实例化(这里我们用的是分类树):

clf = tree.DecisionTreeClassifier(criterion="entropy")

进行交叉验证,查看结果:

cross_val_score(clf, df_x, df_y, cv=10)

26c818fa03ac4bd37fa7cd156a9bcc59.png

从返回的结果可以看到,返回值是包含10个准确度的array。

我们还可以进一步使用mean( )来查看交叉验证后的平均情况:

cross_val_score(clf, df_x, df_y, cv=10).mean()

16007ac9ecce3b9c93e22ee4a46a0b4d.png

可以看到,10次交叉验证的结果,平均的准确度在0.82左右。

小结:

主要参数:

通过上面的例子看到,我们的交叉验证方法这里主要有四个参数:

第一个:模型评估器,决策树、回归、随机森林、支持向量机等等。

第二个:完整的数据集特征(不需划分测试集合训练集)

第三个:完整的数据集标签(不需划分测试集合训练集)

第四个:cv=10,也就是指定做十次交叉验证(把数据分成十份,每次提取一份作为测试集,剩下的九份作为训练集,如此循环十次,默认=5)

实际上还有一个常用的常数:scoring。比如指定scoring = "neg_mean_squared_error",也就是说指定使用"neg_mean_squared_error"方法进行模型评估。

(在本例中,由于我们模型使用的是分类树,因此我们的交叉验证结果返回值是十次拟合的准确度,因此不需要使用scoring参数。)

使用交叉验证与使用拆分系数的对比:

可以看到,使用交叉验证得到的模型评估结果,在某些时候还优于使用拆分系数进行单次数据划分,有时候可以得到更客观的评估结论。

当然了,无论是使用拆分系数还是交叉验证,在后续的模型调试中,我们还是依旧要进行参数调优的~

四、使用一组交叉验证进行随机森林算法和决策树算法的效果对比

#导入随机森林并进行实例化
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators=30)
#决策树
df_clf = cross_val_score(clf, df_x, df_y, cv=10)

#随机森林
df_rfc = cross_val_score(rfc,df_x, df_y,cv=10)

作出两种算法在本例中的拟合效果图:

import matplotlib.pyplot as plt
plt.plot(range(1,11),df_clf,label = "分类树")
plt.plot(range(1,11),df_rfc,label = "随机森林")
plt.rcParams['font.sans-serif']=['SimHei']
plt.legend()
plt.show()

79809892e93597868d30634fe51a599f.png

可以看到,在本次交叉验证中,随机森林算法的准确率更高一些。

df_clf_av = cross_val_score(clf, df_x, df_y, cv=10).mean()
df_rfc_av = cross_val_score(rfc,df_x, df_y,cv=10).mean()
print("本次交叉验证下决策树平均准确度:{:.2%};本次交叉验证下随机森林平均准确度{:.2%}".format(df_clf_av,df_rfc_av))

d0fe6fe346ad7445ad9f633376a24dd9.png

也就说是,在本例中,使用随机森林算法的效果会更好一点。


以上便是<如何在机器学习中使用交叉验证(实例)>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cross_val_score是Scikit-learn库的一个函数,它可以用来对给定的机器学习模型进行交叉验证。它接受四个参数: 1. estimator: 要进行交叉验证的模型,是一个实现了fit和predict方法的机器学习模型对象。 2. X: 特征矩阵,一个n_samples行n_features列的数组。 3. y: 标签向量,一个n_samples行1列的数组。 4. cv: 交叉验证的折数,可以是一个整数或者是一个交叉验证迭代器。 返回值是一个浮点型数组,表示每次交叉验证的评分。 下面是一个示例代码,使用cross_val_score对线性回归模型进行交叉验证: ```python from sklearn.model_selection import cross_val_score from sklearn.linear_model import LinearRegression # 准备数据 X = [[0, 0], [1, 1], [2, 2], [3, 3]] y = [0, 1, 2, 3] # 创建模型 model = LinearRegression() # 调用cross_val_score scores = cross_val_score(model, X, y, cv=5) # 输出结果 print(scores) ``` 在这个例子,我们使用了5折交叉验证,所以会进行5次评估,并输出5个评分。 ### 回答2: cross_val_score是scikit-learn库的一个函数,用于进行交叉验证并返回评估指标的分数。它可以用于评估分类器或回归器的性能。 使用cross_val_score的一般流程如下: 1. 导入所需的库和数据集。 2. 创建一个分类器或回归器的实例。 3. 使用cross_val_score函数进行交叉验证,同时指定参数,如分类器/回归器、训练数据和标签、评估指标等。 4. 返回交叉验证的分数。 具体的代码示例如下: ``` from sklearn.model_selection import cross_val_score from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_iris # 导入数据集 iris = load_iris() X = iris.data y = iris.target # 创建分类器实例 clf = DecisionTreeClassifier() # 使用cross_val_score进行交叉验证,指定参数 scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy') # 返回交叉验证的分数 print("交叉验证分数:", scores) ``` 在以上的示例,我们导入了所需的库和iris数据集。然后,创建了一个决策树分类器的实例。接着,我们使用cross_val_score函数对分类器进行交叉验证,指定了参数cv=5表示进行5折交叉验证,scoring='accuracy'表示使用准确率作为评估指标。最后,我们打印出交叉验证的分数。 使用cross_val_score函数可以方便地进行交叉验证,能够更准确地评估模型的性能,并且可以根据需要选择不同的评估指标。这对于选择最佳模型、调参以及模型比较等都非常有用。 ### 回答3: cross_val_score是用于评估模型性能的函数之一,在机器学习经常被使用。它的使用方法如下: 1. 导入必要的库: ```python from sklearn.model_selection import cross_val_score ``` 2. 准备数据集并创建模型: ```python X, y = 数据集的特征, 数据集的目标变量 model = 创建模型的代码 ``` 3. 调用cross_val_score函数: ```python scores = cross_val_score(model, X, y, scoring=None, cv=None) ``` 4. 解释cross_val_score的参数: - model: 训练好的模型 - X: 数据集的特征矩阵 - y: 数据集的目标变量 - scoring: 评估指标的名称,默认为None,可以使用常见的评估指标,如'accuracy'、'precision'等 - cv: 交叉验证的折数,默认为None,表示使用默认的3折交叉验证 5. 获取交叉验证结果: ```python print(scores) ``` 输出的结果是一个包含交叉验证每折评估指标得分的数组。 通过cross_val_score函数,我们可以使用交叉验证来评估模型的性能,而不仅仅是在单一的训练集上。这有助于我们更准确地了解模型的泛化能力,避免因过拟合或欠拟合而造成的性能偏差。此外,通过指定不同的评估指标,我们可以根据具体的问题选择最适合的模型。例如,在分类问题可以使用'accuracy'指标,而在回归问题可以使用'Mean Squared Error'指标。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值