实验用python实现决策树和随机森林分类

1.实验目的

1.会用Python提供的sklearn库中的决策树算法对数据进行分类
2.会用Python提供的sklearn库中的随机森林算法对数据进行分类
3.会用Python提供的方法对数据进行预处理

2.设备与环境

使用Spyder并借助Python语言进行实现

3.实验原理

决策树( Decision Tree) 又称为判定树,是数据挖掘技术中的一种重要的分类与回归方法,它是一种以树结构(包括二叉树和多叉树)形式来表达的预测分析模型。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
决策树的构建
1.特征选择:选取有较强分类能力的特征。
2.决策树生成:典型的算法有 ID3 和 C4.5, 它们生成决策树过程相似, ID3 是采用信息增益作为特征选择度量, 而 C4.5 采用信息增益比率。
3.决策树剪枝:剪枝原因是决策树生成算法生成的树对训练数据的预测很准确, 但是对于未知数据分类很差, 这就产生了过拟合的现象。涉及算法有CART算法。
在这里插入图片描述
在这里插入图片描述

4.实验内容

使用决策树算法和随机森林算法对income_classification.csv的收入水平进行分类。训练集和测试集的比例是7:3,选取适当的特征列,使得针对测试样本的分类准确率在80%以上,比较2种分类方法的准确率。
数据说明:

特征列:
age:年龄,整数
workclass:工作性质,字符串
education:教育程度,字符串
education_num:受教育年限,整数
maritial_status:婚姻状况,字符串
occupation:职业,字符串
relationship:亲戚关系,字符串
race:种族,字符串
sex:性别,字符串
capital_gain:资本收益,浮点数
capital_loss:资本损失,浮点数
hours_per_week:每周工作小时数,浮点数
native_country:原籍,字符串

分类标签列:income
imcome > 50K
Imcome ≤ 50K

1.读入数据并显示数据的维度和前5行数据
import pandas as pd
import numpy as np
2. 对连续变量年龄进行离散化,并显示前5行数据离散化后的结果
age_bins = [20, 30,40, 50, 60, 70]
3.对属性是字符串的任意特征进行数字编号处理,显示前5行编码后的结果,每个特定的字符串用一个整数来表示,整数序列从0开始增长。
from sklearn.preprocessing import LabelEncoder
enc = LabelEncoder()
4.对预处理后的数据用决策树算法和随机森林算法分类

实验步骤

  1. 选择合适的若干特征字段
  2. 按7:3划分训练集和样本集
  3. 使用训练集训练一个决策树分类器
  4. 使用测试集计算决策树分类器的分类准确率
  5. 使用训练集训练一个随机森林分类器
  6. 使用测试集计算随机森林分类器的分类准确率
    fromsklearn.ensemble import RandomForestClassifier
    from sklearn importtree
    fromsklearn.preprocessing import LabelEncoder
    fromsklearn.feature_extraction import DictVectorizer
    accuracy_random =clf_random.score(xTest, yTest)

5.实验结果分析

利用决策树和随机森林求解得到的结果如下:
在这里插入图片描述
在这里插入图片描述

6.附录(代码)

#决策树和随机森林:
import numpy as np
import pandas as pd
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import LabelEncoder

print('1.载入数据.....')
data = pd.read_excel(r"C:\Users\user\Desktop\income_classification.xlsx", header=0)
print('数据的维度和前五行数据:', data.shape)
print(data.head())

print('对连续变量age进行离散化处理,等宽分成五类,显示前五行:')
AGE_CUT = pd.cut(x=data['age'], bins=5, labels=range(0, 5))
data['age'] = AGE_CUT
print(data.head(5))
class_le = LabelEncoder()
data['workclass'] = pd.DataFrame(class_le.fit_transform(data['workclass']))
data['marital-status'] = pd.DataFrame(class_le.fit_transform(data['marital-status']))
data['occupation'] = pd.DataFrame(class_le.fit_transform(data['occupation']))
data['education'] = pd.DataFrame(class_le.fit_transform(data['education']))
data['native-country'] = pd.DataFrame(class_le.fit_transform(data['native-country']))
data['relationship'] = pd.DataFrame(class_le.fit_transform(data['relationship']))
data['race'] = pd.DataFrame(class_le.fit_transform(data['race']))
data['sex'] = pd.DataFrame(class_le.fit_transform(data['sex']))
print('显示前五行编码后的结果:')
print(data.head(5))
data1 = []
labels = []
for index, row in data.iterrows():
    # data需要是字典形式,因为之后需要使用DictVectorizer()修改字符串数据类型,以便符合DecisionTreeClassifier()
    rowDict = {}
    row = list(row)
    rowDict['age'] = row[0]
    rowDict['workclass'] = row[1]
    rowDict['education'] = row[2]
    rowDict['education_num'] = row[3]
    rowDict['maritial_status'] = row[4]
    rowDict['occupation'] = row[5]
    rowDict['relationship'] = row[6]
    rowDict['race'] = row[7]
    rowDict['sex'] = row[8]
    rowDict['capital_gain'] = row[9]
    rowDict['capital_loss'] = row[10]
    rowDict['hours_per_week'] = row[11]
    rowDict['native_country'] = row[12]
    data1.append(rowDict)
    labels.append(row[-1])

