天气数据集

该数据集,已有的天气状况、温度、湿度还有风力信息,预测是否适合出去游玩。在算法设计中可以把天气状况、温度、湿度还有风力信息作为算法的输入,是否适合游玩作为输出结果。

代码实现

导入包

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from collections import defaultdict
import collections
import math
import pickle
import operator

定义属性、划分数据集

将1-12条作为训练数据集,13-16作为测试数据集

#定义属性值
outlook = ["晴朗", "多云","雨天"]
Temperature = ["高温", "中温","低温"]
Humidity = ["高湿","一般"]
Wind = ["大", "小"]
PlayTennis=["是","否"]
Play = []
Play.append(outlook)
Play.append(Temperature)
Play.append(Humidity)
Play.append(Wind)
Play.append(PlayTennis)#数据集
data = [  ["晴朗","高温","高湿","小","否"],["晴朗","高温","高湿","大","否"],["多云","高温","高湿","小","是"],["雨天","中温","高湿","小","是"],["雨天","低温","一般","小","是"],["雨天","低温","一般","大","否"],["多云","低温","一般","大","是"],["晴朗","中温","高湿","小","否"],["晴朗","低温","一般","小","是"],["雨天","中温","一般","小","是"],["晴朗","中温","一般","大","是"],["多云","中温","高湿","大","是"],["晴朗","高温","一般","小","是"],["多云", "高温", "一般", "小", "是"],["雨天","中温","高湿","大","否"],["晴朗","中温","高湿","大","否"]]length = len(data)
#划分数据集,将1-12条作为训练数据集,13-16作为测试数据集
train = data[:12]
train_length = len(train)
print("训练数据集")
for i in range(train_length):print(train[i])
test= data[12:]
test_length = len(test)
print("测试数据集")
for i in range(test_length):print(test[i])

朴素贝叶斯算法实现

  1. 提取数据集数据(见上)
  2. 分析处理数据集数据 (见上)
  3. 计算概率(先验概率、条件概率、联合概率)
  4. 根据贝叶斯公式计算预测概率
    其中处理不同数据类型(伯努利,多项式,连续型)和0概率情况,还用到了: 概率密度函数、拉普拉斯平滑
def count_PlayTennis_total(data):count = defaultdict(int)for i in range(train_length):count[data[i][4]]+=1return count#先验概率
def cal_base_rates(data):y = count_PlayTennis_total(data)cal_base_rates = {}for label in y.keys():priori_prob = (y[label]+1) / (len(train)+2)cal_base_rates[label] = priori_probreturn cal_base_ratesprint(cal_base_rates(train))def count_sj(attr, Play):for i in range(len(Play)):if attr in Play[i]:return len(Play[i])#似然概率p(x|y) 也叫条件概率
def likelihold_prob(data):#计算各个特征值在已知结果下的概率(likelihood probabilities)y = count_PlayTennis_total(data)likelihold = {}for i,c in y.items():#创建一个临时的字典,临时存储各个特征值的概率attr_prob = defaultdict(int)for j in range(train_length):if data[j][4]==i:for attr in range(4):attr_prob[data[j][attr]]+=1for keys,values in attr_prob.items():sj =  count_sj(keys, Play)attr_prob[keys]=(values+1)/(c+sj)likelihold[i] = attr_probreturn likeliholdLikeHold = likelihold_prob(train)def Test(data,test):y = count_PlayTennis_total(data)likehold = likelihold_prob(data)playtennis = cal_base_rates(data)RATE = defaultdict(int)print(test)for i, _ in y.items():rates=1for j in range(4):attr = test[j]rates *= likehold[i][attr]rates=rates * playtennis[i]RATE[i] = ratesprint("预测结果: " )print(RATE)return sorted(RATE,key=lambda x:RATE[x])[-1]#先验概率
cal_base_rates(train)
# 条件概率
likelihold_prob(train)


结果预测

Test(train,test[0][:4])

Test(train,test[1][:4])

Test(train,test[2][:4])

Test(train,test[3][:4])

决策树算法实现

  1. 特征选择:分别计算特征分类后的类别,然后选择合适的类别,然后选择合适的类别
  2. 构建决策树
    1)从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征。
    2)由该特征的不同取值建立子节点,再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止;
    3)最后得到一个决策树。
#计算信息熵
def cal_entropy(dataset):length = len(dataset)entropy = 0count = {}for i in dataset:label = i[-1]count[label] = count.get(label, 0) + 1for key in count:p = count[key] / lengthentropy = entropy - p * math.log(p, 2)return entropy
#划分数据集
def splitDataSet(dataSet, axis, value):childDataSet = []for i in dataSet:if i[axis] == value:childList = i[:axis]childList.extend(i[axis + 1:])childDataSet.append(childList)# print(childDataSet)return childDataSet
#选择最好的特征
def chooseFeature(dataset):old_entropy = cal_entropy(dataset)character = -1for i in range(len(dataset[0]) - 1):newEntropy = 0featureList = [word[i] for word in dataset]value = set(featureList)for j in value:childDataSet = splitDataSet(dataset, i, j)newEntropy += len(childDataSet) / len(dataset) * cal_entropy(childDataSet)if (newEntropy < old_entropy):character = iold_entropy = newEntropyreturn character
#当遍历完所有特征时,用于选取当前数据集中最多的一个类别代表该类别
def most(classList):classCount = {}for i in range(len(classList)):classCount[i] = classCount.get(i, 0) + 1sortCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)# print(sortCount)return sortCount[0][0]#构造决策树
def createDT(dataSet, labels):# print(dataSet)tempLabels=labels[:]classList = [word[-1] for word in dataSet]if classList.count(classList[0]) == len(classList):return classList[0]if len(dataSet[0]) == 1:return most(dataSet)character = chooseFeature(dataSet)node = tempLabels[character]myTree = {node: {}}del (tempLabels[character])featureList = [word[character] for word in dataSet]value = set(featureList)for i in value:newLabels = tempLabelsmyTree[node][i] = createDT(splitDataSet(dataSet, character, i), newLabels)return myTree#分类
def classify(dTree, labels, testData):node = list(dTree.keys())[0]condition = dTree[node]labelIndex = labels.index(node)classLabel=Noneprint(testData)for key in condition:if testData[labelIndex] == key:if type(condition[key]).__name__ == 'dict':# print("预测结果: " )classLabel=classify(condition[key], labels, testData)else:print("预测结果: " )classLabel = condition[key]return classLabel#用于将构建好的决策树保存,方便下次使用
def stroeTree(myTree,filename):f=open(filename,'wb')pickle.dump(myTree,f)f.close()
#载入保存的决策树
def loadTree(filename):f=open(filename,'rb')return pickle.load(f)labels = ['天气状况','温度','湿度','风力','是否适合游玩(预测变量)']
myTree=createDT(train, labels )
stroeTree(myTree,'1')
myTree=loadTree('1')
print(myTree)


