sklearn之Model selection and evaluation学习使用

   这部分可以结合机器学习之模型评估与选择来阅读,sklearn库的中文地址英文地址
   总共可以分为5部分:交叉验证来评估学习器性能;调整学习器的超参数;模型评估量化预测的质量。模型持久化。验证曲线,绘制分数来评估模型。

1、交叉验证来评估学习器的表现

   下面是典型的交叉验证工作图,最优超参通过第2节的网格搜索得到,将最优超参带入学习模型中,数据集分为训练和测试集,利用训练集再次进行模型训练,然后将训练好的模型利用测试集进行最后的评估。也就是在验证集上对模型进行评估。 当验证集上的评估实验比较成功时,在测试集上进行最后的评估。
在这里插入图片描述
   (1)数据集划分:from sklearn.model_selection import train_test_split函数。查看数据类型,发现传入的的X_train和y_train都是numpy.ndarray,数据类型的转换在这里,dataframe和series转换成ndarray数组类型
   (2)k-折交叉验证:将训练集划分为 k 个较小的集合,k-1个作为训练集来训练模型,1个作为验证集(计算模型的性能指标,例如准确率),当然最后还需要在测试集上对模型进行最后的评估。通常用在调参上。
   (3)计算交叉验证指标:cross_val_score, scores = cross_val_score(clf, iris.data, iris.target, cv=5,scoring=‘f1_macro’),每次的得分,计算平均值:scores.mean(),计算95%之心区间scores.std() * 2。通过scoring改变评分方法。若想使用其他交叉验证策略,如随机划分,可以传入该方法,cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0) ,cross_val_score(clf, iris.data, iris.target, cv=cv) 。具体使用在这里
   (4)cross_validate 函数和多度量评估:cross_validate 和cross_val_score不同,允许指定多个指标进行评估。除了测试得分之外,它还会返回一个包含训练得分test_score,训练次数fit_time, 计分次数score-times 的一个字典,还可以指定保留学习器之类的。具体使用在这里
   (5)交叉验证迭代器:在不同的交叉验证策略中生成数据划分的工具。
   循环遍历数据
   KFold :将所有的样例划分为 个组,称为折叠 (fold) (如果 , 这等价于 Leave One Out(留一) 策略),不被分类和分组影响。
   RepeatedKFold 重复 K-Fold n 次。当需要运行时可以使用它 KFold n 次,在每次重复中产生不同的分割。
   LeaveOneOut (或 LOO) 是一个简单的交叉验证。每个学习集都是通过除了一个样本以外的所有样本创建的,测试集是被留下的样本。
   LeavePOut 与 LeaveOneOut 非常相似,因为它通过从整个集合中移除p个样本来创建所有可能的 训练/测试集。对于n个样本,这产生了 c(n,p) 个 训练-测试 对。
   ShuffleSplit 迭代器,随机排列交叉验证,样本首先被打散然后划分为一对训练测试集合。ShuffleSplit(n_splits=3, test_size=0.25, random_state=0),可替代k折交叉验证。
   基于类标签、具有分层的交叉验证迭代器
   StratifiedKFold ,分层k折是 k-fold 的变种,会返回 stratified(分层) 的折叠:每个小集合中, 各个类别的样例比例大致和完整数据集中相同。
   StratifiedShuffleSplit ,分层随机划分,是 ShuffleSplit 的一个变种,会返回直接的划分,比如: 创建一个划分,但是划分中每个类的比例和完整数据集中的相同。
