‘
课程链接: 学堂在线-张敏老师机器学习算法训练营
一、机器学习是什么?
三要素: 任务,经验,性能。
基本概念:
- 实例空间X:所有的样本空间
- 假设空间H: 一个假设条件
- 训练样例空间D和目标概念C
- 求解问题: 假设h ∈ H 满足,h(x) = c (x) for all x ∈ X,但是由于真实的X比较大所以我们利用D代替了X
应用场景: 数据挖掘,推荐系统,人脸识别,自动驾驶等
二、实验方法和原则
1. 评价指标
1回归任务
常见的:MAE / MSE / RMSE : 而其中MSE对预测误差较大的样本影响会更大
2分类任务
除了常见的准确率 / 错误率针对二分类任务还有,
精确率:TP / (TP + FP) 预测为正例的样本中真实正例比例
召回率:TP/ (TP + FN) 真实正例的样本中有多少被猜中的比例
Fβ(精确率和召回率的加权调和平均):F1 = 2/ (1/P + 1/R)
其中P 和R 分别代表精确率和召回率
AUC
算法:
- 根据预测值由大到小排序
- 依次以某个样本的预测值为阈值,大的为正例小的为负例
- 可以得到评价指标以真正例率TPR(召回率)为纵轴,以假正例率为横轴作图FPR = FP /( FP + TN)
- 计算ROC曲线围成的面积即为AUC值,最理想的为(0,0) ->(0,1) -> (1,1,)所有正例预测值大于负例
PS: 简便算法测试值从大到小排序,然后计算负例排序位置的累和S, 整个case有N1个真实正例,N0个真实负例
Auc =( S - N0(N0 + 1) / 2 ) / (N1 * N0)
3特定任务
个性化推荐:
- 前K项精度
- 前K项召回率
- 前K项命中率
- nDCG@K、点击率、用户留存等
其中主要介绍下DCG:检测文档用分级相关性来衡量收益,随着位次的增加收益减弱(1/ log(rank)),最终计算累计收益。为了减少由于文档数增加而带来的固定收益增加,我们先将相关性由大到小进行排序后,归一化DCG,即真实的DCG值/ 理想值进行归一化。
这样做的好处有:
- 任意位置值都小于1
- 对不同数量的文档搜索内容求均值即可
- 考虑了分级相关性和位置信息
对话系统:
- BLUE、ROUGE、METEOR:基于词
- 基于词向量计算预测句子和目标句子的相似度
- 人工评价
2.数据集
数据分为三类,且这三个集合需要尽量互相独立,否则可能会过拟合:
- 训练集: 训练生成模型
- 验证集: 一般由训练集中产生,用于调整超参数,学习率,epoch,正则权重等
- 测试集: 预测结果
常见划分训练和测试集的方式有按比例或者数目随机划分,留一划分,还有一些由于特殊功能的划分比如在推荐系统中把用户最后一个交互序列作为测试集
3. 实验验证
随机重复实验
由于模型和数据的随机影响,所以我们一般采取多次重复实验以泛化误差带来的影响,其中做法包括:增大训练样本,重复多次划分数据集和更改随机种子。需要保证每次取样满足iid(独立同分布)的原则,最终的结果包括:评价指标的均值,以及样本标准差和标准误差。
K-fold 交叉实验
随机把数据分成K个大小相等的不相交的子集然后依次取一块作为测试集,其余的作为训练集,然后取均值作为评价结果。
这样做的好处在于数据利用率高,但是由于训练集互有交集,所以每一轮不满足iid。
增大k,模型的bias下降和方差上升。
# 定义k-fold交叉验证函数
def cross_validate_model(clf , model_name , k = 5):
'''
@para
clf : 分类器
model_name : 分类器的名称
k : 交叉验证的次数
'''
fold_size = len(y_train) // k
acc_list = []
for i in range(k):
# 选择验证集
start = i * fold_size
end = (i + 1) * fold_size
validation_X = x_train[start:end]
validation_Y = y_train[start:end]
# 选择训练集
training_X = np.array(x_train[:start].tolist() + x_train[end:].tolist())
training_Y = np.array(y_train[:start].tolist() + y_train[end:].tolist())
# 训练和预测模型
# 在这里进行你的训练和预测
clf.fit(training_X ,training_Y)
pred_Y = clf.predict(validation_X)
acc = sum ( pred_Y == validation_Y) / len(validation_Y)
acc_list.append(acc)
# 输出结果
print('The {} 5-fold cross-validation accuracy is {:.4f}'.format( model_name , np.mean(acc_list)))
三. 总结
以上就是关于机器学习实验设计的基础内容,整体来说机器学习的目的就是找到一个函数,这个函数可能是一个非常复杂的函数,通过一些知识我们去找到更为精准的函数然后去预测未知的知识。
后面大部分都会介绍的是算法模型这一块内容,但是其实了解整个机器学习的实验框架也是十分重要的,这里就包括了对数据处理以及实验方案,以及统计有效性检验。