Advertisement

Week2 An Introduction to Machine Learning(Part B)

阅读量:

目录

一、机器学习 (ML) 的不确定性

二、使用概率论测量不确定性(以投筛子为例,筛子可能不均匀)

三、Bootstrap-自助法(有放回重采样产生新数据)

四、贝叶斯方法在机器学习中的应用

五、KNN算法在逻辑回归中的应用例子(Tutorial)


一、机器学习 (ML) 的不确定性

1、不确定性的两大主要影响因素

(1)数据集里的噪点数据

(2)有限的数据集

2、概率论基础

(1)求和法则:

(2)连乘法则:

(3)贝叶斯理论:其中 p(x)称为归一化常量(也称标准化常量),其作用是为了确保所有条件概率之和不超过1 , p(y|x)被称为后验概率(Posterior probability), p(x|y)被称为似然比例度或似然函数(Likelihood ratio or likelihood function), p(y)被称为先验密度或边际密度分布函数值。

二、使用概率论测量不确定性(以投筛子为例,筛子可能不均匀)

1、数据集D

记第i次投筛子,正面朝上的概率为P(H) = w,则反面朝上的概率为P(T) = 1-w.

然而我们不了解w的具体数值,因此MLE方法被我们用来估计w

然而我们不了解w的具体数值 因此MLE方法被我们用来估计w

2、用MLE对参数w进行估计

因为数据集D的概率分布函数受变量w的影响,在计算过程中可以将其表示为p(D|w),并寻求其最大值

似然函数:(xi = H or T)

3、MLE估计存在的问题

参数w与之相关的计算显然与之相关的计算显然与之相关的计算显然与之相关的计算与之相关的信息密不可分

三、Bootstrap-自助法(有放回重采样产生新数据)

1、具体方法:

自助法(bootstrapping)是一种较为有效的解决方案;它直接以自举采样方法(bootstrap sampling)为基础。假设我们有一个包含m个样本的数据集D;通过自举采样方法生成数据集D:

(1)每次都随机选取原始数据集\mathcal{D}中的一个样本实例,并将其拷贝加入到原始数据集\mathcal{D}中去;接着再将该被选中的实例重新放回原始数据集\mathcal{D}中去;这样处理之后,在下一次采样时仍然有可能再次选中同一个实例;
(2)经过m次这样的操作后(其中m是一个预先设定好的参数),我们总共会生成一个新的包含了m个新样本的数据集\mathcal{D}';这就是自助采样的基础方法。

即通过自助采样,初始数据集D中约有36.8%的样本未出现在采样数据集D′中。

我们可以将D’视为训练集,并从数据集中排除掉所有属于D’的样本后剩余的部分作为测试集;通过这种设置方法,在实际应用中所建立的模型与理论上的预期模型均采用了m个相同的训练样本数量;同时由于我们在构建测试集时排除了所有已经在训练集中出现过的样本数据点,在这种情况下大约还有三分之一的数据并未被包含在训练集中,并用于后续的验证和评估工作;这样的验证结果通常被称为**"包外估计" (out-of-bag estimate)**

获取一个bootstrap sample步骤:

2、Bootstrap方法的优缺点

(1)优点:

  • 在数据样本稀缺的情况下难以精确分割训练与测试数据集时 ,自助法表现出显著的有效性 ;
    此外 ,通过初始数据集中采样有放回的方式生成若干个互不相同的训练样本集合 ,这对集成学习等方法而言具有重要的应用价值 ;
    由于我们仅需极小规模的样本数量来进行自举操作 ,因此所需的计算资源非常有限 。

(2)缺点:

通过自助法生成的数据集可能导致原始数据分布的变化, 从而产生估计偏差. 因此, 当初始样本数量充足时, 通常情况下优先采用留出法与交叉验证法.

3、Bootstrap方法具体实现(以KNN算法为例)-Tutorial

(1)Bootstrap实现代码:

复制代码
 # define a function that generates sample indixes based on bootstrap technique

    
 boot <- function (original.size=100, sample.size=original.size, times=100){
    
     indx <- matrix(nrow=times, ncol=sample.size)
    
     for (t in 1:times){
    
     indx[t, ] <- sample(x=original.size, size=sample.size, replace = TRUE)
    
     }
    
     return(indx)
    
 }

(2)KNN分类器代码:

复制代码
 # This is the KNN classifer that we implemented in Activity 1.1

    
  
    
 # define a function that calculates the majority votes (or mode!)
    
 majority <- function(x) {
    
    uniqx <- unique(x)
    
    uniqx[which.max(tabulate(match(x, uniqx)))]
    
 }
    
  
    
 # KNN function (distance should be one of euclidean, maximum, manhattan, canberra, binary or minkowski)
    
 knn <- function(train.data, train.label, test.data, K=3, distance = 'euclidean'){
    
     train.len <- nrow(train.data)
    
     test.len <- nrow(test.data)
    
     dist <- as.matrix(dist(rbind(test.data, train.data), method= distance))[1:test.len, (test.len+1):(test.len+train.len)]
    
     for (i in 1:test.len){
    
     nn <- as.data.frame(sort(dist[i,], index.return = TRUE))[1:K,2]
    
     test.label[i]<- (majority(train.label[nn]))
    
     }
    
     return (test.label)
    
 }
    
  
    
 # fix the parameters (50,40,50)
    
 K <- 30           # Maximum K for KNN 
    
 L <- 40           # number of datasets
    
 N <- 50          # size of datasets
    
  
    
 # generate bootstrap indices:
    
 boot.indx <- boot(nrow(train.data), N, L)
    
 head(boot.indx)
    
  
    
 # a dataframe to track the number of missclassified samples in each case
    
 miss <- data.frame('K'=1:K, 'L'=1:L, 'test'=rep(0,L*K))
    
 head(miss)
    
 dim(miss)#输出miss矩阵的维度大小=30*40和属性个数
    
  
    
  
    
 # THIS MAY TAKE A FEW MINUTES TO COMPLETE
    
 ## for every k values:
    
 for (k in 1: K){
    
     
    
     ### for every dataset sizes:
    
     for (l in 1:L){
    
     
    
     #### calculate iteration index i
    
     i <- (k-1)*L+l
    
     
    
     #### save sample indices that were selected by bootstrap
    
     indx <- boot.indx[l,]
    
     
    
     #### save the value of k and l
    
     miss[i,'K'] <- k
    
     miss[i,'L'] <- l
    
     
    
     #### calculate and record the train and test missclassification rates
    
     miss[i,'test'] <-  sum(knn(train.data[indx, ], train.label[indx], test.data, K=k)  != test.label)/nrow(test.data)*100
    
     } 
    
 }

(3)以K值为横坐标,错误率为为纵坐标画出箱线图:

复制代码
 ggplot(data=miss.m[miss.m$type=='test',], aes(factor(K), miss,fill=type)) + geom_boxplot(outlier.shape = NA)  +

    
     scale_color_discrete(guide = guide_legend(title = NULL)) + 
    
     ggtitle('Missclassifcation vs. K (Box Plot)') + theme_minimal()
    
 # ignore the warnings (because of ignoring outliers)
    
 options(warn=-1)

我们不难发现:

a、当K值逐步增加时,箱线图的范围也随之扩大,并且相应的测试误差和不确定性也会相应增大。
b、在保持N值恒定的情况下,调节L的数值时观察到箱线图的变化幅度较小。
c、当保持L值不变并逐步增加N值时,测试误差随之减小且模型性能显著提升。

注意:L(数据集的个数)N(数据集的大小)

四、贝叶斯方法在机器学习中的应用

1、内容:

2、用贝叶斯方法对模型w进行估计的步骤:

若p(w = x)为概率密度函数,则有:

3、以上面投筛子为例通过贝叶斯方法求解先验概率p(w)

p(正面朝上-Heads) = w, p(反面朝上-Tails) = 1-w,下面我们将对参数w进行估计

(1)在这之前需要先了解什么是Beta函数:

这就是Beta函数:

数学期望:

注:a-1次Heads,b-1次Tails

三角函数的表述形式:

Beta的分布函数:

在数据集D中定义a−1为正面出现的次数以及b−1为反面出现的次数。因此总共进行了(a + b − 2)次试验。从而建立了关于先验概率p(w)、Beta函数以及最大似然估计(MLE)之间的联系。

即p(w)正比于Beta函数正比于MLE

(3) 由(2)中的关系我们可以衍生到贝叶斯方法:

|H|表示Heads出现的次数,|T|表述Tails出现的次数

(4)通过数据集D来估计参数w,并预测下一次投筛子正面朝上的概率-P(H|D)

由于H和w都是依靠数据D产生的,所以我们得到如下结构:

c = D,a = H, b = w,由common effect可知,H和w关于D条件独立 (下面p(H|w,D) = p(H|w)的由来)

所以我们可以得到:p(H,w,D) = p(D)*p(w|D)*p(H|w,D)=p(D)*p(w|D)*p(H|w)

所以p(H,w|D) =

rac{p}{p}

=p(H|w)*p(w|D)

0,1

0,1

0,1

P(H|w) 表示给定参数 w 时正面出现的概率, 即有 P(H|w)= w, 其中 |H| 表示下次出现正面的可能性

**所以P(H|D) = E(w|D) =

rac{a+1}{a+b+1}

.**

注:一共投出a-1次Heads,b-1次Tails

五、K-近邻算法应用于逻辑回归领域中的实践案例(教学内容)

基于ID=11(年龄为38岁、身高为5.5米)的基础上,将与之距离较近的数据划分为K组;随后计算出与之距离最近的前K个数据中的体重要值,并取其平均数作为预测结果。

全部评论 (0)

还没有任何评论哟~