@用于分组数据的交叉验证迭代器
   GroupKFold: 是 k-fold 的变体,它确保同一个 group 在测试和训练集中都不被表示。
   LeaveOneGroupOut ,留一组,每个训练集都是由除特定组别以外的所有样本构成的。
   LeavePGroupsOut :类似于 LeaveOneGroupOut ,但为每个训练/测试集移除与 p组有关的样本。
   GroupShuffleSplit :迭代器是 ShuffleSplit 和 LeavePGroupsOut 的组合,它生成一个随机划分分区的序列,其中为每个分组提供了一个组子集。
   (6)交叉验证在时间序列数据中应用
   时间序列分割TimeSeriesSplit 是 k-fold 的一个变体,它首先返回 折作为训练数据集,并且 折作为测试数据集。 请注意,与标准的交叉验证方法不同,连续的训练集是超越前者的超集。 另外,它将所有的剩余数据添加到第一个训练分区,它总是用来训练模型。这个类可以用来交叉验证以固定时间间隔观察到的时间序列数据样本。[0 1 2] [3],[0 1 2 3] [4],[0 1 2 3 4] [5]。
   (7)打乱数据需注意:如果数据的顺序不是任意的(比如说,相同标签的样例连续出现),为了获得有意义的交叉验证结果,首先对其进行 打散是很有必要的。然而,当样例不是独立同分布时打散则是不可行的。例如:样例是相关的文章,以他们发表的时间 进行排序,这时候如果对数据进行打散,将会导致模型过拟合,得到一个过高的验证分数:因为验证样例更加相似(在时间上更接近) 于训练数据。一些交叉验证迭代器, 比如 KFold ,有一个内建的在划分数据前进行数据索引打散的选项,默认不会进行打散。注意 train_test_split 会返回一个随机的划分。参数 random_state 默认设置为 None ,这意为着每次进行 KFold(…, shuffle=True) 时,打散都是不同的。 然而, GridSearchCV 通过调用 fit 方法验证时,将会使用相同的打散来训练每一组参数。
   为了保证结果的可重复性(在相同的平台上),应该给 random_state 设定一个固定的值。

2、调整学习器的超参数

   超参数,即不直接在估计器内学习的参数。在 scikit-learn 包中,它们作为估计器类中构造函数的参数进行传递。搜索超参数空间以便获得最好 交叉验证 分数的方法是可能的而且是值得提倡的。
   (1)网格搜索法GridSearchCV 提供的网格搜索从通过 param_grid 参数确定的网格参数值中全面生成候选参数。当在数据集上“学习”时,参数值的所有可能的组合都会被评估,从而计算出最佳的组合。
   (2)随机参数优化RandomizedSearchCV 实现了对参数的随机搜索, 其中每个设置都是从可能的参数值的分布中进行取样。
   (3)参数搜索技巧
      指定目标度量:一个可选的评分功能可以通过评分参数指定给 GridSearchCV, RandomizedSearchCV。
      为评估指定多个指标:GridSearchCV 和 RandomizedSearchCV 允许为评分参数指定多个指标。在指定多个指标时,必须将 refit 参数设置为要在其中找到 best_params_,并用于在整个数据集上构建best_estimator_ 的度量标准(字符串)。 如果搜索不应该 refit, 则设置 refit=False。在使用多个度量值时,如果将 refit 保留为默认值,不会导致结果错误。相当于在目标度量外再制定了其他指标。
      复合估计和参数空间:管道:链式评估器 ,描述了如何使用这些工具搜索参数空间构建链式评估器。
      模型选择:开发和评估,通过评估各种参数设置,可以将模型选择视为使用标记数据训练网格参数的一种方法。建议将数据拆分为开发集 (development set,供 GridSearchCV 实例使用)和评估集(evaluation set)来计算性能指标。这可以通过使用效用函数 train_test_split 来完成。
      并行机制:GridSearchCV 和 RandomizedSearchCV 可以独立地评估每个参数设置。如果您的OS支持,通过使用关键字 n_jobs=-1 可以使计算并行运行。 有关详细信息, 请参见函数签名。
   (4)暴力参数搜索的替代方案
      模型特定参数的交叉验证:这些模型可以像适合参数单个值一样适合参数的范围的数据,从而可以进行交叉验证。以下就是这些模型。如逻辑回归模型
