机器学习——Sklearn学习笔记(2)模型选择和评估

Sklearn学习笔记(2)模型选择和评估

写在前面

心得:先明白框架和基概念,不然容易迷糊和迷路。

机器学习流程

有监督机器学习的基本步骤:
导入模型 (选择模型)
|
初始化模型 (选择模型超参数)
|
拟合数据( 用模型拟合训练数据)——模型验证(cv)
|
预测数据(用模型预测新数据的标签)

前两个是最重要的。

基本概念

  • 预测

机器学习的任务分为两大类:
分类——预测离散标签
回归——预测连续标签

所以,不管是分类还是回归,预测就是机器学习的任务。
后面会知道,针对分类任务的机器学习模型叫做 classifier,针对回归任务的机器学习模型叫做 estimator。

  • 评估器(estimator)

  • 模型(model)

  • 拟合

  • 模型训练

  • 转换器

  1. estimator、classiifier、predictor、model 傻傻分不清?

an estimator is a predictor found from regression algorithm.
a classifier is a predictor found from a classification algorithm.
a model can be both an estimator or a classifier.

一句话:estimator、classiifier 本质上都是预测器(predictor);模型可以是 estimator 或者classiifier 。

  1. transformer 和 estimator ?

Transformer transforms the input data (X) in some ways.
Estimator predicts a new value (or values) (y) by using the input data (X).

transform() 用于转换数据X,理解为输如X1,输出X2;
estimator 用于模型预测,理解为输入X 输出 y;
当然它们都有一个拟合函数 fit(),用于输出之前的训练。

  • 超参数
    模型初始化时,人为选择和输入的参数。

  • 模型初始化
    (模型训练之前)模型超参数的选择过程

  • 模型验证(model validation)
    (模型训练之后)评估模型性能的过程

  • 方差

  • 偏差

方差和偏差是验证模型泛化误差常用的两个指标。
估计值的偏差是不同训练集的平均误差。估计值的方差用来表示它对训练集的变化有多敏感。

1. 交叉验证:评估评估器的性能

  • 模型验证(validation)
    上面也说到了,是模型训练之后,评估模型性能的一个过程。

  • 实验方法 1. 训练和测试是同一套数据集(数据集 = 训练集 = 测试集)——导致过拟合

    将在数据集 D 中训练得到的模型 M 应用在数据集 D上进行测试。(这是错误做法,会导致模型”过拟合“:在训练集上表现良好,在未知数据集上表现很差)

  • 改进方法:划分测试集
    将原数据集一分为二,分为训练集和测试集分别用于模型训练和模型测试;
    (可以通过**网格搜索(grid search)**的方式确定模型最优参数)

  • 流程
    该流程采用了**交叉验证(cv, cross validation)**的方式
    在这里插入图片描述

  • 实现
    划分数据集:train_test_split()

  • 实验方法 2:数据集 = 训练集 + 测试集——有过拟合风险

原因:因为模型是根据训练集数据来进行参数优化的,这避也很容易导致模型在“未知”数据(测试集或全新的数据集)上表现不理想(过拟合)

  • 改进方法:划分验证集
    将原数据集一分为三,即 数据集 = 训练集 + 验证集 + 测试集

  • 方法2的一个问题:可用于模型学习的数量减少(模型失去了一部分训练机会)

  • 解决:使用交叉验证
    交叉验证最基本的方法被称之为 k-折交叉验证,其他方法会在下面描述,主要原则基本相同 。
    k-折交叉验证过程:

    1.将训练集划分为 k 个较小的集合
    2.将 k-1 份训练集子集作为 training data (训练集)训练模型;
    3.将剩余的 1 份训练集子集用于模型验证(也就是把它当做一个测试集来计算模型的性能指标,例如准确率)。
    4.每一个 k 折重复2、3操作

k-折交叉验证得出的性能指标是循环计算中每个值的平均值。 该方法虽然计算代价很高,但是它不会浪费太多的数据(如固定任意测试集的情况一样), 在处理样本数据集较少的问题(例如,逆向推理)时比较有优势
在这里插入图片描述

1.1 交叉验证的指标

使用交叉验证最简单的方法是在估计器和数据集上调用 cross_val_score 辅助函数。

1.1.1 cross_val_score():最容易

  • 例子:
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1)
>>> scores = cross_val_score(clf, iris.data, iris.target, cv=5)
>>> scores                                              
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
  • 打印平均值和 95%的置信区间:
>>> print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)

可以通过 scoring 参数改变评估器的 score()方法:

>>> from sklearn import metrics
>>> scores = cross_val_score(
...     clf, X, y, cv=5, scoring='f1_macro')
>>> scores
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])
  • 交叉验证参数
    当 cv 参数是一个整数时, cross_val_score 默认使用 KFold 或 StratifiedKFold 策略,后者会在估计器派生自 ClassifierMixin 时使用。
    也可以通过迭代,传入选择其它参数:
>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
array([0.977..., 0.977..., 1.  ..., 0.955..., 1.        ])

1.1.2 cross_validate():多指标

cross_validate ()与 cross_val_score ()在两个地方有不同:

  • 它允许指定多个指标进行评估.
  • 除了测试得分,它还会返回一个包含训练得分、拟合次数和 score-times (得分次数)的一个字典

例子:
使用多个评价指标:

>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import recall_score
>>> scoring = ['precision_macro', 'recall_macro']
>>> clf = svm.SVC(kernel='linear', C=1, random_state=0)
>>> scores = cross_validate(clf, X, y, scoring=scoring)
>>> sorted(scores.keys())
['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']
>>> scores['test_recall_macro'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值