关于数据挖掘的问题之经典案例

news2024/11/25 11:35:26

依据交易数据集 basket_data.csv挖掘数据中购买行为中的关联规则。

问题分析:

  • 如和去对一个数据集进行关联规则挖掘,找到数据集中的项集之间的关联性。

处理步骤:

  1. 首先导入了两个库,pandas 库和 apyori 库。pandas 库是 Python 用来处理数据的非常常用的库,而 apyori 库则是专门用于进行关联规则挖掘的算法库。 apyori 地址
  2. 接着读取数据集,将其转换为 DataFrame 对象 df。
  3. 将 df 中每个交易的商品项聚合成一个列表,存储到 transactions 列表中。这一步是为了将 df 转换为 apyori 库可用的格式。
  4. 使用 apyori 库提供的关联规则挖掘接口 apriori 进行挖掘。其中需要设置最小支持度、最小置信度、最小提升度和最小项集长度等参数。这些参数可以根据具体的应用场景进行调整,本代码中使用的参数值为 min_support=0.0025, min_confidence=0.2, min_lift=1.5, min_length=2。
  5. 最后,遍历挖掘出来的关联规则,将关联规则的结果输出到控制台上。

思考:

  1. 为了实现效果,首先必须将数据集的格式转换为 apyori 库可用的格式,也就是列表的形式。
  2. 根据实际应用场景,结合数据集的特点和需求,设置关联规则挖掘参数。
  3. 所有前期工作准备就绪之后,便开始遍历输出关联规则,查看结果并进行分析。根据输出的每条关联规则及其对应的支持度、置信度和提升度等信息,可以对数据集中的商品项之间的关系进行探索和分析。

代码解析

import pandas as pd
from apyori import apriori

导入 pandas 库,用于对数据进行处理;
导入 apyori 库,用于进行关联规则挖掘。

df = pd.read_csv('basket_data.csv', header=0, sep=',')

读取名为 basket_data.csv (当然也可以是其他的数据)的数据集,存储到名为 df 的 DataFrame 对象中。其中,header=0 表示第一行为列名,sep=‘,’ 表示使用逗号作为分隔符。

transactions = []
temp = df.groupby(['Transaction'])['Item'].apply(list)
for transaction, items in temp.items():
    transactions.append(items)

使用 groupby 方法,按照'Transaction'这一列进行分组,并将'Item'这一列变成列表形式,然后将每个数据项添加到 transactions 列表中。

rules = apriori(transactions, min_support=0.0025, min_confidence=0.2, min_lift=1.5, min_length=2)

使用apyori库提供的 apriori 函数进行关联规则挖掘。
transactions 是数据集转换后得到的列表对象,min_supportmin_confidencemin_lift min_length 是设定的最小支持度、最小置信度、最小提升度和最小项集长度等参数。

for result in rules:
    itemset = list(result.items)
    items = []
    for item in itemset:
        items.append(item)
    print(str(items) + ' -> ' + str(list(result.ordered_statistics[0].items_base)) + ' [Support: ' + str(round(result.support, 4)) + ', Confidence: ' + str(round(result.ordered_statistics[0].confidence, 4)) + ', Lift: ' + str(round(result.ordered_statistics[0].lift, 4)) + ']')

遍历输出每一条关联规则,其中对于每一条关联规则,将其转换为列表格式并打印出来。
使用ordered_statistics属性获取关联规则的统计信息,并将其转换为字符串形式输出到控制台上。
这些统计信息包括支持度、置信度和提升度等。

完整代码

import pandas as pd
from apyori import apriori
# 读取数据集
df = pd.read_csv('basket_data.csv', header=0, sep=',')
# 转换数据格式
transactions = []
temp = df.groupby(['Transaction'])['Item'].apply(list)
for transaction, items in temp.items():
    transactions.append(items)