在这里插入图片描述
   注意:LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用了交叉验证来选择正则化系数C。而LogisticRegression需要自己每次指定一个正则化系数。除了交叉验证,以及选择正则化系数C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。
   出袋估计:当使用基于装袋的集合方法时,即使用具有替换的采样产生新的训练集,部分训练集保持不用。 对于集合中的每个分类器,训练集的不同部分被忽略。这个省略的部分可以用来估计泛化误差,而不必依靠单独的验证集。 此估计是”免费的”,因为不需要额外的数据,可以用于模型选择。已实现的几种模型如下:
在这里插入图片描述

3、模型评估: 量化预测的质量

有 3 种不同的 API 用于评估模型预测的质量链接
   A、Estimator score method(学习器得分的方法): Estimators(学习器)都有一个 score(得分) 方法,为其解决的问题提供了默认的 evaluation criterion (评估标准),fit完模型后,可以得到.score分数。
   B、Scoring parameter(评分参数): Model-evaluation tools (模型评估工具)使用 cross-validation (如 model_selection.cross_val_score 和 model_selection.GridSearchCV) 依靠 internal scoring strategy (内部 scoring(得分) 策略)。在交叉验证和网格搜索时用,下面部分讨论。
   C、Metric functions(指标函数): metrics 模块实现了针对特定目的评估预测误差的函数。这些指标在以下部分部分详细介绍 分类指标, 多标签排名指标, 回归指标 和 聚类指标 ,就是不同类别模型的不同指标。

(1)scoring 参数: 用来定义模型的评估规则

   解释:Model selection (模型选择)和 evaluation (评估)使用工具,例如 model_selection.GridSearchCV 和 model_selection.cross_val_score ,采用 scoring 参数来控制它们对 estimators evaluated (评估的估计量)应用的指标。scoring 参数指定一个 scorer object (记分对象); 下表显示了所有可能的值。
   scoring参数的应用场景
   1、scoring = 预定义的名字,如‘accuracy’名字代表metrics.accuracy_score函数的功能,所有 scorer objects (记分对象)遵循惯例 higher return values are better than lower return values(较高的返回值优于较低的返回值) 。均方误差在这不能直接使用,而是neg_mean_squared_error代替,它是均方误差的负数值。
   2、根据 metric 函数定义您的评分策略:make_scorer,许多 metrics (指标)没有被用作 scoring(得分) 值的名称,有的需要传参数,在这种情况下,若想生成一个 scoring object (评分对象)。
   (1)一个用例是只有库内的指标函数,make_scorer 函数将 metrics 转换为可用于可调用的 model evaluation (模型评估)。如:

>>> from sklearn.metrics import fbeta_score, make_scorer
>>> ftwo_scorer = make_scorer(fbeta_score, beta=2)
>>> from sklearn.model_selection import GridSearchCV
>>> from sklearn.svm import LinearSVC
>>> grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]}, scoring=ftwo_scorer)

   (2)利用python函数自定义计分对象
在这里插入图片描述
   (3)实现自己的记分对象:您可以通过从头开始构建自己的 scoring object (记分对象),而不使用 make_scorer factory 来生成更加灵活的 model scorers (模型记分对象)。 对于被叫做 scorer 来说,它需要符合以下两个规则所指定的协议:
在这里插入图片描述
   (4)使用多个评估指标:Scikit-learn 还允许在 GridSearchCV, RandomizedSearchCV 和 cross_validate 中评估 multiple metric (多个指数)。为 scoring 参数指定多个评分指标有两种方法:
在这里插入图片描述

>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import confusion_matrix
>>> # A sample toy binary classification dataset
>>> X, y = datasets.make_classification(n_classes=2, random_state=0)
>>> svm = LinearSVC(random_state=0)
>>> def tn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 0]
>>> def fp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 1]
>>> def fn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 0]
>>> def tp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 1]
>>> scoring = {'tp': make_scorer(tp), 'tn': make_scorer(tn),
...            'fp': make_scorer(fp), 'fn': make_scorer(fn)}
>>> cv_results = cross_validate(svm.fit(X, y), X, y,
...                             scoring=scoring, cv=5)
>>> # Getting the test set true positive scores
>>> print(cv_results['test_tp'])  
[10  9  8  7  8]
>>> # Getting the test set false negative scores
>>> print(cv_results['test_fn'])  
[0 1 2 3 2]

