Python实现天气决策树模型
Posted 温酒待君归
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python实现天气决策树模型相关的知识,希望对你有一定的参考价值。
本次作业为实现天气预测的树模型,图部分没有实现,但是,框架部分实现了。
操作系统:win 10
编辑环境:anaconda
Python版本:3.6
先给出代码:
from math import log import operator def calcShannonEnt(dataSet): #计算数据的熵 numEntries=len(dataSet) #数据条数 labelCounts={} for featVec in dataSet: currentLabel=featVec[-1]#每一行最后一个字(类别) if currentLabel not in labelCounts.keys(): labelCounts[currentLabel]=0 labelCounts[currentLabel]+=1 #统计有多少个类似以及每个类的数量 shannonEnt=0 for key in labelCounts: prob=float(labelCounts[key])/numEntries #计算单个类的熵值 shannonEnt-=prob*log(prob,2)#累加每个类的熵值 return shannonEnt def createDataSet1(): #创建示例数据 dataSet = [[\'晴天\',\'高温\',\'中湿\',\'无风\',\'不宜\'], [\'晴天\',\'高温\',\'中湿\',\'有风\',\'不宜\'], [\'多云\',\'高温\',\'低湿\',\'无风\',\'适宜\'], [\'雨天\',\'低温\',\'高湿\',\'无风\',\'适宜\'], [\'雨天\',\'低温\',\'低湿\',\'无风\',\'适宜\'], [\'雨天\',\'低温\',\'低湿\',\'有风\',\'不宜\'], [\'多云\',\'低温\',\'低湿\',\'有风\',\'适宜\'], [\'晴天\',\'中温\',\'高湿\',\'无风\',\'不宜\'], [\'晴天\',\'低温\',\'低湿\',\'无风\',\'适宜\'], [\'雨天\',\'中温\',\'低湿\',\'无风\',\'适宜\'], [\'晴天\',\'中温\',\'低湿\',\'有风\',\'适宜\'], [\'多云\',\'中温\',\'中湿\',\'有风\',\'适宜\'], [\'多云\',\'高温\',\'低湿\',\'无风\',\'适宜\'], [\'雨天\',\'中温\',\'低湿\',\'有风\',\'不宜\']] labels = [\'天气\',\'温度\',\'湿度\',\'风况\']#四个特征 return dataSet,labels def splitDataSet(dataSet,axis,value):#按某个特征分类后的数据 retDataSet=[] for featVec in dataSet: if featVec[axis]==value: reducedFeatVec = featVec[:axis] reducedFeatVec.extend(featVec[axis+1:]) retDataSet.append(reducedFeatVec) return retDataSet def chooseBestFeatureToSplit(dataSet): #选择最优的分类特征 numFeatures = len(dataSet[0])-1 baseEntropy = calcShannonEnt(dataSet)#原始的熵 bestInfoGain = 0 bestFeature = -1 for i in range(numFeatures): featList = [example[i] for example in dataSet] uniqueVals = set(featList) newEntropy = 0 for value in uniqueVals: subDataSet = splitDataSet(dataSet,i,value) prob = len(subDataSet)/float(len(dataSet)) newEntropy +=prob*calcShannonEnt(subDataSet)#按特征分类后的熵 infoGain = baseEntropy - newEntropy #原始熵与按特征分类后的熵的差值 if (infoGain>bestInfoGain):#若按某特征划分后,熵值减少的最大,则次特征为最优分类特征 bestInfoGain=infoGain bestFeature = i return bestFeature def majorityCnt(classList):#按分类后类别数量排序: classCount={} for vote in classList: if vote not in classCount.keys(): classCount[vote]=0 classCount[vote]+=1 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0] def createTree(dataSet,labels): classList=[example[-1] for example in dataSet] #类别 if classList.count(classList[0])==len(classList): return classList[0] if len(dataSet[0])==1: return majorityCnt(classList) bestFeat=chooseBestFeatureToSplit(dataSet)#选择最优特征 bestFeatLabel=labels[bestFeat] myTree={bestFeatLabel:{}}#分类结果以字典的形式保存 del(labels[bestFeat]) featValues=[example[bestFeat] for example in dataSet] uniqueVals=set(featValues) for value in uniqueVals: subLabels=labels[:] myTree[bestFeatLabel][value]=createTree(splitDataSet\\ (dataSet,bestFeat,value),subLabels) return myTree if __name__==\'__main__\': dataSet, labels=createDataSet1()#创造示例数据 print(createTree(dataSet,labels))#输出决策树模型
其实现结果为:
手动画出模型为:
另外,看看到一个利用自带函数的一个写法,笔者还没有实现,希望大家集思广益:
https://zhuanlan.zhihu.com/p/25428390
本文参考链接:
http://blog.csdn.net/csqazwsxedc/article/details/65697652
http://blog.csdn.net/liz_zhong/article/details/51448218
以上是关于Python实现天气决策树模型的主要内容,如果未能解决你的问题,请参考以下文章
Matlab决策树对空气质量和天气温度及天气数据做交通出行推荐预测