斯坦福大学《Machine Learning》第6周学习笔记

Advice for Applying Machine Learning应用机器学习的建议

Evaluating a Learning Algorithm评估学习算法

Deciding What to Try Next 决定接下来要做什么

假如你在开发 一个机器学习系统 或者想试着改进 一个机器学习系统的性能 你应如何决定?   

使用 预测房价的学习例子 假如你已经完成了正则化线性回归 也就是最小化代价函数J的值 假如 在你得到你的学习参数以后 如果你要将你的假设函数 放到一组新的房屋样本上进行测试 假如说你发现在预测房价时 产生了巨大的误差   现在你的问题是 要想改进这个算法 接下来应该怎么办?   

方法一:使用更多的训练样本 

方法二:尝试选用更少的特征集

方法三:……

我们列出以上的优化单子 每一种尝试都可能会花费你大量的时间和精力,大多数人用来选择这些方法的标准 是凭感觉的  但是最后的结果却很糟糕,因此我们希望在花费大量时间完成这些工作之前 我们就能知道其效果如何

  

幸运的是 有一系列简单的方法 能让你事半功倍 排除掉单子上的 至少一半的方法 留下那些确实有前途的方法 同时也有一种很简单的方法 只要你使用 就能很轻松地排除掉很多选择   从而为你节省 大量不必要花费的时间  

它们被称为"机器学习诊断法"   “诊断法”的意思是 这是一种测试法 你通过执行这种测试 能够深入了解 某种算法到底是否有用 这通常也能够告诉你 要想改进一种算法的效果 什么样的尝试才是有意义的 这些诊断法的执行和实现通常也是需要花费很多时间 但是它们是值得的

Evaluating a Hypothesis 评估一个假设

下面介绍怎样用你学过的算法来评估假设函数 并以此为基础来 讨论如何避免 过拟合和欠拟合的问题 

当我们确定学习算法的参数的时候 我们考虑的是选择参量来使训练误差最小化 但是过拟合假设函数并不是好事 那么该如何判断一个假设函数是过拟合的呢?

特征变量只有一个的时候 我们可以 对假设函数 h(x) 进行画图 然后观察图形趋势 但对于特征变量很多的这种一般情况 想要通过画出假设函数来进行观察 就会变得很难甚至是不可能实现 因此 我们需要另一种方法来评估我们的假设函数 如下给出了一种评估假设函数的标准方法 

假设我们有一组数据组 为了确保我们可以评估我们的假设函数 我们要做的是 将这些数据分成两部分 训练集和测试集 其中一种典型的分割方法是 按比例 7:3划分 如果这组数据有某种规律或顺序的话 要随机选择 

你通过以下步骤训练和测试你的学习算法 首先对70%的训练集进行学习得到参数θ 也最小化训练误差J(θ) 然后通过30%的测试集来计算出测试误差来评估你的学习算法,以上左边是线性回归问题,右边是逻辑回归问题,它们有个不同就是,逻辑回归问题在计算出测试误差的时候,不再是使用代价函数,而是使用叫误分类率 也被称为0/1错分率的方式 0/1表示了 你预测到的正确或错误样本的情况

Model Selection and Train/Validation/Test Sets模型选择和训练/验证/测试集

假如你想要确定对于某组数据 最合适的多项式次数是几次 怎样选用正确的特征来构造学习算法 或者假如你需要正确选择 学习算法中的正则化参数λ 你应该怎样做呢? 这些问题我们称之为模型选择问题 在我们对于这一问题的讨论中 我们还将提到 如何将数据分为三组 也就是训练集、验证集和测试集 而不仅仅是前面提到的两组数据 

我们先来考虑模型选择问题 假如说你现在要选择能最好地拟合你数据的多项式次数 换句话说 你应该选择一次函数 二次函数 还是三次函数呢 等等一直到十次函数 这里用 d 来表示你应该选择的多项式次数  所以除了你要确定的参数θ之外 你还要考虑确定一个参数d  第一个选择是 d=1 也就表示线性(一次)方程 我们也可以选择d=2或者3 等等一直到d=10 因此 我们想确定这个多出来的参数d最适当的取值 

具体地说 比如你想要选择一个模型  那就从这10个模型中 选择一个最适当的多项式次数 并且用这个模型进行估计 预测你的假设能否很好地推广到新的样本上 那么你可以这样做 你可以先选择第一个模型 然后求训练误差的最小值 这样你就会得到一个参数向量θ 然后你再选择第n个模型 n次函数模型  进行同样的过程 这样你会得到另一个参数向量 θ 为了区别这些不同的 参数向量θ 我想用上标(1) 上标(2)来表示 这里的上标(n)表示的是 在调整第n个模型  也就是n次函数在和训练数据拟合的过程中得到的参数 

接下来我们要做的是 对所有这些模型 求出测试集误差 因此 我可以算出 Jtest(θ(1))  Jtest(θ(2)) Jtest(θ(3)) 以此类推 也就是对于每一个模型对应的假设 都计算出其作用于测试集的表现如何 接下来为了确定选择哪一个模型最好 我要做的是   看看这些模型中 哪一个对应的测试集误差最小  那么对于这一个例子 我们假设最终选择了五次多项式模型 

这里有一个问题是 这样做不能公平地说明 我的假设推广到一般时的效果 其原因在于 我们刚才是使用的测试集 跟假设拟合 来得到的 多项式次数d 这个参数 这也就是说 我们选择了一个 能够最好地拟合测试集的 参数d的值 因此 我们的参数向量θ(5) 在拟合测试集时的结果  很可能导致一个比实际泛化误差更完美的预测结果 

