# 机器学习实战：模型评估和优化

## 解决方案：交叉验证

### Holdout 方法

`# assume that we begin with two inputs:#    features - a matrix of input features#    target - an array of target variables#       corresponding to those featuresN = features.shape[0]N_train = floor(0.7 * N)# randomly select indices for the training subsetidx_train = random.sample(np.arange(N), N_train)# break your data into training and testing subsetsfeatures_train = features[idx_train,:]target_train = target[idx_train]features_test = features[~idx_train,:]target_test = target[~idx_train]# build a model on the training setmodel = train(features_train, target_train)# generate model predictions on the testing setpreds_test = predict(model, features_test)# evaluate the accuracy of the predictionsaccuracy = evaluate_acc(preds_test, target_test)`

1. Holdout方法计算得到的误差估计非常接近模型在“新数据集”的误差。它们确实比用训练集数据得到的误差估计更接近（图3），尤其是对于窗口参数值较小的情况。
2. Holdout方法的误差估计有很多噪音。相比从新数据得到的光滑的误差曲线，其跳跃波动很厉害。

### K-Fold交叉验证

```# assume that we begin with two inputs:
#    features - a matrix of input features
#    target - an array of target variables
#       corresponding to those features

N = features.shape[0]
K = 10 # number of folds

preds_kfold = np.empty(N)

folds = np.random.randint(0, K, size=N)

# loop through the cross-validation foldsfor ii in np.arange(K):
# break your data into training and testing subsets
features_train = features[folds != ii,:]
target_train = target[folds != ii]
features_test = features[folds == ii,:]

# build a model on the training setmodel = train(features_train, target_train)

# generate and store model predictions on the testing setpreds_kfold[folds == ii] = predict(model, features_test)

# evaluate the accuracy of the predictions
accuracy = evaluate_acc(preds_kfold, target)```

## 使用交叉验证的几点注意事项

• 在K-fold方法交叉验证中K的值选的越大，误差估计的越好，但是程序运行的时间越长。 解决方法：尽可能选取K=10（或者更大）。对于训练和预测速度很快的模型，可以使用leave-one-out的教程验证方法（即K=数据样本个数）。
• 交叉验证方法（包括Holdout和K-fold方法）假设训练数据的分布能代表整体样本的分布。如果你计划部署模型来预测一些新数据，那么这些数据的分布应该和训练数据一致。如果不一致，那么交叉验证的误差估计可能会对新数据集的误差更加乐观。 解决方法：确保在训练数据中的任何潜在的偏差都得到处理和最小化。
• 一些数据集会用到时序相关的特征。例如，利用上个月的税收来预测本月的税收。如果你的数据集也属于这种情况，那你必须确保将来的特征不能用于预测过去的数值。 解决方法：你可以构造交叉验证的Holdout数据集或者K-fold，使得训练数据在时序上总是早于测试数据。

## 总结

• Holdout是最简单的交叉验证方法，为了更好地估计模型的通用性，分割一部分数据作为待预测的测试数据集。
• K-fold交叉验证 —— 每次保留K份数据中的一份 —— 能够更确定地估计模型的效果。这种改进的代价来自于更高的计算成本。如果条件允许，K等于样本数目时能得到最好的估计，也称为leave-one-out方法。
• 介绍了模型评价的基本流程。简单来说就是：
• 获取数据并做建模前的预处理（第二章），并且确定合适的机器学习模型和算法（第三章）。
• 构建模型，并根据计算资源选择使用Holdout或者K-fold交叉验证方法预测数据。
• 用所选取的指标评估预测结果。如果是分类的机器学习方法，在4.2节里会介绍常见的效果评价指标。同样，我们会在4.3小节介绍回归问题的常用评价指标。
• 不断调整数据和模型，直到取得理想的效果。在5~8章中，我们会介绍真实场景下用于提高模型效果的常用方法。
• 对于分类模型，我们介绍了几个用于上述流程中步骤3的模型性能指标。这些技术包括简单的准确率计算，混淆矩阵，ROC，ROC曲线和ROC曲线下面积。
• 在回归模型中，我们介绍了均方根误差（rMSE）与R平方估计（R-squared），我们讨论了简单的可视化，如预测与实际的散点图和残差图。
• 我们介绍了调整参数的概念，并展示了如何使用网格搜索算法的参数优化模型。

Under/over-fitting

Evaluation metric

Mean squared error

Cross-validation

Holdout method

Holdout方法

K-fold cross-validation

K折交叉验证

Confusion matrix

ROC

AUC - Area under the ROC curve

ROC曲线下面积

ROC曲线下方的面积大小。

Tuning parameter

Grid search

962 篇文章114 人订阅

0 条评论

## 相关文章

1355

### 【专知-PyTorch手把手深度学习教程02】CNN快速理解与PyTorch实现: 图文+代码

【导读】主题链路知识是我们专知的核心功能之一，为用户提供AI领域系统性的知识学习服务，一站式学习人工智能的知识，包含人工智能（ 机器学习、自然语言处理、计算机视...

4.7K11

1012

51011

### 机器学习逻辑回归：算法兑现为python代码

0 回顾 昨天推送了逻辑回归的基本原理：从逻辑回归的目标任务，到二分类模型的构建，再到如何用梯度下降求出二分类模型的权重参数。今天，我们将对这个算法兑现为代码...

3605

### 【最新TensorFlow1.4.0教程03】利用Eager Execution构建和训练卷积神经网络(CNN)

【导读】主题链路知识是我们专知的核心功能之一，为用户提供AI领域系统性的知识学习服务，一站式学习人工智能的知识，包含人工智能（ 机器学习、自然语言处理、计算机视...

4115

4619

### 深度学习目标检测指南：如何过滤不感兴趣的分类及添加新分类？

AI 科技大本营按：本文编译自 Adrian Rosebrock 发表在 PyImageSearch 上的一篇博文。该博文缘起于一位网友向原作者请教的两个关于目...

1352

### 【学术】一文教你如何正确利用kNN进行机器学习

AiTechYun 编辑：xiaoshan k最近邻算法（kNN）是机器学习中最简单的分类方法之一，并且是入门机器学习和分类的好方法。它基本上是通过在训练数据中...

2825

### 深度学习与TensorFlow:FCN论文翻译(二)

Each layer of data in a convnet is a three-dimensional array of size h × w × d, ...

2252