# 挖掘关联规则
rules = apriori(transactions, min_support=0.0025, min_confidence=0.2, min_lift=1.5, min_length=2)
# 输出关联规则
for result in rules:
    # 将结果转换为列表
    itemset = list(result.items)
    items = []
    for item in itemset:
        items.append(item)
    print(str(items) + ' -> ' + str(list(result.ordered_statistics[0].items_base)) + ' [Support: ' + str(round(result.support, 4)) + ', Confidence: ' + str(round(result.ordered_statistics[0].confidence, 4)) + ', Lift: ' + str(round(result.ordered_statistics[0].lift, 4)) + ']')

运行效果截图

在这里插入图片描述

依据数据集 类型预测数据集.csv 进行类型标签预测,标签列为illness。

问题分析

  1. 读取数据集并进行预处理
  2. 划分训练集和测试集
  3. 建立决策树模型并训练模型
  4. 接收用户输入的特征值
  5. 对输入的特征值进行编码
  6. 使用训练好的模型进行预测并输出结果

处理步骤:

  1. 导入必要的库:pandassklearn.preprocessing中的LabelEncoderOneHotEncodersklearn.tree中的DecisionTreeClassifiersklearn.model_selection中的train_test_split。然后读取数据集并进行预处理,将标签属性illness转化为数字类型,并对类别属性SexBPCholesterol进行编码。

  2. 使用train_test_split函数将数据集划分为训练集和测试集。这里将数据集的20%作为测试集,并设置随机种子为0,以保证每次运行结果的一致性。

  3. 建立一个决策树分类器模型clf,并使用fit函数对模型进行训练。在这里,我们仅使用了默认参数。如果需要更好的预测效果,可以调整模型的参数。

  4. 通过while循环接收用户输入的特征值,这里涉及到年龄、性别、血压和胆固醇水平以及Na_to_K(猜测应该是纳钾比例)等属性。这里要注意的是, 用户输入时可能会存在非法输入,例如输入字母或符号,因此需要添加异常处理语句进行捕捉。

  5. 接下来,对于刚才输入的特征值,我们需要进行编码。

  6. 使用之前fit过的OneHotEncoder对象oh_enc对输入数据进行编码,并将其转化为DataFrame格式方便后续的操作。

  7. 接下来我们用训练好的模型对输入的病人特征值进行预测,并使用inverse_transform函数将结果转换为标签名,输出到控制台上.

完整代码

# 导入必要的库
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

# 读取数据集
data = pd.read_csv('类型预测数据集.csv')

# 将标签转换为数字类型
le = LabelEncoder()
data['illness'] = le.fit_transform(data['illness'])

# 对类别属性进行编码
oh_enc = OneHotEncoder(sparse=False)
encoded_cols = oh_enc.fit_transform(data[['Sex', 'BP', 'Cholesterol']])
encoded_cols_df = pd.DataFrame(encoded_cols, columns=oh_enc.get_feature_names_out(['Sex', 'BP', 'Cholesterol']))
data = pd.concat([data, encoded_cols_df], axis=1).drop(['Sex', 'BP', 'Cholesterol'], axis=1)

# 划分训练集和测试集
X = data.drop('illness', axis=1)
y = data['illness']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 建立决策树模型并训练模型
clf = DecisionTreeClassifier(random_state=0)
clf.fit(X_train, y_train)

# 获取用户输入的属性值,并将其转换为大写字母
while True:
    try:
        age = int(input('请输入年龄:'))
        na_k = float(input('请输入Na_to_K:'))
        break
    except ValueError:
        print("您的输入无效,请重新输入数字!")

while True:
    sex = input('请输入性别(M/F):').upper()
    if sex not in ['M', 'F']:
        print("您的输入无效,请重新输入!")
    else:
        break

while True:
    bp = input('请输入血压(HIGH/LOW/NORMAL):').upper()
    if bp not in ['HIGH', 'LOW', 'NORMAL']:
        print("您的输入无效,请重新输入!")
    else:
        break

