利用机器学习之决策树进行预测分析

本章主要使用的是sklearn库中的决策树

1 决策树(分类)基本概念

顾名思义,决策树就是一棵树,一棵决策树包含一个根节点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集,从根结点到每个叶子结点的路径对应了一个判定测试序列。

对于离散的分类任务,决策树最后生成的树叶是根据算法构建出的最优类别,如果没有限定决策树的最大高度等参数,树叶内的数据一般会是纯的,即一片树叶内只有一种类别,但是经过剪枝(后面会讲)操作后,叶节点的数据可能会不纯。

2 分类问题决策树生成原理

2.1 “纯度”判断

决策树学习的关键在于如何选择最优的划分属性,所谓的最优划分属性,对于分类而言,就是尽量使划分的样本属于同一类别,即“纯度”最高的属性。

那么,如何定义数据的“纯度”就成了问题的关键,现在的主流算法是CART算法,sklearn中DecisionTreeClassifier就是用的CART算法,其判别纯度的指标是entropy熵与Gini指数。

熵的公式为:

其中表示有种类别,是取第种类的概率,实际计算直接用第i种类别所占的比例代替,熵越大,表示此时的混乱程度越大,数据越不纯。

如果利用某一种指标将原数据 分为两类与 之后,在这个分类下,定义此时的条件熵为

接着定义信息增益:

基尼指数的公式为:

同样表示有种类别, 是 取第种类的概率,直观上说,基尼指数反映了从数据集中随机抽取两个样本,其类别标记不一致的概率,所以基尼指数也是越大表示越混乱。

同样地,利用某一种指标将原数据 分为两类与 之后,在这个分类下,定义此时的基尼指数为

相比于熵的对数运算,基尼指数只涉及平方与加法运算,所以在大数据量问题上,基尼指数有更快的运行速度。

2.2 CART算法思路

CART算法生成的决策树是二叉树,每一步只对某一个指标做出划分。如果特征是离散的取值,那么就对每个特征的每个不同的取值作为二叉树的判定标准,大于或者小于等于该值分成两类,并计算以该点分类后,新节点的信息增益(information entropy)或者基尼指数,以两个子节点的样本数占比进行加权计算;如果特征是连续的取值,那么以每两个相邻的特征取值的算术平均离散化。

具体来说,如果某一个特征 有 个连续的属性,那么对应的取值从小到大排列为 , 以 为其n-1个划分点,将特征 离散化。

2.3代码实现

import csv

import matplotlib.pyplot as plt
from pandas import DataFrame
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing
from sklearn import tree
import pandas as pd
materia = [0 for i in range(0, 100)]
pd = pd.read_excel('train.xlsx')
num = 0
for item in pd.ticketOffice:
    if item>40:
        materia[num] = "True"
    else:
        materia[num] = "False"
    num += 1
    # print(num)
pd.insert(3, "ticket", materia)
pd.drop(labels='ticketOffice',axis=1,inplace=True)
pd.to_csv('film.csv')
# print(pd)
print("训练数据统计:")
print("  共有:",len(pd),"行")
print("  共有:",len(pd.columns),"列")
print("  行列数为:", pd.shape)
print("  共有",pd.size,"个元素")

film_data=open('film.csv','rt')
reader = csv.reader(film_data)

#表头信息
headers = next(reader)
# print(headers)

feature_list = []
result_list = []

for row in reader:
    result_list.append(row[-1])
    #去掉首位列,
    feature_list.append(dict(zip(headers[1:-1],row[1:-1])))
# print(result_list)
# print(feature_list)
#
vec = DictVectorizer() #将数据类型转换成numpy annay
dummyx = vec.fit_transform(feature_list).toarray()
dummyY = preprocessing.LabelBinarizer().fit_transform(result_list)
#humity、outlook、temperature、windy
#high,normal;overcast、Rainy、sunny;cool,hot,mild;false,true;
# print('dummyx is ',dummyx)
# print('dummyY is ',dummyY)

clf = tree.DecisionTreeClassifier(criterion='entropy',random_state=0)
clf = clf.fit(dummyx,dummyY)
# print("clf:"+str(clf))
picture = tree.plot_tree(clf,max_depth=3,filled=True)
plt.show()
# import pydotplus
#
# dot_data = tree.export_graphviz(clf,
#                                 feature_names=vec.get_feature_names(),
#                                 filled=True,rounded=True,
#                                 special_characters=True,
#                                 out_file=None)
# graph = pydotplus.graph_from_dot_data(dot_data)
# graph.write_pdf("file.pdf")

#
##开始预测
A=([[1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0]])
predict_resurt=clf.predict(A)
print("=====================================")
print("根据以往爆火电影特征分析,此部电影")
if predict_resurt==1:
    print("的预测结果:电影不会爆火")
else:
    print("的预测结果:电影会爆火")
print("=====================================")

训练数据

训练数据

预测结果:

预测结果

决策树:

决策树

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胖羊驼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值