print('2. 构造数据和标签.....')
x = np.array(data1)
labels = np.array(labels)
y = np.zeros(labels.shape)  # 初始label全为0
y[labels == '<=50K'] = 0  # 当label等于这三种属性的话,设置为1。
y[labels == '>50K'] = 1

# 转换字符串数据类型
print('3.转换字符串数据类型.....')
vec = DictVectorizer()
dx = vec.fit_transform(x).toarray()

# 拆分成训练数据和测试数据
print('4.拆分训练数据和测试数据.....')
print('训练集和验证集比例7:3')
ratio = 0.7
xTrain = []
yTrain = []
xTest = []
yTest = []
features = xTrain, xTest
labels = yTrain, yTest
for i in range(len(dx)):
    dataSetIndex = 0 if np.random.random() < ratio else 1
    features[dataSetIndex].append(dx[i])
    labels[dataSetIndex].append(y[i])

# CART决策树分类
print('5.CART决策树分类.....')
clf_cart = tree.DecisionTreeClassifier(criterion='entropy')  # CART算法,使用entropy作为标准;默认是是用gini作为标准
clf_cart.fit(xTrain, yTrain)

# 检查准确率
accuracy_cart = clf_cart.score(xTest, yTest)
print('CART树分类准确率:', accuracy_cart)

print('6.随机森林分类.....')
clf_random = RandomForestClassifier()
clf_random.fit(xTrain, yTrain)

# 检查准确率
accuracy_random = clf_random.score(xTest, yTest)
print('随机森林分类准确率:', accuracy_random)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/253378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【合成数字】合成类游戏-uniapp项目开发流程详解

以前玩过2048游戏&#xff0c;从中发现规律&#xff0c;想到跟合成类游戏相似&#xff0c;知道为什么很相似吗&#xff0c;在这里&#xff0c;做一个数字合成游戏玩玩吧&#xff0c;感兴趣的话可以看看&#xff0c;这里给大家讲一讲数字合成游戏的开发过程。 文章目录 创建项目…

spring事务不生效的场景有哪些

参考文章地址 百度安全验证&#xff0c;https://www.cnblogs.com/novwind/p/17461448.html 这里讨论的是声明式事务的不生效场景。编程式事务不在此处讨论 要说明spring中哪些场景事务不生效&#xff0c;就要说明spring的事务控制是如何实现的。Spring框架中事务控制的运行原理…

磁力计LIS2MDL开发(2)----电子罗盘

磁力计LIS2MDL开发.2--电子罗盘 概述视频教学样品申请源码下载环境磁场建模消除硬铁误差软铁干扰主程序 概述 本文将介绍如何使用 LIS2MDL 传感器来读取数据来转化为指南针。 地磁场强度范围约为 23,000 至 66,000 nT &#xff0c;并且可以建模为磁偶极子&#xff0c;其场线起…

10天玩转Python第8天:python 文件和异常 全面详解与代码示例

今日内容 文件操作 普通文件的操作json 文件的操作[重点] 异常处理(程序代码运行时的报错) 文件介绍 计算机的 文件&#xff0c;就是存储在某种 长期储存设备 上的一段 数据 作用: 将数据长期保存下来&#xff0c;在需要的时候使用 ​ 1.计算机只认识 二进制(0 1) 2.文件中…

CMA、CNAS软件检测公司分享:压力测试应关注的指标和面临的问题

软件压力测试是容易被传统企业忽视的测试点&#xff0c;用户人数一旦超过预期&#xff0c;极易造成软件产品卡顿、崩溃的情况&#xff0c;不利于用户正常使用&#xff0c;严重影响企业公信力和盈利水平。今天卓码软件测评小编来聊聊压力测试过程中应该关注的指标和会面临的问题…

Mysql存储引擎-InnoDB

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

电商平台如何选择分账系统

电商平台尤其是多用户商城系统&#xff0c;它属于资源整合型平台&#xff0c;随着商户的入驻&#xff0c;它会面临一个问题&#xff1a;钱要分给谁、分多少、怎么分的问题&#xff0c;今天&#xff0c;商淘云小编与您分享如何选择分账系统。 第一种是银行的分账系统&#xff0c…

1850_emacs_org-download在Windows上的使用