while True:
    chol = input('请输入胆固醇(HIGH/NORMAL):').upper()
    if chol not in ['HIGH', 'NORMAL']:
        print("您的输入无效,请重新输入!")
    else:
        break


# 构造数据行并进行编码
predict_data_row = pd.DataFrame({'Age': [age], 'Sex': [sex], 'BP': [bp],
                                 'Cholesterol': [chol], 'Na_to_K': [na_k]})
predict_data_row = oh_enc.transform(predict_data_row[['Sex', 'BP', 'Cholesterol']])
predict_data_row_df = pd.DataFrame(predict_data_row, columns=oh_enc.get_feature_names_out(['Sex', 'BP', 'Cholesterol']))
predict_data_row = pd.concat([predict_data_row_df, pd.DataFrame({'Age': age, 'Na_to_K': na_k}, index=[0])],
                             axis=1)[X.columns]

# 预测类型标签
y_pred = clf.predict(predict_data_row)

# 将预测结果转换为标签名
y_pred_name = le.inverse_transform(y_pred)[0]

# 输出预测结果
print('该类型标签为:{}'.format(y_pred_name))

运行结构

在这里插入图片描述

警告说明

运行代码是 会有一行警告 如下:
在这里插入图片描述
原因是在scikit-learn 1.2版本中,'sparse'参数已被重命名为'sparse_output',并且建议使用'sparse_output'参数代替'sparse'参数 , 所以才会有这个警告, 不过没关系…

数据资料

链接: https://pan.baidu.com/s/1zMZfjYLeEmEHMprP6RwILw 提取码: jxim
–来自百度网盘超级会员v6的分享

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树基础知识力扣题构造二叉树总结

二叉树 如何理解二叉树,This is a question! 作者在去年被布置要求学习二叉树时对二叉树的理解并不是很深刻,甚至可以说是绕道走,但是Luck of the draw only draws the unlucky,在学期初考核时,作者三道二叉树题都没…

ArrayBlockingQueue中方法的基本使用

生产者生产数据 使用add()方法向队列中添加元素,在队列满的时候会抛出异常。 ArrayBlockingQueue是基于数组实现,初始化完成后长度是不可变的,在其构造方法中也都是有参构造,初始化对象时必须指定当前队列的长度。 使用offer()方…

day05——K-近邻算法

K-近邻算法 一、定义二、API三、实操:预测签到位置1,数据获取2,数据基本处理3,预测算法代码 四、调优1,什么是交叉验证2,超参数搜索-网格搜索(Grid Search)3,调优代码 五、KNN 算法总结 一、定义…

网工内推 | 应届生网工专场,最高15薪,有NP以上证书优先

01 智己汽车 🔷招聘岗位:网络工程师 🔷职责描述: 1.管理和运维支持网络基础设备(防火墙,交换机,路由器,负载均衡、无线、准入等); 2.负责公司OA网络及公有云…

类和对象以及数组工具类的常用方法

文章目录 一、类和对象二、数组工具类的常用方法 一、类和对象 1、对象没人引用时,会被自动回收 2、对象一定在堆上,引用变量不一定在栈上 3、this表示当前对象的引用,谁调用eat方法(eat方法里有this),谁就是this。this.data访问…

C++11 使用using定义别名(替代typedef)::作用域运算符

typedef 一切合法的变量的定义可以转换为类型 typedef unsigned int uint_t;示例如下: 使用 typedef 重定义类型是很方便的,但它也有一些限制,比如,无法重定义一个模板。 现在,在 C11 中终于出现了可以重定义一个模…

Kerberos从入门到精通以及案例实操系列(一)

1、Kerberos部署 1.1、Kerberos概述 1.1.1、什么是Kerberos Kerberos是一种计算机网络认证协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构&a…

STC89C52+DS18B20实现环境温度检测(数码管显示温度)

