Sklearn学习笔记(2)模型选择和评估
- 写在前面
- 1. 交叉验证:评估评估器的性能
- 2. 调整评估器的超参数
- 3. 指标和评分:量化预测的质量
-
- 3.1 不同评分方法的scoring参数
- 3.2 分类指标
-
- 3.2.1 从二分到多分类和 multilabel
- 3.2.2 精确度得分
- 3.2.3 平衡的准确度评分
- 3.2.4 Cohen’s kappa
- 3.2.5 混淆矩阵
- 3.2.6 分类报告
- 3.2.7 Hamming loss (汉明损失)
- 3.2.8 Precision, recall and F-measures(精确率、召回率、F 值-度量)
- 3.2.9Jaccard 相似性系数分数
- 3.2.10 Hinge 损失
- 3.2.11 Log 损失
- 3.2.12 Matthews 相关系数
- 3.2.13 多标签混合矩阵
- 3.2.14 受试者工作特性曲线 (ROC)
- 3.2.15 零一损失
- 3.2.16 Brier 分数损失
- 3.3 多标签排序指标
- 3.4 回归指标
- 聚类指标
- 虚拟估计: DummyClassifier()
- 4. 模型持久化
- 5. 验证曲线:绘制分数图来评估模型
- 写在后面
写在前面
心得:先明白框架和基概念,不然容易迷糊和迷路。
机器学习流程
有监督机器学习的基本步骤:
导入模型 (选择模型)
|
初始化模型 (选择模型超参数)
|
拟合数据( 用模型拟合训练数据)——模型验证(cv)
|
预测数据(用模型预测新数据的标签)
前两个是最重要的。
基本概念
- 预测
机器学习的任务分为两大类:
分类——预测离散标签
回归——预测连续标签
所以,不管是分类还是回归,预测就是机器学习的任务。
后面会知道,针对分类任务的机器学习模型叫做 classifier,针对回归任务的机器学习模型叫做 estimator。
-
评估器(estimator)
-
模型(model)
-
拟合
-
模型训练
-
转换器
- 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 。
- 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'