机器学习实战笔记1

本文介绍了机器学习的基础,包括分类任务、K-NN、决策树和朴素贝叶斯算法。详细探讨了K-NN的原理和应用,如约会网址配对和手写识别,并提到了如何选择算法。此外,还概述了决策树的定义和学习过程,以及朴素贝叶斯的基本原理和文本分类应用。
摘要由CSDN通过智能技术生成

机器学习实战&统计学习方法

前两部分主要讨论监督学习(只需要给定输入样本集,机器就可以从中推演出指定目标变量的可能结果)

第一部分 分类

目标变量(也叫类别):一般为标称型(在限定的目标集中取值,离散有限型,一般是分类算法)和数值型(无限的数值集合中取值,连续型,一般是回归算法)
特征:属性

第1章机器学习基础

机器学习的主要任务

监督学习:分类,回归。[k-近邻,朴素贝斯,svm,决策树,等]
无监督学习:聚类,密度估计。[k-means,等]

如何选择算法

考虑使用机器学习算法的目的:预测目标变量的值,选择监督学习,确定目标变量的类型,离散型使用分类算法,连续型使用回归算法;否则,选择无监督学习,如果将数据分为离散的组,使用聚类算法,估计数据,使用密度估计算法;

【这里的分类即y的取值是离散的,函数f(x)的结果就给定的几种可能;回归即y的取值是连续的,函数f(x)的结果不定,但是对于好的模型f(x),结果y是围绕f(x)上下波动的】

第2章 K-NN

原理

给定一个训练集,对于新输入的实例(测试集),在训练集中找到与该实例最近的k个实例(一般使用欧式距离),统计这k个实例所属的类,把新输入的实例归到包含实例最多的类
上面提到的最原始的方法为线性扫描,对于大规模的数据,计算非常耗时,不可行;优化的方法是使用特殊的结构来存储训练数据,以减少计算距离的次数。下面介绍kd树
构造kd树
对于给定的数据集 T=x1,x2,xN ,其中 xi=(x1i,x2i,,xni) 表示n维度的点,即点 xi 在n维空间中。
(1)对未分类点的一个维度 i 中的值 (xi1,xi2,xi3,...xiK) 取中位数对应的点,作该点到该维度坐标轴的超平面,将这些点分为两个子区域
(2) i=i%n+1 ,继续对这两个子区域作(1)操作,直至子区域中没有实例点
最终形成一颗kd树
搜索kd树
这一块有个问题一直没有解决,如何判断超球体与超矩形相交,如果相交,对于相交的子树如何递归???
这篇文章让我理解了kd 树算法之详细篇

假设需要找到离测试点最近的k个实例,以k维数组存储
指定节点为根节点,执行(1)
(1)
从指定节点出发,向下搜索,找到测试节点对应的叶节点,指针指向叶节点
(2)
如果k维数组未填满,将节点添加到数组中,标记该节点:
如果节点有子节点且未被标记:
​ 指向该子节点,转向(1)
如果节点没有子节点或者子节点被标记:
​ 指针指向父节点,转向(2)
(3)
如果为叶节点或者该节点的子节点均被标记,标记该节点,判断该节点与测试点之间的距离t和k维数组中最远距离s的大小关系:
如果t

实例2:用K-NN算法改进约会网址的配对效果

给定了1000条数据,有3个参数和一个类别,3个参数分别是每年获得的飞行常客里程数,玩视频游戏所耗时间的百分比,每周消费的冰淇淋公升数;类别分别是不喜欢,魅力一般,极具魅力
绘制两两特征之间的关系图,发现特征game和fly之间的图能够将三个类分的更加清楚,如下图所示
201

对于fly和game之间的关系,如下,但没有上面类型区分度高

202
(上面的这些图,并不知道具体有什么用???,仅仅是为了直观吗。。。,下面使用KNN算法,并评估算法的误差率)
首先需要归一化数据,是数据分布在[0,1]之间,这样每个特征对判别函数(这里用到的是欧氏距离最近的k个点)的影响一样:
value=(value-minvalue)/(maxvalue-minvalue)

#归一化数据,但是对于上面画的图像是没有影响的,集体变化;后面会用到
def autoNorm(dataSet,fea):
    for i in fea:
        maxValue=max(dataSet[i])
        minValue=min(dataSet[i])
        #关于DataFrame数据处理,应该是一列列(行行)的处理,而不是单个值处理;复制元素的使用:np.tile
        dataSet[i]=(dataSet[i]-np.tile(minValue,len(dataSet[i])))/(maxValue-minValue)
    return dataSet