一、项目介绍 温度检测是工业自动化、生产线等众多领域中常见的应用场景之一,能及时准确地监测温度对于保障生产安全和提高生产效率有着非常重要的作用。而在现代的电子制造行业中,使用单片机和传感器等电子元器件进行温度检测已经成为了一个比较成熟的技术方案。 本项目选…

Qcom_hexagon编译自动获取目录和特定文件的方法

一,简介 本文主要介绍,如何在高通hexagon ide中的hexagon.min中添加获取目录和.c文件的方法,供参考。 二,具体命令 OBJ_PATH : ./awinic_sp_module/algo_libINCLUDE_PATH : $(shell find $(OBJ_PATH ) -type d) SRC_C_FILE : …

synchronized 的底层原理

tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 文章目录 一、synchronized 的底层原理二、synchronized 的锁升级原理1、偏向锁2、轻量级锁3、重量级锁 一…

大幅提升iOS编译速度的cocoapods二进制化插件介绍

1. 背景 驾校一点通iOS项目是采用是cocoapods来管理组件的,又经过多年的组件化发展,目前组件已经达到了120的数量。在这种组件规模下,主工程的打包时间也从最开始的几分钟增加到十几分钟(M1)、二十几分钟(…

restTemplate转发Https请求

代码架构 package com.http.controller;import com.http.RestTemplateConfig; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework…

Vercel部署个人博客

vercel 部署静态资源网站极其方便简单,并且有可观的访问速度,最主要的是免费部署。 如果你还没有尝试的话,强烈建议去使用一下。 演示博客演示http://202271.xyz/?vercel vercel 介绍 注册账号 进入Vercel官网https://vercel.com&#x…

Android studio安装教程(图文详解,简单搞定)

一 下载 根据自己计算机选择对应版本点击下载 https://developer.android.google.cn/studio 二 安装Android Studio Android Studio 是Google提供的一个Android开发环境,基于IntelliJ IDEA类似 Eclipse ADT,他集成了Android 所需的开发工具。需要注意…

RocketMq的集群的搭建(2主2从异步复制集群模式)

一 RocketMq集群搭建 1.1 说明 本案例采用2m-2s-async的方式搭建集群。 实际项目中,为了达到高可用,一般会使用dleger。 https://blog.csdn.net/wssc63262/article/details/126003507 1.2 集群规划说明 集群规划说明: nameserver是一个…

机器学习——集成学习(装袋法Bagging、提升法Boosting、梯度提升决策树GBDT、随机森林RF)

集成学习 集成学习通过构建并结合多个学习器来完成学习任务 集成方法是用多种学习方法的组合来获取比原方法更优的结果 使用于组合的算法是弱学习算法 即分类正确率仅比随机猜测略高的学习算法 但是组合之后的效果仍可能高于强学习算法 即集成之后的算法准确率和效率都很高…

# 车载软件架构 —— 闲聊几句AUTOSAR OS(三)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标准。到最…

程序员从0到收获心仪offer,我靠训练营实现了180度逆袭!

我相信,在未来的职场中,我也能通过这段时间养成的学习习惯和生活习惯让自己一步步成为更好的自己,以自己为荣 我在大学里主修计算机科学与技术,一个普通的院校,一个算是常见的专业,我知道我的学历和一些其他…

Tomcat的部署(贼详细)

目录 一、Tomcat服务器简介 1、Tomcat服务器 2、Tomcat三大核心组件 3、 Java Servlet 4、JSP全称Java Server Pages 5、 Tomcat 功能组件结构 6、 Container 结构分析 7、Tomcat 请求过程 二:Tomcat部署与安装 1.关闭防火墙,上传所需软件包 2.安…

前端、后端工程师学习路线

学习的平台推荐 视频平台: 慕课:http://www.imooc.com/ 腾讯课堂:https://ke.qq.com/ 教程平台 菜鸟:https://www.runoob.com/ W3:https://www.w3school.com.cn/ yibai:https://www.yiibai.com/ 前端学习路…