目录
2,写出决策树中ID3、C4.5、C5.0、CART四种算法中度量纯度的指标
(1)ID3算法使用信息增益(Information Gain)作为纯度度量指标。
(2)C4.5算法使用信息增益比(Gain Ratio)作为纯度度量指标。
(3)C5.0算法与C4.5算法相似,也使用信息增益比作为纯度度量指标。
(4)CART(Classification And Regression Trees)算法使用基尼系数(Gini Index)作为纯度度量指标。
1,写出葡萄酒分类中K近邻分类法的过程
给出5个训练样本,其中每个样本包含两个属性:“酒精含量”和“苹果酸含量”(数据均已经过预处理),对应这两个分类:“葡萄酒A(对应标签为0)”和“葡萄酒B(对应标签为1)”,现给出1个待分类样本的两个属性值,根据K近邻分类法原理给出对应的分类标签(给出具体的计算过程,以及选择不同K值的对应结果)。
原始样本 | 酒精含量(%) | 苹果酸含量(%) | 分类 |
样本1 | 5 | 2 | 0 |
样本2 | 6 | 1 | 0 |
样本3 | 4 | 1 | 0 |
样本4 | 8 | 3 | 1 |
样本5 | 10 | 2 | 1 |
待分类样本 | 7 | 1 | ? |
分析:
对于一个新的数据而言,K近邻算法的目的就是在已有数据中寻找与它最相似的K个数据,或者说“离它最近”的K个数据,如果这K个点大多数属于某一个类别,则该样本也属于这个类别。
得到以下代码:
demo1:
from numpy import *
import operator
def createDataSet():
group = array([[5, 2], [6, 1], [4, 1], [8, 3], [10, 2]])
labels = ['0', '0', '0', '1', '1']
return group, labels
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistance = sqDiffMat.sum(axis=1)
distance = sqDistance ** 0.5
sortedDistance = distance.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistance[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
demo1_1:
import demo1
group, labels = demo1.createDataSet()
print(group)
print(labels)
print(demo1.classify0([0, 0], group, labels, 3))
最终的到结果:
结论:
根据上面的结果,可以得到待分类样品为‘0’,也就是葡萄酒A.
如果需要取不同的K值来计算结果:
令K值等于1,也就是以离新样本距离最近的原始样本的种类作为新样本的种类,那么新样本离样本2最近,那么新样本的分类为0,也就是葡萄酒A。
令K值等于2,虽然有两个分类,但是它会优先选择2个分类结果中离它最近的那个。
令K值等于3,那么就是以离新样本最近的3个原始样本的多数样本的种类为判断依据,此时最近的3个原始样本是样本2、样本1、样本4,它们中以分类0居多,所以判定新样本的分类为0,也就是葡萄酒A。
2,写出决策树中ID3、C4.5、C5.0、CART四种算法中度量纯度的指标
决策树的构建是基于样本概率和纯度进行构建操作的,判断数据集“纯”的指标有:Gini 指数、信息熵、不确定性、错误率、标准方差。值越小,说明越“纯”。并且他们有以下关系:
信息熵:可以理解为衡量不确定性的指标。
Gini 指数:可以理解为衡量错误率的指标。
决策树的生产过程本质是对训练样本集的不断分组过程。决策树上的各个分枝是在数据不断分组的过程中逐渐生长出来的。决策树生长的核心技术是测试属性选择问题。
(1)ID3算法使用信息增益(Information Gain)作为纯度度量指标。
其中,D表示当前数据集,a表示候选属性,|D|表示数据集样本总数,|DV|,表示划分后目标属性为v的样本集合,V表示目标属性可能的取值数。Ent(D)表示当前数据集的信息熵,,其中Pk表示类别k在数据集中出现的概率。
优点:
决策树构建速度快;实现简单;
缺点:
1,计算依赖于特征取值数目较多的特征,而属性值最多的属性并不一定最优,因为ID3构建决策树的时候固定构建的是多叉树,假如现在有X1,X2两个特征,X1有5种取值,X2有2种取值,现在将其构建成多叉树,如果以X1特征分裂会分成5个节点,每个节点只有2个,按照X2特征进行分裂的话,每个节点有5个样本,那么这个时候肯定按照X1特征进行分裂的树分裂后更纯。就意味着最终构建的决策树就依赖于属性值多的特征。
2,ID3算法不是递增算法
3,ID3算法是单变量决策树,对于特征属性之间的关系不会考虑
3.1单变量(属性)决策树
在进行分了的时候,每一次分裂只由于一个特征决定。(X1 = 是,X1=否)
3.2多变量(属性)决策树
反之,分裂时由多个特征决定(X1 = 是X2=否,X1=否X2=是)
4,抗噪性差
不做限制,训练集可以达到100%正确,但是,当有异常数据进来时,很容易被分错。
5,只适合小规模数据集,需要将数据放到内存中
(2)C4.5算法使用信息增益比(Gain Ratio)作为纯度度量指标。
其中IG(D,a),表示信息增益,IV(D,a)表示固有值(Intrinsic Value),是一个基于候选属性a的所有可能取值对当前数据集DD的信息熵的加权平均值.
优点:
- 产生的规则易于理解
- 准确率较高
- 实现简单
缺点:
- 对数据集需要进行多次顺序扫描和排序(,对连续特征进行分裂,实现连续特征离散化),所以效率较低
- 只适合小规模数据集,需要将数据放到内存中
(3)C5.0算法与C4.5算法相似,也使用信息增益比作为纯度度量指标。
(4)CART(Classification And Regression Trees)算法使用基尼系数(Gini Index)作为纯度度量指标。
其中,Pk表示类别k在数据集中出现的概率。
3,三种算法总结对比
- ID3、C4.5和CART算法均只适合在小规模数据集上使用
- ID3、C4.5和CART算法都是单变量决策树
- 当属性值取值比较多的时候,最好考虑C4.5算法,ID3得出的效果会比较差
- 决策树分类一般情况只适合小数据量的情况(数据可以放内存)
- CART算法是三种算法中最常用的一种决策树构建算法
- 三种算法的区别仅仅只是对于当前树的评价标准不同而已,ID3使用信息增益、C4.5使用信息增益率、CART使用基尼系数。
- CART算法构建的一定是二叉树,ID3和C4.5构建的不一定是二叉树。
4,实验
Data中给出400个样本,每个样本提供了四个属性“ID”、“性别”、“年龄”、“收入估计”,并给出对应的标签(客户对该产品是否购买的意愿,0为不购买,1为购买).选择样本中两个属性“年龄”和“收入估计”来作为输入属性,来构建模型预测用户是否购买该产品。
要求:
- 分别使用逻辑回归、K近邻分类、决策树三种方法来搭建模型;
- 模型构建中要求将数据集按照一定的比例划分训练集和测试集;
- 给出三个算法的代码截图和结果图;
- 给出三个算法的性能度量比较。
User ID | Gender | Age | EstimatedSalary | Purchased |
15624510 | Male | 19 | 19000 | 0 |
15810944 | Male | 35 | 20000 | 0 |
15668575 | Female | 26 | 43000 | 0 |
15603246 | Female | 27 | 57000 | 0 |
15804002 | Male | 19 | 76000 | 0 |
15728773 | Male | 27 | 58000 | 0 |
15598044 | Female | 27 | 84000 | 0 |
15694829 | Female | 32 | 150000 | 1 |
15600575 | Male | 25 | 33000 | 0 |
15727311 | Female | 35 | 65000 | 0 |
15570769 | Female | 26 | 80000 | 0 |
15606274 | Female | 26 | 52000 | 0 |
15746139 | Male | 20 | 86000 | 0 |
15704987 | Male | 32 | 18000 | 0 |
15628972 | Male | 18 | 82000 | 0 |
四百条数据。
(1)逻辑回归
import pandas as pd
from sklearn.linear_model import LogisticRegression
# 读取数据
data = pd.read_csv('Data.csv')
# 提取特征和标签
X = data[['Age', 'EstimatedSalary']]
y = data['Purchased']
# 构建逻辑回归模型
model = LogisticRegression(random_state=0).fit(X, y)
# 预测新数据
new_data = [[25, 60000], [35, 80000]]
predicted = model.predict(new_data)
print("预测购买的可能为:"+predicted)
(2)K近邻分类
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
# 读取数据
data = pd.read_csv('Data.csv')
# 提取特征和标签
X = data[['Age', 'EstimatedSalary']]
y = data['Purchased']
# 构建K近邻分类模型
model = KNeighborsClassifier(n_neighbors=3).fit(X, y)
# 预测新数据
new_data = [[25, 60000], [35, 80000]]
predicted = model.predict(new_data)
print(predicted)
(3)决策树
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import graphviz
# 读取数据
data = pd.read_csv('Data.csv')
# 提取特征和标签
X = data[['Age', 'EstimatedSalary']]
y = data['Purchased']
# 构建决策树模型
model = DecisionTreeClassifier(criterion='entropy').fit(X, y)
# 可视化决策树
dot_data = tree.export_graphviz(model, out_file=None,
feature_names=['Age', 'EstimatedSalary'],
class_names=['不购买', '购买'],
filled=True, rounded=True,
special_characters=True)
graph = graphviz.Source(dot_data)
graph.view()
# 预测新数据
new_data = [[25, 60000], [35, 80000]]
predicted = model.predict(new_data)
print("准确率:"+predicted)
逻辑回归准确性为:0.90;
K 近邻分类准确性为:0.92;
决策树的准确性为:0.83;
K 近邻分类准确性高于其他两个算法的准确率。