机器学习的主要任务是分类,我们决定使用某个机器学习算法进行分类,首先要做的是算法训练,即学习如何分类,通常我们为算法输入大量的已分类数据作为算法的训练集,训练集是用于训练机器学习算法的数据样本集合,目标变量是机器学习算法的预测结果,在分类算法中目标变量的类型通常是标称型的,而在回归算法中通常是连续型的。训练样本必须确切的目标变量的值,以使机器机器学习可以发现特征与目标变量之间的关系。为了测试机器学习的算法的效果通常使用两套独立的样本集:训练数据和测试数据。当机器学习程序开始运行时使用训练样本集作为程序的输入,训练完成后输入测试样本。输入测试样本时不提供目标变量,由程序计算属于哪个分类。比较测试样本预测的目标变量与实际样本类别之间的差别就可以得出精确度。分类和回归属于监督学习,之所以称之为监督学习是因为这类算法必须知道要预测什么,即目标变量的分类信息。
如何选择合适的算法?
选择实际可用的算法必须明确两个问题:
1.使用机器学习算法的目的,想要算法完成何种任务
2.需要分析和收集的数据是什么
如果想预测目标变量的值则可以选择监督学习算法,否则可以选择无监督学习算法,确定选择监督学习算法后,需要进一步确定目标变量的类型,如果是离散型,比如是/否、A/B/C等,则可以选择分类算法;如果目标变量是连续型的,比如0.0-100.0、-999-999等,则需要选择回归算法。
如果不想预测目标变量的值可以选择无监督学习,进一步分析是否需要将数据划分为离散的组,如果这是唯一的需求则使用聚类算法;如果还需要估计数据与每个分组的相似程度则需要密度估计算法。
学习的第一个分类算法:K-近邻算法
K-近邻算法分类算法原理:采用测量不同特征值之间的距离来分类。
应用:比如利用K-近邻算法对电影分类,我们首先计算出未知电影与已知分类样本集中其他电影的距离,按照距离递增排序,可以找到距离最近的K个样本电影,选择出现次数最多的分类为未知电影的分类。
机器学习一般流程:
1.收集数据:可以使用任何方法。
2.准备数据:计算距离所需要的格式化输入数据。
3.分析数据:可以使用任何方法。
4.训练算法:此步骤不适用K近邻算法。
5.测试算法:测试精确度。
6.使用算法:首先需要输入样本数据和格式化的结果,然后运行K邻近判断输入数据分别属于哪个分类,最后应用对输出的结果执行后续的处理。
第一个程序:
数据集group是四个数组元素,分别对应标签数组labels,利用K-近邻算法求出前3个离目标元素[0,0]最近距离的元素,选择出现次数最多标签为未知元素的分类标签。
创建kNN.py
from numpy import *
import operator
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
def classify0(inX , dataSet , labels , k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX , (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortedDistIndicies = distances.argsort()
classcount = {}
for i in range(k):
votelabel = labels[sortedDistIndicies[i]]
classcount[votelabel]=classcount.get(votelabel , 0)+1
sortedClassCount=sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
执行程序:
>>> import kNN
>>> group , labels = kNN.createDataSet()
>>> group
array([[ 1. , 1.1],
[ 1. , 1. ],
[ 0. , 0. ],
[ 0. , 0.1]])
>>> labels
['A', 'A', 'B', 'B']
>>> kNN.classify0([0,0] , group , labels , 3)
'B'