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实现天气决策树模型的主要内容,如果未能解决你的问题,请参考以下文章

决策树模型及案例(Python)

决策树---ID3算法(介绍及Python实现)

Matlab决策树对空气质量和天气温度及天气数据做交通出行推荐预测

Spark MLlib速成宝典模型篇05决策树Decision Tree(Python版)

机器学习决策树ID3算法,手把手教你用Python实现

python-sklearn数据拆分与决策树的实现