a07.Andrew-ML0601-评估算法(偏差、学习曲线)

评估一个机器学习算法

01.Evaluating a Hypothesis


  • 给定一个数据集,一般将其分为训练集(70%)和测试集(30%)。
  1. 得到theta参数和最小化代价函数用训练集
  2. 计算测试集的误差
  • 测试集的误差
  1. 线性回归:


  2. 分类问题的误差


02. 模型选择


  • 机器学习有时候能很好的拟合训练集的时候,并不一定代表他能很好的预测。因为可能过度拟合或者测试的数据太少。一个比较常用的模型选择方法是将数据分为三种:训练集(Training set: 60%)、交叉验证集(Cross validation set: 20%)、测试集(Test set: 20%),具体实现步骤如下:
  1. 对于每个不同级数d的多项式,利用训练集选择出最优化参数theta
  2. 利用交叉验证集找到使得误差最小的多项式的级数d
  3. 用测试集评估最终平均误差

Bias vs. Variance(偏差 vs. 方差)

01. 诊断偏差


  • 训练误差和交叉验证误差随着多项式的次数增加会发生一定规律的变化。
    高偏差出现在d较小时,此时underfitting;
    高方差出现在d较大时,此时overfitting.


02. 正规化的偏差和误差


  • 正规化的lamda取值变化对训练偏差和验证误差的关系如图所示:
    当lamda取值变大,训练误差变大,此时验证误差也很大(因为训练误差都不准确);太小又过拟合,验证误差变大,只有取值在一个不大不小的值验证误差才比较准确。


  • 找Lamada的过程(双迭代):

  1. 创造lamda集合
  2. 用不同次数的多项式创造训练模型
  3. 循环迭代lamda和不同次数多项式找出theta
  4. 找到使得验证误差最小的lamda和theta的值

03. 学习曲线


  • 学习曲线是训练误差和验证误差随着样本数量的走势图,当我们尝试画出学习曲线的时候,就可以根据走势判断出此时学习算法是高误差还是高方差,以此来修正我们的算法。
  • 高偏差:
    由于欠拟合,增大训练样本会使得误差变大;验证误差开始因为不能很好拟合所以一开始会很大,但是样本增多,他总能找到一条相对于靠近点的直线、(在增加训练样本的时候实际也是在调整参数),所以偏差会变小,最终和训练偏差差不多。但误差还是较大,此时增加训练样本并不能使训练函数性能提升。


  • 高方差:
    由于过拟合,样本增加的时候调整参数也不能很好的拟合所有点,所以误差会变大;验证误差一开始就会很大,随着样本增多,会逐渐找到一个较为合适的参数使得误差变小。此时增加训练样本能使函数性能提升。


04. 下一步如何做


  • 当发现机器学习算法不能对数据进行很好的预测时,我们下一步可以按照具体情况这么做(在由上画出学习曲线之后做出是偏差还是方差过高问题之后):
  1. 训练更多样本(解决高方差)
  2. 尝试更少的特征(解决高方差)
  3. 增加特征(解决高偏差,高偏差往往是由函数过于简单造成)
  4. 增加多项式特征(解决高偏差)
  5. 降低lamda(解决高偏差)
  6. 增加lamda(解决高方差)
  • 神经网络调整
    结构简单的神经网络往往计算简单但是偏差较大;
    结构复杂的神经网络往往计算复杂,但是更好的拟合训练样本。
    要选择复杂度合适的神经网络。


编程作业

01


  • 要求利用水面的涨势来预测堤坝被冲毁的程度,要使用规则化求代价函数和梯度,以及实现数据曲线对函数性能进行判断,最后调整训练数据的个数调整合适的lamda。

02. LinearRegCostFunction.m


function [J, grad] = linearRegCostFunction(X, y, theta, lambda)

m = length(y); % number of training examples

% You need to return the following variables correctly
J = 0;
grad = zeros(size(theta));

% ====================== YOUR CODE HERE ======================
% Instructions: Compute the cost and gradient of regularized linear
% regression for a particular choice of theta.
%
% You should set J to the cost and grad to the gradient.
%

J = 1/(2m) * sum((Xtheta-y).^2) + lambda/(2m) * sum(theta.^2); % 计算包含惩罚项的误差函数
J = J - lambda/(2
m) * theta(1)^2; % 减去theta0的平方,不需要惩罚theta0

grad(1) = 1/m * sum((Xtheta-y)); % theta0的偏导
for i = 2:size(theta,1)
grad(i) = 1/m * sum((X
theta-y).*X(:,i)) + lambda/m * theta(i); % theta1-thetan的偏导
end