(2)分类指标,回归指标,聚类指标,有需要就看链接

4、模型持久化

   使用 pickle 来持久化模型,以备将来使用,而无需重新训练。

(1)持久化示例:

   使用python内置的持久化模块pickle将训练好的模型保存在scikit中:

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> clf.fit(X, y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
 decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
 max_iter=-1, probability=False, random_state=None, shrinking=True,
 tol=0.001, verbose=False)

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0:1])
array([0])
>>> y[0]
0

   在这个 scikit 的特殊示例中,使用 joblib 来替换 pickle(joblib.dump & joblib.load)可能会更有意思,这对于内部带有 numpy 数组的对象来说更为高效, 通常情况下适合 scikit-learn estimators(预估器),但是也只能是 pickle 到硬盘而不是字符串。
在这里插入图片描述

(2)安全性和可维护性的局限性

在这里插入图片描述

5、验证曲线:绘制分数来评估模型(链接

   偏差和方差是估计所固有的属性,我们通常必须选择合适的学习算法和超参数,以使得偏差和 方差都尽可能的低(参见偏差-方差困境)。 另一种降低方差的方法是使用更多的训练数据。不论如何,如果真实函数过于复杂并且不能用一个方 差较小的估计值来近似,则只能去收集更多的训练数据。

(1)验证曲线

   前提:我们需要一个评分函数(参见模型评估:模型评估: 量化预测的质量)来验证一个模型, 例如分类器的准确性。 选择估计器的多个超参数的正确方法当然是网格搜索或类似方法 (参见调优估计的超参数 调整估计器的超参数 ),其选择一个或多个验证集上的分数最高的超参数。 请注意,如果我们基于验证分数优化了超参数,则验证分数就有偏差了,并且不再是一个良好的泛化估计。 为了得到正确的泛化估计,我们必须在另一个测试的数据集上计算得分。
   解释:绘制单个超参数对训练分数和验证分数的影响,有时有助于发现该估计是否因为某些超参数的值 而出现过拟合或欠拟合。注意:如果训练得分和验证得分都很低,则估计器是不合适的。如果训练得分高,验证得分低,则估计器过拟合, 否则估计会拟合得很好。通常不可能有较低的训练得分和较高的验证得分。

>>> import numpy as np
>>> from sklearn.model_selection import validation_curve
>>> from sklearn.datasets import load_iris
>>> from sklearn.linear_model import Ridge

>>> np.random.seed(0)
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> indices = np.arange(y.shape[0])
>>> np.random.shuffle(indices)
>>> X, y = X[indices], y[indices]

>>> train_scores, valid_scores = validation_curve(Ridge(), X, y, "alpha",
...                                               np.logspace(-7, 3, 3),
...                                               cv=5)

(2)学习曲线

   解释:学习曲线显示了对于不同数量的训练样本的估计器的验证和训练评分。它可以帮助我们发现从增加更多的训 练数据中能获益多少,以及估计是否受到更多来自方差误差或偏差误差的影响。如果在增加训练集大小时,验证分数和训练 分数都收敛到一个很低的值,那么我们将不会从更多的训练数据中获益。
   使用:使用:learning_curve函数来绘制这样一个学习曲线所需的值(已使用的样本数量,训练集 上的平均分数和验证集上的平均分数):

>>> from sklearn.model_selection import learning_curve
>>> from sklearn.svm import SVC
>>> train_sizes, train_scores, valid_scores = learning_curve(
...     SVC(kernel='linear'), X, y, train_sizes=[50, 80, 110], cv=5)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值