Grey 全部学习内容汇总&#xff1a; https://github.com/greyzhang/g_org 1850_emacs_org-download在Windows上的使用 对我来说&#xff0c;使用emacs很大的一个挑战是在Windows上&#xff0c;emacs的配置会比Linux上麻烦一些。而且&#xff0c;通常来说Windows上的体验会差…

详细了解云堡垒机的作用,提高企业数据信息安全

随着上云企业的不断增加&#xff0c;云上数据安全性成为企业面临的重要问题。为了保障企业的核心数据安全&#xff0c;越来越多的企业采购了云堡垒机来提升数据安全性。今天我们就来详细了解一下云堡垒机的作用&#xff0c;以及如何提高企业数据安全。 一、云堡垒机定义 云堡垒…

【精选】计算机网络教程(第2章网络层)

目录 前言 第2章网络层 1、编码与调制 2、传输方式 前言 总结计算机网络教程课程期末必记知识点。 第2章网络层 1、编码与调制 信道可以分成传送模拟信号的模拟信道和传送数字信号的数字信道两大类。通常人们将数字数据转换成数字信号的过程称为编码&#xff0c;而将数字…

探索 HBase GUI 工具,助您轻松驾驭大数据世界!

你是否曾为 HBase 数据管理而苦恼&#xff1f;别担心&#xff0c;这一款超级好用的 HBase GUI &#xff08;HBase Assistant&#xff09;工具&#xff0c;让您在大数据世界中游刃有余。不再需要繁琐的命令行操作&#xff0c;也不再为复杂的配置感到头疼。 主要功能 直观和设计…

matlab面向对象编程入门笔记

文章目录 1. 类和结构2. 定义类3. 属性3.1 private/protected/public属性3.2 constant属性3.3 hidden属性 4. 方法4.1 private/protected/public方法4.2 static方法4.3 外部方法 5. 动态调用6. 继承-超类6.1 handle超类6.2 dynamicprops 和 hgsetget子类 7. 封闭(sealed)类、方…

STM32_通过Ymodem协议进行蓝牙OTA升级固件教程

目录标题 前言1、OTA升级的重要性和应用场景2、理论基础2.1、单片机的启动流程2.2、什么是IAP&#xff1f;2.3、什么是OTA&#xff1f;2.4、什么是BootLoader&#xff1f;2.5、Ymodem协议是什么&#xff1f;2.6、IAP是如何实现的&#xff1f; 3、具体操作3.1、软硬件工具准备3.…

类加载机制

1.类加载的生命周期 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中&#xff0c;加载、验证、准备和初始化这四个阶段发生的顺序是确定的&#xff0c;而解析阶段则不一定&#xff0c;它在某些情况下可以在初始化阶段之后开始&#xff0c;这是为…

计算机中msvcr120.dll丢失怎样修复,这5个方法可以搞定

几乎在所有操作系统中&#xff0c;可分为两种库&#xff0c;一种是静态库&#xff08;.lib&#xff09;&#xff0c;另一种是动态库&#xff08;.dll&#xff09;。 为什么很多小伙伴在打开软件的时候会弹出“由于找不到XXX.dll文件&#xff0c;无法继续执行代码、、、、、、”…

大数据技术之 Kettle(PDI)

Kettle 第一章 Kettle概述1.1、ETL简介1.2、Kettle简介1.3、作业 和 转换 概念1.4、核心组件1.5、下载安装 第二章 控件使用2.1、初体验&#xff1a;csv 转换 excel 示例2.2、转换2.2.1、输入控件2.2.1.1、表输入 2.2.2、输出控件2.2.2.1、表输出2.2.2.2、更新&插入/更新2.…

分享66个Java源码总有一个是你想要的

分享66个Java源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1hKlZJB3KrHcOuKWyV1xjKw?pwd6666 提取码&#xff1a;6666 项目名称 ava web个人网站项目 ea…

【C++11特性篇】C++11中の【override】【final】关键字——帮助用户检测是否重写

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.【override】【final】关键字——帮…

软件测试之鲁棒性测试

文章目录 前言一、鲁棒性测试是什么&#xff1f;二、鲁棒性测试的目的三、测试原理3.1 错误数据处理3.2 异常情况处理 前言 Bootloader软件刷写鲁棒性(Robustness)测试是指对Bootloader软件进行连续多次的刷写测试&#xff0c;且一次Fail都没发生&#xff0c;以此验证Bootload…

基于java+swing+mysq学生成绩管理系统(含课程报告)

基于javaswingmysq学生成绩管理系统_含课程报告 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f; 四、其它1.其他系统实现 五、源码下载 一、系统介绍 本系统使用 Swing MySQL IntelliJ IDEA 开发。为管理人员提供…