同样用训练集来拟合得出的参数d 也不能较为公平地预测出 假设函数的在遇到新样本时的表现 为了解决这一问题 在模型选择中 如果我们想要评价某个假设 我们通常采用以下的方法 

给定某个数据集 将其分为三段 第一部分还是叫训练集 所以 我们还是称这部分为训练集 第二部分我把它叫做交叉验证集(cross validation set)用CV来简写“交叉验证” 有时候也直接叫验证集 不叫交叉验证集 最后一部分依然和以前一样是测试集 同时 一种典型的分割比例是 60%的训练集 20%的交叉验证集 20%的测试集 这个比例可以稍微调整 但这种分法是最典型的 

我们还是有这样一些测试集样本  那么我们的模型选择问题是这样的 和之前使用测试集来选择模型不同 我们现在要使用验证集来选择模型 也就是选择使得Jcv最小的那个假设 假设四次函数的模型有最小的交叉验证误差 也就是说拟合出最好的系数d等于4 并且我们是通过交叉验证集来完成的 因此 这样一来这个参数d 这个多项式的次数 就没有跟测试集进行拟合 这样我们就回避了测试集的嫌疑 我们可以光明正大地使用测试集 来估计所选模型的泛化误差了 好的 这就是模型选择了 

Bias vs. Variance偏差与方差

Diagnosing Bias vs. Variance诊断偏差与方差

本节要点:如何区分过拟合(高方差)和欠拟合(高偏差),从而来指导改进学习算法的多项式次数

当你运行一个学习算法时 如果这个算法的表现不理想 那么多半是出现 两种情况 要么是偏差比较大 要么是方差比较大 换句话说 出现的情况要么是欠拟合(高偏差)  要么是过拟合(高方差) 那么这两种情况 哪个和偏差有关 哪个和方差有关 或者是不是和两个都有关 搞清楚这一点非常重要 因为能判断出现的情况 是这两种情况中的哪一种 其实是一个很有效的指示器 指引着可以改进算法的 最有效的方法和途径

 

上面我们来画出如下这个示意图 横坐标上表示的是 多项式的次数  我们把训练集误差Jtrain 和交叉验证集误差Jcv

### 使用 MATLAB 绘制两组数据 在 MATLAB 中绘制两组或多组数据可以通过多种方式完成,具体取决于所需展示的数据特征以及期望的可视化效果。下面介绍几种常见的方法来处理并呈现两组数据。 #### 方法一:在同一坐标轴上叠加显示两个曲线图 当希望比较同一变量随不同条件变化的趋势时,可以考虑在一个图表内重叠画出两条线。这种方式直观易懂,便于观察两者之间的关系。 ```matlab % 假设有如下两组数据 dataSetA = rand(1, 10); % 随机生成一组测试数据作为第一组数据 dataSetB = rand(1, 10) .* linspace(0.5, 2, length(dataSetA)); % 另外一组具有某种关联性的随机数列 figure; hold on; plot(dataSetA, '-o', 'DisplayName', 'Data Set A'); % 绘制第一条折线,并设置样式标记和名称标签 plot(dataSetB, '--s', 'DisplayName', 'Data Set B'); % 同样地为第二条折线指定不同的线条风格与节形状 xlabel('Index'); ylabel('Value'); title('Two Data Sets Plotted Together'); legend show; % 显示图例说明各条线代表哪组数据 hold off; ``` 此段代码创建了一个新的图形窗口,在其中同时展示了 `dataSetA` 和 `dataSetB` 的趋势走向[^1]。 #### 方法二:利用子图功能分开独立展现每组数据 如果担心单张图片难以清晰表达复杂的信息,则可以选择采用多面板布局的方式分别描绘各个系列的内容。通过调整参数 m,n,p 来控制划分的数量及位置安排。 ```matlab subplot(1, 2, 1); bar(dataSetA); title('Bar Chart of DataSet A'); subplot(1, 2, 2); scatter(dataSetB, dataSetA.^2, [], 'filled'); title('Scatter Plot Between DataSet B and Squared Values of DataSet A'); ``` 上述例子中先定义了由一行两列构成的小格网状结构,再依次填充对应的统计图表形式——柱状图用于表现离散数值大小;而散图则有助于揭示潜在的相关模式[^4]。 #### 方法三:结合误差棒图评估不确定性范围内的差异情况 对于实验测量类别的研究对象而言,往往还需要考虑到观测值本身的波动区间。此时引入带有上下限指示器(即所谓的“误差棒”)能够更加全面准确地反映实际状况下的区别程度。 ```matlab errorBarsForA = std(dataSetA)*ones(size(dataSetA))/sqrt(numel(dataSetA)); errorBarsForB = std(dataSetB)*ones(size(dataSetB))/sqrt(numel(dataSetB)); figure(); errorbar((1:length(dataSetA)), dataSetA, errorBarsForA, '.-', ... 'MarkerSize', 8,... 'LineWidth', 1.5,... 'Color','b',... 'DisplayName','DataSet A with Error Bars'); hold on; errorbar((1:length(dataSetB))+0.2, dataSetB, errorBarsForB, '+-.r',... 'MarkerSize', 8,... 'LineWidth', 1.5,... 'DisplayName','DataSet B with Error Bars'); xlim([min(min(dataSetA), min(dataSetB))-1 max(max(dataSetA), max(dataSetB))+1]); ylim([-max(errorBarsForA, errorBarsForB)-0.1 max(dataSetA)+max(errorBarsForA)+0.1]); xlabel('Sample Index'); ylabel('Measured Value ± Standard Deviation'); title('Comparison Using Error Bar Charts'); legend show; grid minor; hold off; ``` 这段脚本不仅实现了基本的功能需求,还进一步优化了视觉效果,比如设置了合理的颜色区分度、增加了网格辅助阅读等细节之处。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值