结果预测

classify(myTree,labels,test[0][:4])

classify(myTree,labels,test[1][:4])

classify(myTree,labels,test[2][:4])

classify(myTree,labels,test[3][:4])

Python实现决策树算法和朴素贝叶算法,并根据天气数据集预测是否出游相关推荐

  1. python画图决策树算法分类_分类算法之决策树(理论篇)

    起步 决策树(decision tree)是一个树结构,可以是二叉树或非二叉树,也可以把他看作是 if-else 规则的集合,也可以认为是在特征空间上的条件概率分布. 决策树的结构 以一个简单的用于是 ...

  2. python朴素贝叶斯分布对数据的要求_统计学习方法与Python实现(三)——朴素贝叶斯法...

    统计学习方法与Python实现(三)--朴素贝叶斯法 1.定义 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布.然 ...

  3. 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树

    目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...

  4. 分析决策树算法和逻辑回归算法的不同之处

    首先我们导入一组airplan.xlsx数据. 数据表中的age表示年龄.FLIGHT_COUNT表示飞行次数.BASE_POINTS_SUM表示飞行里程.runoff_flag表示流失与否,定义1为 ...

  5. 决策树算法(C4.5算法)

    决策树算法(C4.5算法) 1.1 题目的主要研究内容 组的主要任务描述 熟悉和掌握决策树的分类原理.实质和过程,掌握决策树典型算法(ID3.C4.5.CART)的核心思想和实现过程. (2)自己工作 ...

  6. 机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测

    目录 一.简介和环境准备 简介: 环境: 二.实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入.分析 ...

  7. python实现决策树算法sklearn_GitHub - cbyonder/lihang_algorithms: 用python和sklearn两种方法实现李航《统计学习方法》中的算法...

    lihang_algorithms 用python和sklearn实现李航老师的<统计学习方法>中所提到的算法 实验数据:MNIST数据集,这里用kaggle中处理好的数据 官方下载地址: ...

  8. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制

    封面图片:<Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社 图书详情(京东): ================= 关于朴素贝叶斯算法中文垃圾邮件分 ...

  9. matlab算法用python做_机器学习笔记—朴素贝叶斯算法实现(matlab/python)

    原理知道一百遍不如自己动手写一遍,当然,现在基本上不需要自己来写算法的底层code了,各路大神们已经为我等凡夫俗子写好了,直接调用就行. 这里介绍在MATLAB中和Python中应用贝叶斯算法的小例子 ...

最新文章

  1. 机器人懂点「常识」后,找东西方便多了:CMU打造新型语义导航AI机器人
  2. mysql定制化_【MySQL技巧】定制你的MySQL命令行-阿里云开发者社区
  3. 十年Java编程开发生涯,java内存溢出和内存泄漏的区别
  4. 《网易智企技术合辑》正式发布
  5. android 全局 socket,学习Android socket通信之如何解决中文乱码
  6. python查微信好友是否删除自己_Python + Appium 自动化操作微信查找自己是否被删除...
  7. 面试必会系列 - 1.2 Java 集合,源码讲解
  8. python调用shell脚本
  9. ContentProvider与ContentResolver
  10. python称号_C 语言荣获 2019 年度最佳编程语言称号
  11. 机器学习基础:主成分分析(Machine Learning Fundamentals: PCA)
  12. Windows下CodeLite支持中文的正确设置方法
  13. 算法:求树的最大深度104. Maximum Depth of Binary Tree
  14. 模拟集成电路设计基础知识(一):MOS管结构及其I/V特性
  15. SAR成像(一):线性调频信号(LFM)和脉冲压缩
  16. 最好用的三款软件,满足你对截图的所有需求!
  17. springboot 项目中用doc转成PDF
  18. 往超级表格导入Excel,让数据处理不再繁杂!
  19. java面试题系列10
  20. 怎样使PPT自动播放

热门文章

  1. 迅捷音频转换器怎么使用? 1
  2. android TextView 分散对齐(两端对齐)
  3. (二)FirePower-FTD初始化设置并加入到FMC管理
  4. python读取txt每一行按照正则匹配hon-正则表达式使用python从文件中过滤和删除特定的多行文本...
  5. 戴眼镜总是不舒服,你的眼镜真的适合你吗?
  6. Java序列化与反序列化(一)
  7. 清华梦的粉碎——写给清华大学的退学申请by王垠
  8. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
  9. 射频流盘与射频孪生——流盘技术应用(1)
  10. 5W1H1V分析法帮你快速了解产品