机器学习(有监督学习,掌握逻辑回归模型,掌握K近邻分类 原理,掌握决策树模型类型和原理)

目录

1,写出葡萄酒分类中K近邻分类法的过程

 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)作为纯度度量指标。

3,三种算法总结对比

4,实验

(1)逻辑回归

(2)K近邻分类

(3)决策树 


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)作为纯度度量指标。

IG(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Ent(D^{v})

        其中,D表示当前数据集,a表示候选属性,|D|表示数据集样本总数,|DV|,表示划分后目标属性为v的样本集合,V表示目标属性可能的取值数。Ent(D)表示当前数据集的信息熵,Ent(D)=- \sum_{k=1}^{k} P_{k}log_{2}P_{k},其中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为购买).选择样本中两个属性“年龄”和“收入估计”来作为输入属性,来构建模型预测用户是否购买该产品。

要求:

  1. 分别使用逻辑回归、K近邻分类、决策树三种方法来搭建模型;
  2. 模型构建中要求将数据集按照一定的比例划分训练集和测试集;
  3. 给出三个算法的代码截图和结果图;
  4. 给出三个算法的性能度量比较。
User IDGenderAgeEstimatedSalaryPurchased
15624510Male19190000
15810944Male35200000
15668575Female26430000
15603246Female27570000
15804002Male19760000
15728773Male27580000
15598044Female27840000
15694829Female321500001
15600575Male25330000
15727311Female35650000
15570769Female26800000
15606274Female26520000
15746139Male20860000
15704987Male32180000
15628972Male18820000

        四百条数据。 

(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 近邻分类准确性高于其他两个算法的准确率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会Java的MING

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值