% =========================================================================

grad = grad(:);

end

03. LearningCurve.m


function [error_train, error_val] = ...
learningCurve(X, y, Xval, yval, lambda)
% error_train :训练误差向量
% error_val:验证误差向量
% X :样本数据矩阵,根据所需选择训练数据个数不等
% Xval:验证数据矩阵,固定个数
% ybal: 验证结果向量,固定个数
%

% 训练样本个数
m = size(X, 1);

error_train = zeros(m, 1);
error_val = zeros(m, 1);

% ====================== YOUR CODE HERE ======================
% Instructions: Fill in this function to return training errors in
% error_train and the cross validation errors in error_val.
% i.e., error_train(i) and
% error_val(i) should give you the errors
% obtained after training on i examples.
%
% Note: You should evaluate the training error on the first i training
% examples (i.e., X(1:i, :) and y(1:i)).
%
% For the cross-validation error, you should instead evaluate on
% the entire cross validation set (Xval and yval).
%
% Note: If you are using your cost function (linearRegCostFunction)
% to compute the training and cross validation error, you should
% call the function with the lambda argument set to 0.
% Do note that you will still need to use lambda when running
% the training to obtain the theta parameters.
%
% Hint: You can loop over the examples with the following:
%
% for i = 1:m
% % Compute train/cross validation errors using training examples
% % X(1:i, :) and y(1:i), storing the result in
% % error_train(i) and error_val(i)
% ....
%
% end
%

% ---------------------- Sample Solution ----------------------

n = size(Xval,1); % 验证样本个数
for i = 1:m
theta = trainLinearReg(X(1:i,:), y(1:i,:), lambda);
error_train(i) = 1/(2i) * sum((X(1:i,:)theta - y(1:i,:)).^2); % i个训练样本个数
error_val(i) = 1/(2n) * sum((Xvaltheta - yval).^2); % 验证样本个数
end

% -------------------------------------------------------------

% =========================================================================

end

04. validationCurve.m


function [lambda_vec, error_train, error_val] = ...
validationCurve(X, y, Xval, yval)
%选择不同lamda所得到的训练误差和验证误差
%

% Selected values of lambda (you should not change this)
lambda_vec = [0 0.001 0.003 0.01 0.03 0.1 0.3 1 3 10]';

% You need to return these variables correctly.
error_train = zeros(length(lambda_vec), 1);
error_val = zeros(length(lambda_vec), 1);

% ====================== YOUR CODE HERE ======================
% Instructions: Fill in this function to return training errors in
% error_train and the validation errors in error_val. The
% vector lambda_vec contains the different lambda parameters
% to use for each calculation of the errors, i.e,
% error_train(i), and error_val(i) should give
% you the errors obtained after training with
% lambda = lambda_vec(i)
%
% Note: You can loop over lambda_vec with the following:
%
% for i = 1:length(lambda_vec)
% lambda = lambda_vec(i);
% % Compute train / val errors when training linear
% % regression with regularization parameter lambda
% % You should store the result in error_train(i)
% % and error_val(i)
% ....
%
% end
%
%

m=size(X,1); %训练样本个数
n=size(Xval,1) %验证样本个数

for i=1:length(lambda_vec)
lambda=lambda_vec(i)
theta=trainLinearReg(X,y,lambda);
error_train(i)=1/(2m)sum((Xtheta-y).^2);
error_val(i)=1/(2
m)sum((Xvaltheta-yval).^2);
end

% =========================================================================

end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 以西瓜书为主线,以其他书籍作为参考进行补充,例如《统计学习方法》,《PRML》等 第一章 绪论 1.2 基本术语 ...
    danielAck阅读 4,486评论 0 6
  • 在《夫妻智慧》课程中,我的愿望是:半年使夫妻关系更加亲密,亲子关系更融洽。 现在过去 一个多月了,我每天会给...
    Qing爱家爱生活阅读 630评论 2 5
  • ——我们“班班共读”第二期活动坚持5天啦 这几天全员培训,一直在学习关于整本书阅读的课例和讲座。昨天的人教社王林老...
    Daisy虹阅读 443评论 0 1
  • 人生得以精进的“整理哲学” 第一,整理生活,才有规律。 第二,整理思绪,才有条理。 第三,整理心灵,才能安定。 第...
    彭红霞_a827阅读 103评论 0 0
  • 凤山有喜值欣贺, 山高海阔任咱跃。 有如春风沐细雨, 喜气洋洋又团聚。
    Jack2451阅读 149评论 0 0