k检验 机器学习_机器学习 如何检验模型好坏,并如何依据检测结果进行模型调整 - CSDN
  • 机器学习之模型检验

    2018-02-13 11:41:43
    模型检验的目的随着学习算法种类,特征转换方式,正则化方式等等的增加,在不同的组合之下我们就会得到种类非常多的学习模型。而在实务上我们通常想要的就是那个Eout最小的模型,所以我们在面临众多的学习模型的时候...

    模型检验的目的

    随着学习算法种类,特征转换方式,正则化方式等等的增加,在不同的组合之下我们就会得到种类非常多的学习模型。而在实务上我们通常想要的就是那个Eout最小的模型,所以我们在面临众多的学习模型的时候需要作出选择,而模型检验结果的好坏正是我们作出选择的依据。下图为一个学习模型的不同组成方式:


    模型选择问题

    通过Eout选择模型?

    这是不可行的。我们希望在得到的模型中选择一个做的最好的模型g要使得它的Eout变得很小,但是在机器学习的一开始就讲Eout是不可知的所以我们没有办法去通过Eout去选择一个模型。

    通过视觉去选择模型?

    这也是不可行的。①我们的视觉只能检查低维度的模型分割情况高维度的我们难以想象 。②我们在选择模型的时候用到了自己的的大脑这不是机器学习这是人脑学习在数据量大的时候将不靠谱。

    通过Ein去选择模型?

    这也是不可行的。①单纯的通过Ein去选择模型会出现过拟合的现象。②Ein的选择会带来模型复杂度的增大。每一个Ein最小的模型都是来自于不同的假设集合。比如对于一个具体的问题,演算法A1在假设集合H1中得到的最优模型是g1,演算法A2在假设集合H2中得到的最优模型是g2,当我们从g1和g2中选择一个最优解的时候我们已经付出了H1∪H2的复杂度。③我们用做出Ein最低的资料去训练然后又用相同的资料做测试这样的结果毫无意义。

    通过测试资料去选择模型?

    这也是不可行的。① 乍一看我们可以通过测试资料的检测拿到去选择犯错误低的模型,但是我们在测试的时候由于我们使用了测试的资料做训练所以这些测试资料早就受到了污染所以我们的检测结果毫无意义!我们做了一件自欺欺人的事情。②事实上我们根本拿不到测试资料。

    测试的方法

    在遭受到以上问题的困扰下我们决定使用一种新的策略它满足以下几点。

    ①我们的测试资料是没有经过污染的(测试资料不用来做训练)。

    ②我们的测试资料不能从外界额外的获取。

    所以我们将以前全部用来训练的资料分割一步分出来,这样的话我们就能够在上述条件下得到模型的测试。

    测试集

    测试集要求

    无论是训练还是面对实务上的数据我们遇到的资料都是独立同分布的,所以我们的测试集也需要在以前的训练集上进行独立同分布的抽样获取。

    测试集的VC保障


    假设我们总共有N笔资料其中的K笔用来做测试N-K笔资料用来做训练,现在训练出来的模型为g- 。现在要从有限多个假设模型中通过测试资料去选择一个最佳的模型g-会得到如下保证:


    这就是我们在有限多个h(x)的情况下霍夫丁不等式的保证。

    测试后的优化

    在以前的学习中我们知道了在其它条件不变的情况下增大数据量N的时候会使得Eout减小。得益于这个结论我们将N-K笔资料训练出来且Eval(测试错误)最小的g-再次丢到整个资料N中进行训练我们会得到更为精确地g。测试的流程图与保障如下:

    模型测试在实务上的表现

    ①只是经过样本训练没有进行测试的K永远为0,所以它犯的错误不会因为K的变化而改变。同时有较高的Eout。

    ②通过测试资料来训练的K永远为0,所以它犯的错误不会因为K的变化而改变。在但是由于它已经看过了测试资料所以会表现的很好,但是这种做法是不可能的(所以为虚线)。

    ③经过N-K笔资料训练过的同时经历了K笔资料验证的会随着K的变化而变化,在K较小的时候Eout会表现的较好。

    ④经过③步骤的筛选之后又经过全部资料的训练之后的模型表现的最好。

    测试集的大小

    通过上图我们会发现在K很大的时候由于训练集数据太小不足以训练一个合格的模型所以g-会很差,但是由于测试集较大所以测试的结果够准确这时Eval(g-)≈Eout(g-)。当K很小的时候我们的训练集的资料较多,会训练出更加准确的模型这时g-会更好一些,但是由于测试集较小所以测试的结果与实际结果会相差很远。如下图:

    在实务上K=N/5是一个不错的选择。

    Leave One Out 检测法

    leave one out的定义

    在上述的例子中我们很难平衡K的大小,所以我们启用leave one out的检测法。该算法是指在所有的资料中依次拿出每一笔资料来作为验证资料(既K=1)最后按照模型在每一笔验证资料上犯错误的平均值的大小选择模型的检测方法。也称之为去1交叉验证法。


    上图中en就是模型在第n笔资料作为验证资料的所犯的错误,Eloocv就是模型在这笔资料上交叉验证的平均错误。我们希望的是

    Eloocv≈Eout。

    leave one out的错误衡量

    在不同的错误衡量下我们会得到不同的Eloocv下图为两个例子:


    在上图中使用的资料是同一个样本,上方的三幅图在较差验证的时候使用的是平方错误验证,而下方的图使用的常数的错误衡量。很显然Eloocv(linear)>Eloocv(constant)而我们会选择Eloocv的最小的那个错误衡量

    leave one out理论上的保证


    通过一系列的计算我们会得到Eloocv的期望值与交叉验证的Eout(N-1)的平均值相同。

    leave one out实务上的表现


    在实务上loocv会有效的避免过拟合通常会做出一个平滑的曲线来。


    在错误检测方面会与Eout有很高的相似性。

    Cross Validation

    loocv遇到的问题

    ①整个过程的计算量十分大,如1000样本容量下我们的loocv会有1000次的训练与1000次的校验。

    ②整个过程中由于每次都在单个点上做错误的衡量,会出现错误曲线的波动明显不够稳定。

    loocv的改进

    我们不在将1000样本容量的样本分成是1000份而是分成V份(比如说是10份)。依次拿每一份当做是验证资料来进行交叉验证进而选择最好的模型。如下图:

    这样会使得我们的运算量减小,我们的错误曲线更为稳定而且效率还不错。顺便指出在平常的交叉验证中通常将资料分为10份来进行交叉验证。

    validation的选择

    ①cross validation在实际上一般比单次的validation要做的好,但是要付出大量计算的代价。如果再计算允许的情况下一般使用corss validation。

    ②在一般情况下5分cv或者是10分的cv就已经会得到很好的模型检测效果了所以一般不会使用loocv来做检测。

    validation其他的一些细节

    ①如果说Ein是初赛的结果(从不同的假设集合中分别选择出Ein最小的模型),那么Eval就是复赛的结果(从已经选好的几个模型中再次选拔)。

    ②通过validation选择出来的模型从犯错误的结果上来看相比真正的测试的时候还是较为乐观的,毕竟所有的资料都当过训练资料与测试资料。




    展开全文
  • 机器学习实战2--K近邻

    2016-02-24 15:59:01
    本博客基于机器学习实战这本书,主要是对机器学习的算法原理及python实现进行详细解释,若是有些没有阐述清楚的,看到的请指出。 第二章的K近邻算法是一个简单的机器学习算法。 K近邻算法: 原理:收集一个样本...

    本博客基于机器学习实战这本书,主要是对机器学习的算法原理及python实现进行详细解释,若是有些没有阐述清楚的,看到的请指出。
    第二章的K近邻算法是一个简单的机器学习算法。
    K近邻算法:
    原理:收集一个样本数据集合,并且样本集中每个数据都存在标签。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。选择样本数据集中前K个最相似的数据,这就是K近邻算法中K的出处,通常k是不大于20的整数。选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
    算法实现:新建一个kNN.py文件
    1. 导入数据

    #-*- coding: utf-8 -*-  #表示使用这个编码
    from numpy import * #导入科学计算包NumPy,没安装赶紧百度安装
    import operator  #运算符模块,k近邻算法执行排序操作时将使用这个模块提供的函数
    import pdb   #在Python交互环境中启用调试
    from os import listdir # os 模块包含了许多对目录操作的函数 listdir 函数返回给定目录下的所有文件
    def createDataSet():#定义一个函数,创建数据集和标签
        group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
        labels = ['A','A','B','B']
        return group,labels

    保存后import kNN
    group,labels = kNN.createDataSet(),然后就可以得到group,labels

    1. 具体的kNN算法:
      思想:计算已知类别数据集中的点和当前点之间的距离;
      按照距离递增次序排序;
      选取与当前点距离最小的k个点;
      确定前k个点所在类别的出现频率;
      返回前k个点出现频率最高的类别作为当前点的预测分类。
     def classify0(inX,dataSet,labels,k):#inX是测试向量,dataSet是样本向量,labels是样本标签向量,k用于选择最近邻居的数目
        dataSetSize = dataSet.shape[0] #得到数组的行数。即知道有几个训练数据,0是行,1是列
        diffMat = tile(inX,(dataSetSize,1)) - dataSet #tile将原来的一个数组,扩充成了dataSetSize个一样的数组。diffMat得到了目标与训练数值之间的差值。
        sqDiffMat = diffMat**2 #各个元素分别平方
        sqDistances = sqDiffMat.sum(axis=1) #就是一行中的元素相加
        distances = sqDistances**0.5#开平方,以上是求出测试向量到样本向量每一行向量的距离
        sortedDistIndicies = distances.argsort()#对距离进行排序,从小到大
        classCount={}#构造一个字典,针对前k个近邻的标签进行分类计数。
        for i in range(k):
                voteIlabel = labels[sortedDistIndicies[i]]  
                classCount[voteIlabel] = classCount.get(voteIlabel,0)+1#得到距离最小的前k个点的分类标签
        sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True)#对classCount字典分解为元素列表,使用itemgetter方法按照第二个元素的次序对元组进行排序,返回频率最高的元素标签,计数前k个标签的分类,返回频率最高的那个标签
        return sortedClassCount[0][0]

    这样就可以使用该程序进行数据预测了。
    kNN.classify0([0,0],group,labels,3)输出结果为B。

    1. 测试kNN算法
      这个测试是作者提供的文本文件,先解析文本,画二维扩散图,kNN不用进行训练,直接调用文本数据计算k近邻就可以。
      将文本记录转换为NumPy的解析程序
    def file2matrix(filename):#将文本记录转换成numpy的解析程序
        fr = open(filename) #这是python打开文件的方式
        arrayOLines = fr.readlines()#自动将文件内容分析成一个行的列表
        numberOfLines = len(arrayOLines)#得到文件的行数
        returnMat = zeros((numberOfLines,3))
        classLabelVector = []
            enumLabelVector = []
        index = 0
        for line in arrayOLines:
                line = line.strip()#截掉所有的回车符
                listFromLine = line.split('\t')#使用tab字符\t将上一步得到的整行数据分割成元素列表
                returnMat[index,:] = listFromLine[0:3]#选取前三个元素存储到特征矩阵中
                classLabelVector.append(listFromLine[-1])#用-1表示最后一列元素,把标签放入这个向量中
                if cmp(listFromLine[-1],'didntLike')==0:
                    enumLabelVector.append(1)
                elif cmp(listFromLine[-1],'smallDoses')==0:
                    enumLabelVector.append(2)
                elif cmp(listFromLine[-1],'largeDoses')==0:
                    enumLabelVector.append(3)
                    index += 1
            return returnMat,enumLabelVector #返回数据矩阵和标签向量

    可以使用reload(kNN)
    datingDataMat,datingLabels = kNN.file2matrix(‘datingTestSet.txt’)得到数据矩阵和标签向量。

    1. 使用Matplotlib制作原始数据的散点图
    fig = plt.figure()
    ax = fig.add_subplot(131)
    ax.scatter(datingDataMat[:,1],datingDataMat[:,2])
    ax = fig.add_subplot(132)
    ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(vector),15.0*array(vector))
    ax = fig.add_subplot(133)
    ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(vector),15.0*array(vector))
    plt.show()

    这里写图片描述

    1. 在计算KNN距离时,若某一列的数值远大于其他列, 那这一列对计算距离时的影响最大。将数据归一化,每一列的数据取值范围处理为0-1之间,这样每一列的数据对结果影响都一样。
      归一化特征值:
    def autoNorm(dataSet):
        minVals = dataSet.min(0)#获得最小值,(0)是从列中获取最小值,而不是当前行,就是每列都取一个最小值
        maxVals = dataSet.max(0)#获得最大值
        ranges = maxVals - minVals#获得取值范围
        normDataSet = zeros(shape(dataSet))#初始化新矩阵
        m = dataSet.shape[0]#获得列的长度
        normDataSet = dataSet - tile(minVals,(m,1))#特征值是1000×3,而最小值和范围都是1×3,用tile函数将变量内容复制成输入矩阵一样大小的矩阵
        normDataSet = normDataSet/tile(ranges,(m,1))#/可能是除法,在numpy中,矩阵除法要用linalg.solve(matA,matB).
        return normDataSet,ranges,minVals
    1. 将数据集分为测试数据和样本数据
    def datingClassTest():
        hoRatio = 0.10
        datingDataMat,datingLabels = file2matrix('datingTestSet.txt')#读取文件中的数据并归一化
        normMat,ranges,minVals = autoNorm(datingDataMat)
        m = normMat.shape[0]#新矩阵列的长度
        numTestVecs = int(m*hoRatio)#代表样本中哪些数据用于测试
        errorCount = 0.0#错误率
        for i in range(numTestVecs):
            classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)#前m×hoRatio个数据是测试的,后面的是样本
            print "the calssifier came back with: %d,the real answer is:%d" %(classifierResult,datingLabels[i])
            if(classifierResult != datingLabels[i]):
                errorCount += 1.0
        print "the total error rate is: %f" %(errorCount/float(numTestVecs))#最后打印出测试错误率
    1. 构建预测函数,输入信息得到预测标签
    #输入某人的信息,便得出对对方喜欢程度的预测值  
    def classifyPerson():
        resultList = ['not at all', 'in small doses', 'in large doses'] 
        percentTats = float(raw_input("percentage of time spent playing video games?"))#输入  
        ffMiles = float(raw_input("frequent flier miles earned per year?"))  
        iceCream = float(raw_input("liters of ice cream consumed per year?"))  
        datingDataMat, datingLabels = file2matrix('datingTestSet.txt') #读入样本文件,其实不算是样本,是一个标准文件 
        normMat, ranges, minVals = autoNorm(datingDataMat)#归一化
        inArr = array([ffMiles, percentTats, iceCream])#组成测试向量
    #    pdb.set_trace()#可debug
        classifierResult = classify0((inArr-minVals)/ranges, normMat, datingLabels,3)#进行分类
    #    return test_vec_g,normMat,datingLabels
        print 'You will probably like this person:', resultList[classifierResult - 1]#打印结果

    在python下输入kNN.classifyPerson(),输入某人的信息,就可以得到该人的标签。
    8.手写识别系统的示例:
    收集数据时,要将手写的字符图像转换成向量。

    def img2vector(filename):
        returnVect = zeros((1,1024))#初始化一个向量
        fr = open(filename)#打开文件
        for i in range(32):
            lineStr = fr.readline()#读入每行向量
            for j in range(32):
                returnVect[0,32*i+j] = int(lineStr[j])#把每行的向量分别赋值给初始化向量
        return returnVect#返回向量

    将数据处理成分类器可以识别的格式后,将这些数据输入到分类器,检测分类器的执行效果。

    def handwritingClassTest():
        hwLabels = []
        trainingFileList = listdir('trainingDigits')# 得到目录下所有文件的文件名
        m = len(trainingFileList)#得到目录下文件个数
        trainingMat = zeros((m,1024))
        for i in range(m):
            fileNameStr = trainingFileList[i]#对文件名进行分解可以得到文件指的数字
            fileStr = fileNameStr.split('.')[0]
            classNumStr = int(fileStr.split('_')[0])
            hwLabels.append(classNumStr)#把标签添加进list
            trainingMat[i,:] = img2vector('trainingDigits/%s' %fileNameStr)#把所有文件都放在一个矩阵里面
        testFileList = listdir('testDigits')
        errorCount = 0.0
        mTest = len(testFileList)
        for i in range(mTest):
            fileNameStr = testFileList[i]
            fileStr = fileNameStr.split('.')[0]
            classNumStr = int(fileStr.split('_')[0])
            vectorUnderTest = img2vector('testDigits/%s' %fileNameStr)#得到一个向量
            classifierResult = classify0(vectorUnderTest,trainingMat,hwLabels,3)#对向量进行k近邻测试
            print "the classifier came back with: %d the real answer is %d" %(classifierResult,classNumStr)
            if(classifierResult != classNumStr):errorCount += 1.0
        print "\nthe total number of errors is: %d" %errorCount#得到错误率
        print "\nthe total error rate is: %f" %(errorCount/float(mTest))

    使用kNN.handwritingClassTest()测试该函数的输出结果,依次测试每个文件,输出结果,计算错误率,因为分类算法不是绝对的,只是一个概率问题,所以对每一组数据都有错误率。

    至此,第二章基本阐述完毕,k近邻算法是分类数据最简单有效的算法,使用算法时,我们必须有接近实际数据的训练样本数据。k近邻算法必须保存全部数据集,如果训练数据集很大的话,必须使用大量的存储空间。
    优点:精度高,对异常值不敏感,无数据输入假定
    缺点:nisan复杂度高,空间复杂度高。
    适用数据范围:数值型和标称型。

    代码地址:ch2–k近邻python算法实现

    展开全文
  • 机器学习中的比较检验前言假设检验 前言   在前文中,我们了解了实验模型的评估方法和性能度量,看起来就能够对学习器进行评估比较了:先使用某种评估方法测得学习器的某个性能度量结果,然后对这些结果进行比较...

    机器学习中的假设检验

    前言

      在前文中,我们了解了实验模型的评估方法和性能度量,看起来就能够对学习器进行评估比较了:先使用某种评估方法测得学习器的某个性能度量结果,然后对这些结果进行比较。那么如何作比较呢?是直接取得性能度量的值然后比“大小”吗?但实际上没有这么简单,因为我们希望比较的是泛化性能,但通过实验的方法我们能获得的只是测试集上的性能,两者未必相同,其次,由于测试集选择的不同,测试集上的性能也未必相同,第三,很多机器学习算法本身具有一定的随机性,即使是同一个算法,因为参数设置的不同,产生的结果也不同。那么有没有合适的方法去比较学习器的性能呢?

    假设检验

      统计假设检验能够为我们进行学习器性能比较提供依据,基于假设检验的结果,可以推断出,如果在测试集上观察到学习器A比B好,则A的泛化性能是否优于B,以及这个结论的把握有多大。下面先来看看两种最基本的假设检验。
      假设检验中常以错误率为性能度量,用 ε 表示,“假设”是对学习器泛化错误率分布的某种判断和猜想,现实中我们无法获得泛化错误率,只能获知测试错误率 ε’,两者之间接近的可能性比较大,相差很远的可能性比较小。
      泛化错误率为ε的学习器在一个样本上犯错的概率是ε,测试错误率ε’意味着在m个测试样本中恰好有m × ε’个被错误分类,假设测试样本是从样本总体分布中独立采样取得的,那么泛化错误率为ε的学习器将其中m’个样本误分类,其余样本全部正确分类的概率为:

    (mm)ϵm(1ϵ)mϵ×m\begin{pmatrix} m \\ m' \\ \end{pmatrix}\epsilon^{m'}(1-\epsilon)^{m-\epsilon\times{m}}

    由此可以估算出恰好将m × ε’个样本误分类的概率如下,这也表达了在包含m个样本的测试集上,泛化错误率为ε的学习器被测得测试错误率为ε’的概率。

    P(ϵ;ϵ)=(mϵ×m)ϵϵ×m(1ϵ)mϵ×mP(\epsilon';\epsilon) = \begin{pmatrix} m \\ \epsilon'\times{m} \\ \end{pmatrix}\epsilon^{\epsilon'\times{m}}(1-\epsilon)^{m-\epsilon'\times{m}}

    给定测试错误率,则解得P(ε’;ε)在ε = ε’时最大,|ε-ε’|的绝对值增大时,P(ε’;ε)减小,这符合二项分布
    在这里插入图片描述
      我们可以使用二项检验来对“ε<=0.3”这样的假设进行检验,或者更一般的,考虑假设“ε <= ε0”,则在1 - α的概率内所能观察到的最大错误率如下式,这里的1-α反映了结论的“置信度”。直观地来看,对应上面的柱状图中阴影部分的范围。
    $$

    Tips: s.t. 的意思是subject to ,即左边的式子在右边满足条件时成立。
    

      这个时候如果测试错误率小于临界值,则根据二项检验可以得出结论:在α的显著度下,假设“ε <= ε0”不能被拒绝,即能以1-α的置信度认为,学习器的泛化错误率不大于ε0;否则该假设可以被拒绝,即α的显著度下,可认为学习器的泛化错误率大于ε0。
      在多数情况下我们并不是只做一次留出法估计,而是通过多次重复留出法或者是交叉验证法多次训练、测试,这样就会得到多个测试错误率,此时可以使用“t检验”。假设我们得到了k个测试错误率,则平均测试错误率和方差分别为
    在这里插入图片描述
      考虑到这k个测试错误率可以看做是ε0的独立采样,则变量
    在这里插入图片描述
    服从自由度为k-1的t分布,如下图
    在这里插入图片描述
      对假设“μ=ε0”和显著度α,我们可以计算出测试错误率均值为ε0时,在1 - α概率内能观测到的最大错误率,即临界值。这里考虑双边假设,上图中两边阴影部分各有α/2的面积;假设阴影部分范围分别为(-∞,-α/2],[α/2,∞)。如果平均错误率μ与ε0之差|μ-ε0|位于临界值范围[-α/2,α/2]内,则不能拒绝假设“μ=ε0”,即可认为泛化错误率为ε0,置信度为1 -α,否则可拒绝该假设。

    展开全文
  • 也许你和这个叫『机器学习』的家伙一点也不熟,但是你举起iphone手机拍照的时候,早已习惯它帮你框出人脸;也自然而言点开今日头条推给你的新闻;也习惯逛淘宝点了找相似之后货比三家;亦或喜闻乐见微软的年龄识别...

    作者: 龙心尘 && 寒小阳
    时间:2016年2月。
    出处:http://blog.csdn.net/longxinchen_ml/article/details/50749614
    http://blog.csdn.net/han_xiaoyang/article/details/50759472
    声明:版权所有,转载请联系作者并注明出处

    1. 引言

    也许你和这个叫『机器学习』的家伙一点也不熟,但是你举起iphone手机拍照的时候,早已习惯它帮你框出人脸;也自然而然点开今日头条推给你的新闻;也习惯逛淘宝点了找相似之后货比三家;亦或喜闻乐见微软的年龄识别网站结果刷爆朋友圈。恩,这些功能的核心算法就是机器学习领域的内容。

    套用一下大神们对机器学习的定义,机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单一点说,就是计算机从数据中学习出规律和模式,以应用在新数据上做预测的任务。近年来互联网数据大爆炸,数据的丰富度和覆盖面远远超出人工可以观察和总结的范畴,而机器学习的算法能指引计算机在海量数据中,挖掘出有用的价值,也使得无数学习者为之着迷。

    但是越说越觉得机器学习有距离感,云里雾里高深莫测,我们不是专家,但说起算有一些从业经验,做过一些项目在实际数据上应用机器学习。这一篇就我们的经验和各位同仁的分享,总结一些对于初学者入门有帮助的方法和对进阶有用的资料。

    #2. 机器学习关注问题
    并非所有的问题都适合用机器学习解决(很多逻辑清晰的问题用规则能很高效和准确地处理),也没有一个机器学习算法可以通用于所有问题。咱们先来了解了解,机器学习,到底关心和解决什么样的问题。

    从功能的角度分类,机器学习在一定量级的数据上,可以解决下列问题:

    1.分类问题

    • 根据数据样本上抽取出的特征,判定其属于有限个类别中的哪一个。比如:
    • 垃圾邮件识别(结果类别:1、垃圾邮件 2、正常邮件)
    • 文本情感褒贬分析(结果类别:1、褒 2、贬)
    • 图像内容识别识别(结果类别:1、喵星人 2、汪星人 3、人类 4、草泥马 5、都不是)。

    2.回归问题

    • 根据数据样本上抽取出的特征,预测一个连续值的结果。比如:
    • 星爷《美人鱼》票房
    • 大帝都2个月后的房价
    • 隔壁熊孩子一天来你家几次,宠幸你多少玩具

    3.聚类问题

    • 根据数据样本上抽取出的特征,让样本抱抱团(相近/相关的样本在一团内)。比如:
    • google的新闻分类
    • 用户群体划分

    我们再把上述常见问题划到机器学习最典型的2个分类上。

    • 分类与回归问题需要用已知结果的数据做训练,属于**“监督学习”**
    • 聚类的问题不需要已知标签,属于**“非监督学习”**。

    如果在IT行业(尤其是互联网)里溜达一圈,你会发现机器学习在以下热点问题中有广泛应用:

    1.计算机视觉

    • 典型的应用包括:人脸识别、车牌识别、扫描文字识别、图片内容识别、图片搜索等等。

    2.自然语言处理

    • 典型的应用包括:搜索引擎智能匹配、文本内容理解、文本情绪判断,语音识别、输入法、机器翻译等等。

    3.社会网络分析

    • 典型的应用包括:用户画像、网络关联分析、欺诈作弊发现、热点发现等等。

    4.推荐

    • 典型的应用包括:虾米音乐的“歌曲推荐”,某宝的“猜你喜欢”等等。

    #3. 入门方法与学习路径

    OK,不废话,直接切重点丢干货了。看似学习难度大,曲线陡的机器学习,对大多数入门者也有一个比较通用的学习路径,也有一些优秀的入门资料可以降低大家的学习门槛,同时激发我们的学习乐趣。

    简单说来,大概的一个学习路径如下:

    路径图

    简单说一点,之所以最左边写了『数学基础』『典型机器学习算法』『编程基础』三个并行的部分,是因为机器学习是一个将数学/算法理论和工程实践紧密结合的领域,需要扎实的理论基础帮助引导数据分析与模型调优,同时也需要精湛的工程开发能力去高效化地训练和部署模型和服务。

    需要多说一句的是,在互联网领域从事机器学习的人,有2类背景的人比较多,其中一部分(很大一部分)是程序员出身,这类同学工程经验相对会多一些,另一部分是学数学统计领域的同学,这部分同学理论基础相对扎实一些。因此对比上图,2类同学入门机器学习,所欠缺和需要加强的部分是不一样的。

    下面就上述图中的部分,展开来分别扯几句:

    ##3.1 数学基础

    有无数激情满满大步向前,誓要在机器学习领域有一番作为的同学,在看到公式的一刻突然就觉得自己狗带了。是啊,机器学习之所以相对于其他开发工作,更有门槛的根本原因就是数学。每一个算法,要在训练集上最大程度拟合同时又保证泛化能力,需要不断分析结果和数据,调优参数,这需要我们对数据分布和模型底层的数学原理有一定的理解。所幸的是如果只是想合理应用机器学习,而不是做相关方向高精尖的research,需要的数学知识啃一啃还是基本能理解下来的。至于更高深的部分,恩,博主非常愿意承认自己是『数学渣』。

    基本所有常见机器学习算法需要的数学基础,都集中在微积分、线性代数和概率与统计当中。下面我们先过一过知识重点,文章的后部分会介绍一些帮助学习和巩固这些知识的资料。

    ###3.1.1 微积分

    • 微分的计算及其几何、物理含义,是机器学习中大多数算法的求解过程的核心。比如算法中运用到梯度下降法、牛顿法等。如果对其几何意义有充分的理解,就能理解“梯度下降是用平面来逼近局部,牛顿法是用曲面逼近局部”,能够更好地理解运用这样的方法。
    • 凸优化和条件最优化 的相关知识在算法中的应用随处可见,如果能有系统的学习将使得你对算法的认识达到一个新高度。

    ###3.1.2 线性代数

    • 大多数机器学习的算法要应用起来,依赖于高效的计算,这种场景下,程序员GG们习惯的多层for循环通常就行不通了,而大多数的循环操作可转化成矩阵之间的乘法运算,这就和线性代数有莫大的关系了
    • 向量的内积运算更是随处可见。
    • 矩阵乘法与分解在机器学习的主成分分析(PCA)和奇异值分解(SVD) 等部分呈现刷屏状地出现。

    ###3.1.3 概率与统计
    从广义来说,机器学习在做的很多事情,和统计层面数据分析和发掘隐藏的模式,是非常类似的。

    • 极大似然思想、贝叶斯模型 是理论基础,朴素贝叶斯(Na?ve Bayes )、语言模型(N-gram)、隐马尔科夫(HMM)、隐变量混合概率模型是他们的高级形态。
    • 常见分布如高斯分布是混合高斯模型(GMM)等的基础。

    3.2 典型算法

    绝大多数问题用典型机器学习的算法都能解决,粗略地列举一下这些方法如下:

    1. 处理分类问题的常用算法包括:逻辑回归(工业界最常用),支持向量机,随机森林,朴素贝叶斯(NLP中常用),深度神经网络(视频、图片、语音等多媒体数据中使用)
    2. 处理回归问题的常用算法包括:线性回归,普通最小二乘回归(Ordinary Least Squares Regression),逐步回归(Stepwise Regression),多元自适应回归样条(Multivariate Adaptive Regression Splines)
    3. 处理聚类问题的常用算法包括:K均值(K-means),基于密度聚类,LDA等等。
    4. 降维的常用算法包括:主成分分析(PCA),奇异值分解(SVD) 等。
    5. 推荐系统的常用算法:协同过滤算法
    6. 模型融合(model ensemble)和提升(boosting)的算法包括:bagging,adaboost,GBDT,GBRT
    7. 其他很重要的算法包括:EM算法等等。

    我们多插一句,机器学习里所说的**“算法”**与程序员所说的“数据结构与算法分析”里的“算法”略有区别前者更关注结果数据的召回率、精确度、准确性等方面,后者更关注执行过程的时间复杂度、空间复杂度等方面。 。当然,实际机器学习问题中,对效率和资源占用的考量是不可或缺的。

    3.3 编程语言、工具和环境

    看了无数的理论与知识,总归要落到实际动手实现和解决问题上。而没有工具所有的材料和框架、逻辑、思路都给你,也寸步难行。因此我们还是得需要合适的编程语言、工具和环境帮助自己在数据集上应用机器学习算法,或者实现自己的想法。对初学者而言,Python和R语言是很好的入门语言,很容易上手,同时又活跃的社区支持,丰富的工具包帮助我们完成想法。相对而言,似乎计算机相关的同学用Python多一些,而数学统计出身的同学更喜欢R一些。我们对编程语言、工具和环境稍加介绍:

    3.3.1 python

    python有着全品类的数据科学工具,从数据获取、数据清洗到整合各种算法都做得非常全面。

    • 网页爬虫: scrapy
    • 数据挖掘:
      • pandas:模拟R,进行数据浏览与预处理。
      • numpy:数组运算。
      • scipy:高效的科学计算。
      • matplotlib:非常方便的数据可视化工具。
    • 机器学习:
      • scikit-learn:远近闻名的机器学习package。未必是最高效的,但是接口真心封装得好,几乎所有的机器学习算法输入输出部分格式都一致。而它的支持文档甚至可以直接当做教程来学习,非常用心。对于不是非常高纬度、高量级的数据,scikit-learn胜任得非常好(有兴趣可以看看sklearn的源码,也很有意思)。
      • libsvm:高效率的svm模型实现(了解一下很有好处,libsvm的系数数据输入格式,在各处都非常常见)
      • keras/TensorFlow:对深度学习感兴趣的同学,也能很方便地搭建自己的神经网络了。
    • 自然语言处理:
      • nltk:自然语言处理的相关功能做得非常全面,有典型语料库,而且上手也非常容易。
    • 交互式环境:
      • ipython notebook:能直接打通数据到结果的通道,方便至极。强力推荐。

    3.3.2 R

    R最大的优势是开源社区,聚集了非常多功能强大可直接使用的包,绝大多数的机器学习算法在R中都有完善的包可直接使用,同时文档也非常齐全。常见的package包括:RGtk2, pmml, colorspace, ada, amap, arules, biclust, cba, descr, doBy, e1071, ellipse等等。另外,值得一提的是R的可视化效果做得非常不错,而这对于机器学习是非常有帮助的。

    3.3.3 其他语言

    相应资深程序员GG的要求,再补充一下java和C++相关机器学习package。

    3.3.4 大数据相关

    • Hadoop:基本上是工业界的标配了。一般用来做特征清洗、特征处理的相关工作。
    • spark:提供了MLlib这样的大数据机器学习平台,实现了很多常用算法。但可靠性、稳定性上有待提高。

    3.3.5 操作系统

    • mac和linux会方便一些,而windows在开发中略显力不从心。所谓方便,主要是指的mac和linux在下载安装软件、配置环境更快捷。
    • 对于只习惯windows的同学,推荐anaconda,一步到位安装完python的全品类数据科学工具包。

    3.4 基本工作流程

    以上我们基本具备了机器学习的必要条件,剩下的就是怎么运用它们去做一个完整的机器学习项目。其工作流程如下:

    3.4.1 抽象成数学问题

    • 明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。
    • 这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。

    3.4.2 获取数据

    • 数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。
    • 数据要有代表性,否则必然会过拟合。
    • 而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。
    • 而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。

    3.4.3 特征预处理与特征选择

    • 良好的数据要能够提取出良好的特征才能真正发挥效力
    • 特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤
    • 筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。

    3.4.4 训练模型与调优

    • 直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。

    3.4.5 模型诊断

    如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。

    • 过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度
    • 误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……
    • 诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。

    3.4.6 模型融合

    • 一般来说,模型融合后都能使得效果有一定提升。而且效果很好。
    • 工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。

    3.4.7 上线运行

    • 这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。

    这些工作流程主要是**工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。**这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。

    3.5 关于积累项目经验

    初学机器学习可能有一个误区,就是一上来就陷入到对各种高大上算法的追逐当中。动不动就我能不能用深度学习去解决这个问题啊?我是不是要用boosting算法做一些模型融合啊?我一直持有一个观点,『脱离业务和数据的算法讨论是毫无意义的』。

    实际上按我们的学习经验,从一个数据源开始,即使是用最传统,已经应用多年的机器学习算法,先完整地走完机器学习的整个工作流程,不断尝试各种算法深挖这些数据的价值,在运用过程中把数据、特征和算法搞透,真正积累出项目经验 才是最快、最靠谱的学习路径。

    那如何获取数据和项目呢?一个捷径就是积极参加国内外各种数据挖掘竞赛,数据直接下载下来,按照竞赛的要求去不断优化,积累经验。国外的Kaggle和国内的DataCastle 以及阿里天池比赛都是很好的平台,你可以在上面获取真实的数据和数据科学家们一起学习和进行竞赛,尝试使用已经学过的所有知识来完成这个比赛本身也是一件很有乐趣的事情。和其他数据科学家的讨论能开阔视野,对机器学习算法有更深层次的认识。

    有意思的是,有些平台,比如阿里天池比赛,甚至给出了从数据处理模型训练模型评估可视化模型融合增强的全部组件,你要做的事情只是参与比赛,获取数据,然后使用这些组件去实现自己的idea即可。具体内容可以参见阿里云机器学习文档

    3.6 自主学习能力

    多几句嘴,这部分内容和机器学习本身没有关系,但是我们觉得这方面的能力对于任何一种新知识和技能的学习来说都是至关重要的。 自主学习能力提升后,意味着你能够跟据自己的情况,找到最合适的学习资料和最快学习成长路径。

    3.6.1 信息检索过滤与整合能力

    对于初学者,绝大部分需要的知识通过网络就可以找到了。

    google搜索引擎技巧——组合替换搜索关键词、站内搜索、学术文献搜索、PDF搜索等——都是必备的。

    一个比较好的习惯是找到信息的原始出处,如个人站、公众号、博客、专业网站、书籍等等。这样就能够找到系统化、不失真的高质量信息。

    百度搜到的技术类信息不够好,建议只作为补充搜索来用。各种搜索引擎都可以交叉着使用效果更好。

    学会去常见的高质量信息源中搜索东西:stackoverflow(程序相关)、quora(高质量回答)、wikipedia(系统化知识,比某某百科不知道好太多)、知乎(中文、有料)、网盘搜索(免费资源一大把)等。

    将搜集到的网页放到分类齐全的云端收藏夹里,并经常整理。这样无论在公司还是在家里,在电脑前还是在手机上,都能够找到自己喜欢的东西。

    搜集到的文件、代码、电子书等等也放到云端网盘里,并经常整理。

    3.6.2 提炼与总结能力

    经常作笔记,并总结自己学到的知识是成长的不二法门。其实主要的困难是懒,但是坚持之后总能发现知识的共性,就能少记一些东西,掌握得更多。

    笔记建议放到云端笔记里,印象笔记、为知笔记都还不错。这样在坐地铁、排队等零碎的时间都能看到笔记并继续思考。

    3.6.3 提问与求助能力

    机器学习的相关QQ群、论坛、社区一大堆。总有人知道你问题的答案。

    但是大多数同学都很忙,没法像家庭教师那样手把手告诉你怎么做。

    为了让回答者最快明白你的问题,最好该学会正确的问问题的方式:陈述清楚你的业务场景和业务需求是什么,有什么已知条件,在哪个具体的节点上遇到困难了,并做过哪些努力。

    有一篇经典的文章告诉你怎样通过提问获得帮助:《提问的智慧》,强力推荐。 话锋犀利了些,但里面的干货还是很好的。

    别人帮助你的可能性与你提问题的具体程度和重要性呈指数相关。

    3.6.4 分享的习惯

    我们深信:“证明自己真的透彻理解一个知识,最好的方法,是给一个想了解这个内容的人,讲清楚这个内容。” 分享能够最充分地提升自己的学习水平。这也是我们坚持长期分享最重要的原因。

    分享还有一个副产品,就是自己在求助的时候能够获得更多的帮助机会,这也非常重要。

    4. 相关资源推荐

    文章的最后部分,我们继续放送干货。其实机器学习的优质资源非常多。博主也是翻遍浏览器收藏夹,也问同事取了取经,整合了一部分资源罗列如下:

    4.1 入门资源

    首先coursera 是一个非常好的学习网站,集中了全球的精品课程。上述知识学习的过程都可以在上面找到合适的课程。也有很多其他的课程网站,这里我们就需要学习的数学和机器学习算法推荐一些课程(有一些课程有中文字幕,有一些只有英文字幕,有一些甚至没有字幕,大家根据自己的情况调整,如果不习惯英文,基础部分有很多国内的课程也非常优质):

    • 微积分相关

    Calculus: Single Variable
    Multivariable Calculus

    • 线性代数

    Linear Algebra

    • 概率统计

    Introduction to Statistics: Descriptive Statistics
    Probabilistic Systems Analysis and Applied Probability

    • 编程语言

    Programming for Everybody:Python
    DataCamp: Learn R with R tutorials and coding challenges:R

    • 机器学习方法

    Statistical Learning®
    machine learning:强烈推荐,Andrew Ng老师的课程
    机器学习基石
    机器学习技术:林轩田老师的课相对更有深度一些,把作业做完会对提升对机器学习的认识。
    自然语言处理:斯坦福大学课程

    • 日常阅读的资源

    @爱可可-爱生活的微博
    机器学习日报的邮件订阅 等。

    4.2 进阶资源

    • 有源代码的教程

    scikit-learn中各个算法的例子
    《机器学习实战》 有中文版,并附有python源代码。
    《The Elements of Statistical Learning (豆瓣)》 这本书有对应的中文版:《统计学习基础 (豆瓣)》。书中配有R包。可以参照着代码学习算法。网盘中有中文版。
    《Natural Language Processing with Python (豆瓣)》 NLP 经典,其实主要是讲 python的NLTK 这个包。网盘中有中文版。
    《Neural Networks and Deep Learning》 Michael Nielsen的神经网络教材,浅显易懂。国内有部分翻译,不全,建议直接看原版。

    • 图书与教材

    《数学之美》:入门读起来很不错。
    《统计学习方法 (豆瓣) 》:李航经典教材。
    《Pattern Recognition And Machine Learning (豆瓣) 》:经典中教材。
    《统计自然语言处理》自然语言处理经典教材
    《Applied predictive modeling》:英文版,注重工程实践的机器学习教材
    《UFLDL教程》:神经网络经典教材
    《deeplearningbook》:深度学习经典教材。

    • 工具书

    《SciPy and NumPy (豆瓣) 》
    《Python for Data Analysis (豆瓣) 》作者是Pandas这个包的作者

    • 其他网络资料

    机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总: 作者太给力,量大干货多,有兴趣的同学可以看看,博主至今只看了一小部分。

    展开全文
  • 近年来互联网数据大爆炸,数据的丰富度和覆盖面远远超出人工可以观察和总结的范畴,而机器学习的算法能指引计算机在海量数据中,挖掘出有用的价值,也使得无数学习者为之着迷。 我们不是专家,但说起算有一些从业...

    作者:寒小阳&&龙心尘
    时间:2016年2月。
    出处:http://blog.csdn.net/han_xiaoyang/article/details/50759472
    http://blog.csdn.net/longxinchen_ml/article/details/50749614
    声明:版权所有,转载请联系作者并注明出处

    1. 引言

    也许你和这个叫『机器学习』的家伙一点也不熟,但是你举起iphone手机拍照的时候,早已习惯它帮你框出人脸;也自然而然点开今日头条推给你的新闻;也习惯逛淘宝点了找相似之后货比三家;亦或喜闻乐见微软的年龄识别网站结果刷爆朋友圈。恩,这些功能的核心算法就是机器学习领域的内容。

    套用一下大神们对机器学习的定义,机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单一点说,就是计算机从数据中学习出规律和模式,以应用在新数据上做预测的任务。近年来互联网数据大爆炸,数据的丰富度和覆盖面远远超出人工可以观察和总结的范畴,而机器学习的算法能指引计算机在海量数据中,挖掘出有用的价值,也使得无数学习者为之着迷。

    但是越说越觉得机器学习有距离感,云里雾里高深莫测,我们不是专家,但说起算有一些从业经验,做过一些项目在实际数据上应用机器学习。这一篇就我们的经验和各位同仁的分享,总结一些对于初学者入门有帮助的方法和对进阶有用的资料。

    人工智能

    2. 机器学习关注问题

    并非所有的问题都适合用机器学习解决(很多逻辑清晰的问题用规则能很高效和准确地处理),也没有一个机器学习算法可以通用于所有问题。咱们先来了解了解,机器学习,到底关心和解决什么样的问题。

    从功能的角度分类,机器学习在一定量级的数据上,可以解决下列问题:

    1.分类问题

    • 根据数据样本上抽取出的特征,判定其属于有限个类别中的哪一个。比如:
      • 垃圾邮件识别(结果类别:1、垃圾邮件 2、正常邮件)
      • 文本情感褒贬分析(结果类别:1、褒 2、贬)
      • 图像内容识别识别(结果类别:1、喵星人 2、汪星人 3、人类 4、草泥马 5、都不是)。

    2.回归问题

    • 根据数据样本上抽取出的特征,预测一个连续值的结果。比如:
      • 星爷《美人鱼》票房
      • 大帝都2个月后的房价
      • 隔壁熊孩子一天来你家几次,宠幸你多少玩具

    3.聚类等问题

    • 根据数据样本上抽取出的特征,让样本抱抱团(相近/相关的样本在一团内)。比如:
      • google的新闻分类
      • 用户群体划分

    我们再把上述常见问题划到机器学习最典型的2个分类上。

    • 分类与回归问题需要用已知结果的数据做训练,属于“监督学习”
    • 聚类的问题不需要已知标签,属于“非监督学习”

    如果在IT行业(尤其是互联网)里溜达一圈,你会发现机器学习在以下热点问题中有广泛应用:

    1.计算机视觉

    • 典型的应用包括:人脸识别、车牌识别、扫描文字识别、图片内容识别、图片搜索等等。

    2.自然语言处理

    • 典型的应用包括:搜索引擎智能匹配、文本内容理解、文本情绪判断,语音识别、输入法、机器翻译等等。

    3.社会网络分析

    • 典型的应用包括:用户画像、网络关联分析、欺诈作弊发现、热点发现等等。

    4.推荐

    • 典型的应用包括:虾米音乐的“歌曲推荐”,某宝的“猜你喜欢”等等。

    3. 入门方法与学习路径

    OK,不废话,直接切重点丢干货了。看似学习难度大,曲线陡的机器学习,对大多数入门者也有一个比较通用的学习路径,也有一些优秀的入门资料可以降低大家的学习门槛,同时激发我们的学习乐趣。

    简单说来,大概的一个学习路径如下:


    路径图

    简单说一点,之所以最左边写了『数学基础』『典型机器学习算法』『编程基础』三个并行的部分,是因为机器学习是一个将数学/算法理论和工程实践紧密结合的领域,需要扎实的理论基础帮助引导数据分析与模型调优,同时也需要精湛的工程开发能力去高效化地训练和部署模型和服务。

    需要多说一句的是,在互联网领域从事机器学习的人,有2类背景的人比较多,其中一部分(很大一部分)是程序员出身,这类同学工程经验相对会多一些,另一部分是学数学统计领域的同学,这部分同学理论基础相对扎实一些。因此对比上图,2类同学入门机器学习,所欠缺和需要加强的部分是不一样的。

    下面就上述图中的部分,展开来分别扯几句:

    3.1 数学基础

    有无数激情满满大步向前,誓要在机器学习领域有一番作为的同学,在看到公式的一刻突然就觉得自己狗带了。是啊,机器学习之所以相对于其他开发工作,更有门槛的根本原因就是数学。每一个算法,要在训练集上最大程度拟合同时又保证泛化能力,需要不断分析结果和数据,调优参数,这需要我们对数据分布和模型底层的数学原理有一定的理解。所幸的是如果只是想合理应用机器学习,而不是做相关方向高精尖的research,需要的数学知识啃一啃还是基本能理解下来的。至于更高深的部分,恩,博主非常愿意承认自己是『数学渣』。

    基本所有常见机器学习算法需要的数学基础,都集中在微积分、线性代数和概率与统计当中。下面我们先过一过知识重点,文章的后部分会介绍一些帮助学习和巩固这些知识的资料。

    3.1.1 微积分

    • 微分的计算及其几何、物理含义,是机器学习中大多数算法的求解过程的核心。比如算法中运用到梯度下降法、牛顿法等。如果对其几何意义有充分的理解,就能理解“梯度下降是用平面来逼近局部,牛顿法是用曲面逼近局部”,能够更好地理解运用这样的方法。
    • 凸优化和条件最优化 的相关知识在算法中的应用随处可见,如果能有系统的学习将使得你对算法的认识达到一个新高度。

    3.1.2 线性代数

    • 大多数机器学习的算法要应用起来,依赖于高效的计算,这种场景下,程序员GG们习惯的多层for循环通常就行不通了,而大多数的循环操作可转化成矩阵之间的乘法运算,这就和线性代数有莫大的关系了
    • 向量的内积运算更是随处可见。
    • 矩阵乘法与分解在机器学习的主成分分析(PCA)和奇异值分解(SVD) 等部分呈现刷屏状地出现。

    3.1.3 概率与统计

    从广义来说,机器学习在做的很多事情,和统计层面数据分析和发掘隐藏的模式,是非常类似的。

    • 极大似然思想、贝叶斯模型 是理论基础,朴素贝叶斯(Naïve Bayes )、语言模型(N-gram)、隐马尔科夫(HMM)、隐变量混合概率模型是他们的高级形态。
    • 常见分布如高斯分布是混合高斯模型(GMM)等的基础。

    3.2 典型算法

    绝大多数问题用典型机器学习的算法都能解决,粗略地列举一下这些方法如下:

    1. 处理分类问题的常用算法包括:逻辑回归(工业界最常用),支持向量机,随机森林,朴素贝叶斯(NLP中常用),深度神经网络(视频、图片、语音等多媒体数据中使用)
    2. 处理回归问题的常用算法包括:线性回归,普通最小二乘回归(Ordinary Least Squares Regression),逐步回归(Stepwise Regression),多元自适应回归样条(Multivariate Adaptive Regression Splines)
    3. 处理聚类问题的常用算法包括:K均值(K-means),基于密度聚类,LDA等等。
    4. 降维的常用算法包括:主成分分析(PCA),奇异值分解(SVD) 等。
    5. 推荐系统的常用算法:协同过滤算法
    6. 模型融合(model ensemble)和提升(boosting)的算法包括:bagging,adaboost,GBDT,GBRT
    7. 其他很重要的算法包括:EM算法等等。

    我们多插一句,机器学习里所说的“算法”与程序员所说的“数据结构与算法分析”里的“算法”略有区别前者更关注结果数据的召回率、精确度、准确性等方面,后者更关注执行过程的时间复杂度、空间复杂度等方面。 。当然,实际机器学习问题中,对效率和资源占用的考量是不可或缺的。

    3.3 编程语言、工具和环境

    看了无数的理论与知识,总归要落到实际动手实现和解决问题上。而没有工具所有的材料和框架、逻辑、思路都给你,也寸步难行。因此我们还是得需要合适的编程语言、工具和环境帮助自己在数据集上应用机器学习算法,或者实现自己的想法。对初学者而言,Python和R语言是很好的入门语言,很容易上手,同时又活跃的社区支持,丰富的工具包帮助我们完成想法。相对而言,似乎计算机相关的同学用Python多一些,而数学统计出身的同学更喜欢R一些。我们对编程语言、工具和环境稍加介绍:

    3.3.1 python

    python有着全品类的数据科学工具,从数据获取、数据清洗到整合各种算法都做得非常全面。

    • 网页爬虫: scrapy
    • 数据挖掘:
      • pandas:模拟R,进行数据浏览与预处理。
      • numpy:数组运算。
      • scipy:高效的科学计算。
      • matplotlib:非常方便的数据可视化工具。
    • 机器学习:
      • scikit-learn:远近闻名的机器学习package。未必是最高效的,但是接口真心封装得好,几乎所有的机器学习算法输入输出部分格式都一致。而它的支持文档甚至可以直接当做教程来学习,非常用心。对于不是非常高纬度、高量级的数据,scikit-learn胜任得非常好(有兴趣可以看看sklearn的源码,也很有意思)。
      • libsvm:高效率的svm模型实现(了解一下很有好处,libsvm的系数数据输入格式,在各处都非常常见)
      • keras/TensorFlow:对深度学习感兴趣的同学,也能很方便地搭建自己的神经网络了。
    • 自然语言处理:
      • nltk:自然语言处理的相关功能做得非常全面,有典型语料库,而且上手也非常容易。
    • 交互式环境:
      • ipython notebook:能直接打通数据到结果的通道,方便至极。强力推荐。

    3.3.2 R

    R最大的优势是开源社区,聚集了非常多功能强大可直接使用的包,绝大多数的机器学习算法在R中都有完善的包可直接使用,同时文档也非常齐全。常见的package包括:RGtk2, pmml, colorspace, ada, amap, arules, biclust, cba, descr, doBy, e1071, ellipse等等。另外,值得一提的是R的可视化效果做得非常不错,而这对于机器学习是非常有帮助的。

    3.3.3 其他语言

    相应资深程序员GG的要求,再补充一下java和C++相关机器学习package。

    3.3.4 大数据相关

    • Hadoop:基本上是工业界的标配了。一般用来做特征清洗、特征处理的相关工作。
    • spark:提供了MLlib这样的大数据机器学习平台,实现了很多常用算法。但可靠性、稳定性上有待提高。

    3.3.5 操作系统

    • mac和linux会方便一些,而windows在开发中略显力不从心。所谓方便,主要是指的mac和linux在下载安装软件、配置环境更快捷。
    • 对于只习惯windows的同学,推荐anaconda,一步到位安装完python的全品类数据科学工具包。

    3.4 基本工作流程

    以上我们基本具备了机器学习的必要条件,剩下的就是怎么运用它们去做一个完整的机器学习项目。其工作流程如下:

    3.4.1 抽象成数学问题

    • 明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。
    • 这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。

    3.4.2 获取数据

    • 数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。
    • 数据要有代表性,否则必然会过拟合。
    • 而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。
    • 而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。

    3.4.3 特征预处理与特征选择

    • 良好的数据要能够提取出良好的特征才能真正发挥效力
    • 特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤
    • 筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。

    3.4.4 训练模型与调优

    • 直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。

    3.4.5 模型诊断

    如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。

    • 过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度
    • 误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……
    • 诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。

    3.4.6 模型融合

    • 一般来说,模型融合后都能使得效果有一定提升。而且效果很好。
    • 工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。

    3.4.7 上线运行

    • 这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。

    这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。

    3.5 关于积累项目经验

    初学机器学习可能有一个误区,就是一上来就陷入到对各种高大上算法的追逐当中。动不动就我能不能用深度学习去解决这个问题啊?我是不是要用boosting算法做一些模型融合啊?我一直持有一个观点,『脱离业务和数据的算法讨论是毫无意义的』。

    实际上按我们的学习经验,从一个数据源开始,即使是用最传统,已经应用多年的机器学习算法,先完整地走完机器学习的整个工作流程,不断尝试各种算法深挖这些数据的价值,在运用过程中把数据、特征和算法搞透,真正积累出项目经验 才是最快、最靠谱的学习路径。

    那如何获取数据和项目呢?一个捷径就是积极参加国内外各种数据挖掘竞赛,数据直接下载下来,按照竞赛的要求去不断优化,积累经验。国外的Kaggle和国内的DataCastle 以及阿里天池比赛都是很好的平台,你可以在上面获取真实的数据和数据科学家们一起学习和进行竞赛,尝试使用已经学过的所有知识来完成这个比赛本身也是一件很有乐趣的事情。和其他数据科学家的讨论能开阔视野,对机器学习算法有更深层次的认识。

    有意思的是,有些平台,比如阿里天池比赛,甚至给出了从数据处理模型训练模型评估可视化模型融合增强的全部组件,你要做的事情只是参与比赛,获取数据,然后使用这些组件去实现自己的idea即可。具体内容可以参见阿里云机器学习文档

    3.6 自主学习能力

    多几句嘴,这部分内容和机器学习本身没有关系,但是我们觉得这方面的能力对于任何一种新知识和技能的学习来说都是至关重要的。 自主学习能力提升后,意味着你能够跟据自己的情况,找到最合适的学习资料和最快学习成长路径。

    3.6.1 信息检索过滤与整合能力

    对于初学者,绝大部分需要的知识通过网络就可以找到了。

    google搜索引擎技巧——组合替换搜索关键词、站内搜索、学术文献搜索、PDF搜索等——都是必备的。

    一个比较好的习惯是找到信息的原始出处,如个人站、公众号、博客、专业网站、书籍等等。这样就能够找到系统化、不失真的高质量信息。

    百度搜到的技术类信息不够好,建议只作为补充搜索来用。各种搜索引擎都可以交叉着使用效果更好。

    学会去常见的高质量信息源中搜索东西:stackoverflow(程序相关)、quora(高质量回答)、wikipedia(系统化知识,比某某百科不知道好太多)、知乎(中文、有料)、网盘搜索(免费资源一大把)等。

    将搜集到的网页放到分类齐全的云端收藏夹里,并经常整理。这样无论在公司还是在家里,在电脑前还是在手机上,都能够找到自己喜欢的东西。

    搜集到的文件、代码、电子书等等也放到云端网盘里,并经常整理。

    3.6.2 提炼与总结能力

    经常作笔记,并总结自己学到的知识是成长的不二法门。其实主要的困难是懒,但是坚持之后总能发现知识的共性,就能少记一些东西,掌握得更多。

    笔记建议放到云端笔记里,印象笔记、为知笔记都还不错。这样在坐地铁、排队等零碎的时间都能看到笔记并继续思考。

    3.6.3 提问与求助能力

    机器学习的相关QQ群、论坛、社区一大堆。总有人知道你问题的答案。

    但是大多数同学都很忙,没法像家庭教师那样手把手告诉你怎么做。

    为了让回答者最快明白你的问题,最好该学会正确的问问题的方式:陈述清楚你的业务场景和业务需求是什么,有什么已知条件,在哪个具体的节点上遇到困难了,并做过哪些努力。

    有一篇经典的文章告诉你怎样通过提问获得帮助:《提问的智慧》,强力推荐。 话锋犀利了些,但里面的干货还是很好的。

    别人帮助你的可能性与你提问题的具体程度和重要性呈指数相关。

    3.6.4 分享的习惯

    我们深信:“证明自己真的透彻理解一个知识,最好的方法,是给一个想了解这个内容的人,讲清楚这个内容。” 分享能够最充分地提升自己的学习水平。这也是我们坚持长期分享最重要的原因。

    分享还有一个副产品,就是自己在求助的时候能够获得更多的帮助机会,这也非常重要。

    4. 相关资源推荐

    文章的最后部分,我们继续放送干货。其实机器学习的优质资源非常多。博主也是翻遍浏览器收藏夹,也问同事取了取经,整合了一部分资源罗列如下:

    4.1 入门资源

    首先coursera 是一个非常好的学习网站,集中了全球的精品课程。上述知识学习的过程都可以在上面找到合适的课程。也有很多其他的课程网站,这里我们就需要学习的数学和机器学习算法推荐一些课程(有一些课程有中文字幕,有一些只有英文字幕,有一些甚至没有字幕,大家根据自己的情况调整,如果不习惯英文,基础部分有很多国内的课程也非常优质):

    • 微积分相关

    Calculus: Single Variable
    Multivariable Calculus

    • 线性代数

    Linear Algebra

    • 概率统计

    Introduction to Statistics: Descriptive Statistics
    Probabilistic Systems Analysis and Applied Probability

    • 编程语言

    Programming for Everybody:Python
    DataCamp: Learn R with R tutorials and coding challenges:R

    • 机器学习方法

    Statistical Learning(R)
    machine learning:强烈推荐,Andrew Ng老师的课程
    机器学习基石
    机器学习技术:林轩田老师的课相对更有深度一些,把作业做完会对提升对机器学习的认识。
    自然语言处理:斯坦福大学课程

    • 日常阅读的资源

    @爱可可-爱生活的微博
    机器学习日报的邮件订阅 等。

    4.2 进阶资源

    • 有源代码的教程

    scikit-learn中各个算法的例子
    《机器学习实战》 有中文版,并附有python源代码。
    《The Elements of Statistical Learning (豆瓣)》 这本书有对应的中文版:《统计学习基础 (豆瓣)》。书中配有R包。可以参照着代码学习算法。网盘中有中文版。
    《Natural Language Processing with Python (豆瓣)》 NLP 经典,其实主要是讲 python的NLTK 这个包。网盘中有中文版。
    《Neural Networks and Deep Learning》 Michael Nielsen的神经网络教材,浅显易懂。国内有部分翻译,不全,建议直接看原版。

    • 图书与教材

    《数学之美》:入门读起来很不错。
    《统计学习方法 (豆瓣) 》:李航经典教材。
    《Pattern Recognition And Machine Learning (豆瓣) 》:经典中教材。
    《统计自然语言处理》自然语言处理经典教材
    《Applied predictive modeling》:英文版,注重工程实践的机器学习教材
    《UFLDL教程》:神经网络经典教材
    《deeplearningbook》:深度学习经典教材。

    • 工具书

    《SciPy and NumPy (豆瓣) 》
    《Python for Data Analysis (豆瓣) 》作者是Pandas这个包的作者

    • 其他网络资料

    机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总: 作者太给力,量大干货多,有兴趣的同学可以看看,博主至今只看了一小部分。

    展开全文
  • 吴恩达机器学习作业目录 1 吴恩达机器学习作业Python实现(一):线性回归 2 吴恩达机器学习作业Python实现(二):logistic回归 3 吴恩达机器学习作业Python实现(三):多类分类和前馈神经网络 4 吴恩达机器学习作业...
  • 机器学习文献综述

    2018-07-14 22:56:20
    检索式:机器学习检索结果及分析:机器学习有下面几种定义: “机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能”。 “机器学习是对能通过经验自动改进的...
  • 机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些...
  • 其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。 书的购买链接 书的勘误,优化,源代码资源 机器学习是现阶段解决很多...
  • 前段时间在研究WebShell的检测查杀,然后看到兜哥的著作中提到的几个机器学习算法中也有实现WebShell检测的,主要有朴素贝叶斯分类、K邻近算法、图算法、循环神经网络算法等等,就一一试试看效果吧。 Python中的几个...
  • 也许你和这个叫『机器学习』的家伙一点也不熟,但是你举起iphone手机拍照的时候,早已习惯它帮你框出人脸;也自然而然点开今日头条推给你的新闻;也习惯逛淘宝点了找相似之后货比三家;亦或喜闻乐见微软的年龄识别...
  • 导 语在过去十年中,机器学习技术取得了快速进步,实现了以前从未想象过的自动化和预测能力。随着这一技术的发展促使研究人员和工程师为这些美妙的技术构思新的应用。不久,机器学习...
  • 机器学习练习之k均值

    2014-02-13 14:59:22
    k-means属于聚类分析的其中一种算法,聚类分析在机器学习、数据挖掘、模式识别、决策支持和图像分割中有广泛的应用。聚类是无监督的分类方法,所谓无监督就是没有给定训练数据的标签信息,所以聚类出来的结果的类别...
  • 本文将从k-邻近算法的思想开始讲起,使用python3一步一步编写代码进行实战训练。并且,我也提供了相应的数据集,对代码进行了详细的注释。除此之外,本文也对sklearn实现k-邻近算法的方法进行了讲解。实战实例:电影...
  • 本书首先通过实用的案例介绍机器学习的基础知识,然后介绍一些稍微复杂的机器学习算法,例如支持向量机、极端随机森林、隐马尔可夫模型、条件随机场、深度神经网络,等等。 用最火的 Python 语言、通过各种各样的...
  • R语言进行机器学习方法及实例 机器学习的研究领域是发明计算机算法,把数据转变为智能行为。机器学习和数据挖掘的区别可能是机器学习侧重于执行一个已知的任务,而数据发掘是在大数据中寻找有价值的东西。 机器...
  • 机器学习中,将数据集A 分为训练集(training set)B和测试集(testset)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,每次将其中一个包作为测试集,剩下k-1个包...
  • 理论部分与“机器学习算法与python实践:k近邻(kNN)”这篇博文相同,实践数据也相同,差别为代码部分为作者用Matlab重新编写。 最近开始学习机器学习,理论部分主要参考周志华老师的《机器学习》这本书,实践部分...
  • 机器学习与隐私保护

    2019-10-10 09:02:55
    机器学习概念 机器学习(Machine Learning.ML):是人工智能的一个分支,是实现人工智能的一个途径,即以机器学习为手段解决人工智能中的问题。让一个计算机程序针对某一个特定任务,从经验中学习,并且学习的...
  • 斯坦福机器学习课程汇总 前言首先感谢吴恩达建立Coursera这样一个优秀的在线学习平台,以及他发布在这个平台上的机器学习课程。 这门课程将整个机器学习领域的基础知识,用浅显易懂的方式,深入浅出的进行了介绍。...
1 2 3 4 5 ... 20
收藏数 52,337
精华内容 20,934
关键字:

k检验 机器学习