机器学习模型评估方法入门到实战[三]

413 阅读5分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

之前讲的是如何使用交叉验证进行数据集的划分。当我们用交叉验证的方法并且结合一些性能度量方法来评估模型好坏的时候,我们可以直接使用sklearn当中提供的交叉验证评估方法,这些方法如下:

运用交叉验证进行模型评估

1 cross_value_score

from sklearn.naive_bayes import GaussianNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold
​
#这里省略了数据集的处理代码# 算法实例化
clf = GaussianNB()
​
# 交叉验证法验证模型
kf = RepeatedKFold(n_splits=10, n_repeats=10, random_state=0)
print(cross_val_score(clf, x_vec, y_vec, n_jobs=-1, cv=kf))
参数名意义
estimator估计方法对象(分类器) ,即分类算法的实例,上面的clf
X数据特征(Features) ,上面的x_vec
y数据标签(Labels) ,上面的y_vec
scoring调用方法(包括accuracy和mean_squared_error等等)
cv输入整型数字K就调用默认的KFold交叉验证,也可自定义,如上
n_jobs同时工作的cpu个数(-1代表全部)

2 cross_validate

cross_validate方法基本上可以理解为允许传入多种评分方法的cross_validate_score,它的scoring参数可以以列表或字典的方式接收你传入的评分方式;

参数说明
estimatorestimator object implementing ‘fit’ 用于拟合数据的对象。
Xarray-like of shape (n_samples, n_features) 用于拟合的数据。例如可以是列表或数组
yarray-like of shape (n_samples,) or (n_samples, n_outputs), default=None 在监督学习的情况下要尝试预测的目标变量。
groupsarray-like of shape (n_samples,), default=None 将数据集切分为训练集或测试集时使用的样本的分组标签。仅与“ Group” cv 实例(例如GroupKFold)结合使用。
scoringstr, callable, list/tuple, or dict, default=None 单个str(请参阅评分参数:定义模型评估规则)或可调用项(请参阅从度量函数定义评分策略)用于评估测试集上的预测。 要评估多个指标,请给出(唯一的)字符串列表或以名称为键,可调用项为值的字典。 注意,使用自定义评分器时,每个评分器应返回一个值。返回值列表或数组的度量函数可以包装到多个评分器中,每个评分器都返回一个值。 有关示例,请参阅指定多个度量进行评估。 如果为None,则使用估计器的评分方法。
cvint, cross-validation generator or an iterable, default=None 确定交叉验证切分策略。cv可输入: - None,使用默认的5折交叉验证 - int,用于指定(Stratified)KFold的折数 - CV splitter, - 可迭代输出切分的(训练集,测试集)作为索引的数组 对于int / None输入,如果估计器是分类器,并且y是二分类或多分类,则使用StratifiedKFold。在所有其他情况下,均使用KFold。 有关可在此处使用的各种交叉验证策略,请参阅用户指南在版本0.22中更改:cv为“None”时,默认值从3折更改为5折。
n_jobsint, default=None 用于进行计算的CPU数量。 None除非在joblib.parallel_backend环境中,否则表示1 。 -1表示使用所有处理器。有关更多详细信息,请参见词汇表
返回值说明
scoresdict of float arrays of shape (n_splits,) 每次交叉验证运行时的估计器准确率数组。 返回包含每个评分器的得分或次数数组的字典。这个dict字典的键可能是: - test_score 每个交叉验证切分上测试集的准确率数组。如果评分参数中有多个评分指标,在test_score特定指标中(例如test_r2test_auc)添加后缀_score。 - train_score 每个交叉验证切分上训练集的准确率数组。如果评分参数中有多个评分指标,在train_score特定指标中(例如train_r2train_auc)添加后缀_score。仅当return_train_scoreparameter为True时才可用。 - fit_time 将估计器拟合到每个交叉验证切分的训练集集合上的时间。 - score_time 在每个交叉验证切分的测试集上对估计器评分的次数。(请注意,即使return_train_score设置为True,也不包括训练集上的评分次数) - estimator 每个交叉验证切分的估计器对象。仅当return_estimator参数设置为True时才可用。

在最新的版本sklearn 0.21中cross_val_score与cross_validate被统一,cross_val_score仅仅为调用cross_validate返回字典的结果。

3 cross_val_predict

这里实在没搞懂,直接复制粘贴吧,以后再看:

cross_val_predict函数的结果可能会与cross_val_score函数的结果不一样,因为在这两种方法中元素的分组方式不一样。函数cross_val_score在所有交叉验证的折子上取平均。但是,函数cross_val_predict只是简单的返回由若干不同模型预测出的标签或概率。因此,cross_val_predict不是一种适当的泛化错误的度量。

函数cross_val_predict比较适合做下列事儿:

  • 从不同模型获得的预测结果的可视化。
  • 模型混合: 在集成方法中,当一个有监督估计量的预测被用来训练另一个估计量时

更新:

cross_val_predict 和 cross_val_score的使用方法是一样的,但是它返回的是一个使用交叉验证以后的输出值,而不是评分标准。它的运行过程是这样的,使用交叉验证的方法来计算出每次划分为测试集部分数据的值,知道所有的数据都有了预测值。假如数据划分为[1,2,3,4,5]份,它先用[1,2,3,4]训练模型,计算出来第5份的目标值,然后用[1,2,3,5]计算出第4份的目标值,直到都结束为止。

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_predict
from sklearn import metrics
​
iris = load_iris()
clf = SVC(kernel='linear', C=1, random_state=0)
predicted = cross_val_predict(clf, iris.data, iris.target, cv=10)
​
print(predicted)
print(metrics.accuracy_score(predicted, iris.target))
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1
 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
​
0.9733333333333334