需要源码请带点赞关注收藏后评论区留言私信~~~
分类是一种重要的数据分析形式,它提取刻画重要数据类的模型。数据分类也被称为监督学习,包括学习阶段(构建分类模型)和分类阶段(使用模型预测给定数据的类标号)两个阶段。数据分类方法只要有决策树归纳、贝叶斯分类、K-近邻分类、支持向量机SVM等方法
一、决策树规约
1. 算法原理
决策树方法在分类、预测、规则提取等领域有广泛应用。在20世纪70年代后期和80年代初期,机器学习研究人员J.Ross Quinlan开发了决策树算法,称为迭代的二分器(Iterative Dichotomiser,ID3),使得决策树在机器学习领域得到极大发展。Quinlan后来又提出ID3的后继C4.5算法,成为新的监督学习算法的性能比较基准。1984年几位统计学家提出CART分类算法
决策树是树状结构,它的每个叶结点对应着一个分类,非叶结点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分为若干子集。构造决策树的核心问题是在每一步如何选择恰当的属性对样本做拆分。ID3使用信息增益作为属性选择度量,C4.5使用增益率进行属性选择度量,CART使用基尼指数
2. ID3算法
利用决策树算法对Iris数据构建决策树
结果如下图
代码如下
from sklearn.datasets import load_iris import pandas as pd from sklearn import tree from sklearn.tree import export_graphviz import graphviz #提前安装 iris = load_iris() clf = tree.DecisionTreeClassifier() clf = clf.fit(iris.data, iris.target) dot_file = 'tree.dot' tree.export_graphviz(clf, out_file = dot_file) with open("result\\tree.dot", 'w') as f: f=export_graphviz(clf, out_file = f,feature_names = ['SL','SW','PL','PW']) from sklearn.datasets import load_iris from sklearn import tree from sklearn.model_selection import train_test_split iris = load_iris() X_train,X_test,y_train,y_test=train_test_split(iris.data, iris.target,test_size=0.20,random_state=20) clf = tree.DecisionTreeClassifier( ) # criterion缺省为'gini' clf = cltree(clf,feature_names=iris.feature_names, class_names=iris.target_names) # feature_names=iris.feature_names设置决策树中显示的特征名称 # 预测数据[6,5,5,2]的类别 print('数据[6,5,5,2]的类别:',clf.predict([[6,5,5,2]])) print('测试集的标签:\n',y_test) print('模型准确率为:',"{0:.3f}".format(clf.score(X_test,y_test)))
二、KNN算法
KNN 是一个理论上比较成熟的方法,也是最简单的机器学习算法之一
算法最初由Cover和Hart于1968年提出,它根据距离函数计算待分类样本 X 和每个训练样本的距离(作为相似度),选择与待分类样本距离最小的K个样本作为X的K个最近邻,最后以X的K个最近邻中的大多数样本所属的类别作为X的类别
1. 算法原理
如图所示,有方块和三角形两类数据,它们分布在二维特征空间中。假设有一个新数据(圆点)需要预测其所属的类别,根据“物以类聚”,可以找到离圆点最近的几个点,以它们中的大多数点的类别决定新数据所属的类别。如果k = 3,由于圆点近邻的3个样本中,三角形占比2/3,则认为新数据属于三角形类别。同理,k = 5,则新数据属于正方形类别
如何度量样本之间的距离(或相似度)是KNN算法的关键步骤之一。常见的相似度度量方法包括闵可夫斯基距离(当参数p = 2时为欧几里得距离,参数p = 1时为曼哈顿距离)、余弦相似度、皮尔逊相似系数、汉明距离、杰卡德相似系数等
(1) 汉明距离
两个等长字符串s1和s2之间的汉明距离(Hamming distance)定义为将其中一个变为另外一个所需要做的最小替换次数。例如:1011101与1001001之间的汉明距离是2,2143896与2233796之间的汉明距离是3,”toned”与”roses”之间的汉明距离是3
(2) 杰卡德相似系数
在上面的例子中,用M11表示两个用户都看过的电影数目,M10表示用户A看过而用户B没有看过的电影数目,M01表示用户A没看过而用户B看过的电影数目,M00表示两个用户都没有看过的电影数目。Jaccard相似性系数可以表示为
KNN算法大致包括三个步骤:
1. 算距离:给定测试对象,计算它与训练集中的每个对象的距离;
2. 找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻;
3. 做分类:根据这k个近邻归属的主要类别,来对测试对象分类
2. KNN算法
输入:簇的数目k和包含n个对象的数据库。 输出:k个簇,使平方误差最小。
方法: (1)初始化距离为最大值;
(2)计算测试样本和每个训练样本的距离dist;
(3)得到目前 K个最近邻样本中的最大距离maxdist;
(4)如果dist小于maxdist,则将该训练样本作为K最近邻样本;
(5)重复步骤2-4,直到测试样本和所有训练样本的距离都计算完毕;
(6)统计K个最近邻样本中每个类别出现的次数;
(7)选择出现频率最大的类别作为测试样本的类别
利用KNN对iris数据集分类
部分代码如下
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris iris = load_iris() X = iris.data[:,:2] Y = iris.target print(iris.feature_names) cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF']) cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF']) clf = KNeighborsClassifier(n_neighbors = 10,weights = 'uniform') clf.fit(X,Y) #画出决策边界 x_min,x_max = X[:,0].min()-1,X[:,0].max()+1 y_min,y_max =y,Z,cmap = cmap_light) #绘制预测结果图 plt.scatter(X[:,0],X[:,1],c = Y,cmap = cmap_bold) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title('3_Class(k = 10,weights = uniform)') plt.show()
创作不易 觉得有帮助请点赞关注收藏~~~