[注意上面归一化数据的方法:不是遍历单个列中的单个元素,而是对整个列(行)操作]

做好归一化数据之后,下面就需要将测试数据分为样本数据和测试数据,这里我用800条数据作为样本数据,200条数据作为测试数据
同样对于单条(行)测试数据,使用tile函数将其行变为800,再与整个样本数据进行距离计算,对结果排序,选取前k个,统计类别最多的类作为测试数据的类别
[这与传统的方法最大的不同,不是单个单个计算,而是一整列(行)计算,速度会快很多]
代码如下:

dataf=autoNorm(df,['ice','game','fly'])#归一化【0,1】,使用公式:value=(value-minvalue)/(maxvalue-minvalue)
dres=dataf[:800]#前800条数据作为原始集
#这个之所以要再构建DataFrame,是后面在DF的切片中操作时(新建一列或者是对列中的元素赋值时),有警告
#A value is trying to be set on a copy of a slice from a DataFrame.
dres=pd.DataFrame(dres,columns=['fly','game','ice','category'])
dtes=dataf[800:]#后200条作为测试集
xt=dtes[['ice','game','fly']].as_matrix()#获取numpy数组
yt=dtes['category'].tolist()#测试集的类别
tes=classify0(xt,dres[['ice','game','fly']],dres,10)#knn
eva=get_evaluation(yt,tes)#误差判断:错误集/全集

KNN算法与判断误差函数
其中距离度量使用的时欧式距离:

L2(xi,xj)=(l=1n(xlixlj)2)1/2xin

p=1时,为曼哈顿距离:

L1(xi,xj)=i=1n|xlixlj|

#KNN算法
def classify0(inx,dataSet,labels,k):
    output=[]
    dataSize=dataSet.shape[0]
    for i in inx:
        diffi=np.tile(i,[dataSize,1])-dataSet#相减
        sqi=diffi**2#对diff中的元素分别平方
        sui=sqi.sum(axis=1)#axis=1表示对行求和,变成一列了
        disi=sui**0.5
        labels['distance']=disi
        labels=labels.sort_values(by='distance')#通过某列的值来排序
        """
        c1=labels['category'][:k][labels.category==1].count()#选取category列的前k行,计算类别为1的个数
        c2=labels['category'][:k][labels.category==2].count()
        c3=labels['category'][:k][labels.category==3].count()
        c=max(c1,c2,c3)
        if c==c1:c=1
        elif c==c2:c=2
        else:c=3
        """

        #上面的一大块,此处一行就搞定,而且抽象化:获取前k行,以category为索引分组,并计算索引出现的个数,排序,获取值最大的索引
        c=labels['category'][:k].groupby([labels['category']]).count().sort_values().index[-1]
        output.append(c)
    return output

#判断错误率
def get_evaluation(res,tes):
    num=0
    n=len(res)
    for i in range(n):
        if res[i]!=tes[i]:
            num=num+1
    return num/n
实例3:手写识别

这个我做的是kaggle上的Digit Recognizer,用上面的KNN算法,做完后会补上

KNN算法小节

1.在应用中,k值一般取较小的值,一般采用交叉验证法来选取最优的k值
2.(待补)

第三章 决策树

决策树的定义

是一种基于分类和回归的方法。在分类问题中,表示特征对实例进行分类的过程,也可以认为是定义在特征空间与类空间上的条件概率
模型
决策树由节点和有向边组成;节点有两种类型:内部节点和叶节点。内部节点表示一个特征(属性),叶节点表示一个类

构建
构建根节点,将所有训练数据都放在根节点,选择一个最优的特征,按照这一特征将训练数据分割成子集,如果这些子集能够被基本正确分类,那么构建叶节点;如果不能正确分类,继续对这些子集选择最优特征,进行分类…

决策树的学习

决策树学习包含三点:特征选择,决策树生成,决策树剪枝
下面先介绍原理,然后通过实例来与之对应,方便更好的理解
特征选择
按照某一个最优的特征去分支,判断特征最优的方法是判断信息增益(在划分数据集之前和之后信息发生的变化),即通过该特征分类后,不确定因素下降最大;
:表示随机变量不确定性的度量
设X为离散的随机变量,其概率分布为 P(X=xi)=pi,i=1,2...n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值