基于PaddlePaddle的酒驾风险行为分析预测

简介: 基于PaddlePaddle的酒驾风险行为分析预测

一、酒驾风险行为分析预测


1.背景描述


本数据集来自2007年青少年风险行为监测系统(YRBSS),该系统是由美国疾病控制和预防中心(CDC)进行的年度调查,旨在监测有健康风险的青少年行为的流行情况。

本数据集的重点是青少年最近(在过去30天内)是否乘坐过醉酒司机的车。

1696840979111.jpg


2.数据说明


本数据集包含13387条记录,涉及以下6个变量:

  • 是否在过去30天内与饮酒驾驶者一起乘车:1=有;0=没有
  • 是否是女性:1=女性;0=男性
  • 就读年级:9,10,11,12
  • 年龄
  • 是否吸烟:1=是;0=否
  • 是否拥有驾照:1=有;0=没有

3.数据来源


www.kaggle.com/datasets/ut…


二、数据分析


1.数据读取


import pandas as pd
df=pd.read_csv('data/data225503/Risky_behavior_in_youths.csv',encoding='gbk')
df.head()

.dataframe tbody tr th:only-of-type {         vertical-align: middle;     } .dataframe tbody tr th {     vertical-align: top; } .dataframe thead th {     text-align: right; }

序号 是否在过去30天内与饮酒驾驶者一起乘车 是否是女性 就读年级 年龄 是否吸烟 是否拥有驾照
0 1 1 1.0 10.0 15.0 1.0 0.0
1 2 1 1.0 10.0 18.0 1.0 1.0
2 3 1 NaN NaN NaN NaN NaN
3 4 0 0.0 11.0 17.0 0.0 1.0
4 5 0 0.0 11.0 17.0 0.0 1.0


2.空值处理


df.isnull().sum()
序号                       0
是否在过去30天内与饮酒驾驶者一起乘车      0
是否是女性                  755
就读年级                    67
年龄                      54
是否吸烟                   388
是否拥有驾照                  54
dtype: int64
df.shape
(13387, 7)
df.isnull().sum()/df.shape[0]
序号                     0.000000
是否在过去30天内与饮酒驾驶者一起乘车    0.000000
是否是女性                  0.056398
就读年级                   0.005005
年龄                     0.004034
是否吸烟                   0.028983
是否拥有驾照                 0.004034
dtype: float64
df.dropna(inplace=True)
df.drop(['序号'], inplace=True, axis=1)
df.shape
(12282, 6)
df.describe()

.dataframe tbody tr th:only-of-type {         vertical-align: middle;     } .dataframe tbody tr th {     vertical-align: top; } .dataframe thead th {     text-align: right; }

是否在过去30天内与饮酒驾驶者一起乘车 是否是女性 就读年级 年龄 是否吸烟 是否拥有驾照
count 12282.000000 12282.000000 12282.000000 12282.000000 12282.000000 12282.000000
mean 0.313385 0.525973 10.523449 16.152337 0.535581 0.676193
std 0.463888 0.499345 1.114185 1.209777 0.498753 0.467946
min 0.000000 0.000000 9.000000 14.000000 0.000000 0.000000
25% 0.000000 0.000000 10.000000 15.000000 0.000000 0.000000
50% 0.000000 1.000000 11.000000 16.000000 1.000000 1.000000
75% 1.000000 1.000000 12.000000 17.000000 1.000000 1.000000
max 1.000000 1.000000 12.000000 18.000000 1.000000 1.000000


从上表可以看出,

  • 经过清洗后,共有12282条数据;
  • 在过去30天内与饮酒驾驶者一起乘车占比31.34%;
  • 数据中女生人数多于男生,女生人数占比52%;
  • 数据中大部分的年级为10、11;
  • 年龄均值为16岁;
  • 数据中吸烟和有驾照的人为多数,占比分别为53%和67%。

三、数据预处理


1.数据归一化

columns = df.columns
print(columns)
Index(['是否在过去30天内与饮酒驾驶者一起乘车', '是否是女性', '就读年级', '年龄', '是否吸烟', '是否拥有驾照'], dtype='object')
for column in columns[1:]:
    col = df[column]
    col_min = col.min()
    col_max = col.max()
    normalized = (col - col_min) / (col_max - col_min)
    df[column] = normalized
df.head()

.dataframe tbody tr th:only-of-type {         vertical-align: middle;     } .dataframe tbody tr th {     vertical-align: top; } .dataframe thead th {     text-align: right; }

是否在过去30天内与饮酒驾驶者一起乘车 是否是女性 就读年级 年龄 是否吸烟 是否拥有驾照
0 1 1.0 0.333333 0.25 1.0 0.0
1 1 1.0 0.333333 1.00 1.0 1.0
3 0 0.0 0.666667 0.75 0.0 1.0
4 0 0.0 0.666667 0.75 0.0 1.0
5 0 0.0 0.666667 0.75 1.0 1.0


2.数据集切分


from sklearn.model_selection import train_test_split
# 切分数据集为 训练集 、 测试集
train, test = train_test_split(df, test_size=0.2, random_state=2023)


3.协相关


df.corr()


.dataframe tbody tr th:only-of-type {         vertical-align: middle;     } .dataframe tbody tr th {     vertical-align: top; } .dataframe thead th {     text-align: right; }

是否在过去30天内与饮酒驾驶者一起乘车 是否是女性 就读年级 年龄 是否吸烟 是否拥有驾照
是否在过去30天内与饮酒驾驶者一起乘车 1.000000 0.220942 0.028239 0.048411 0.258869 0.037261
是否是女性 0.220942 1.000000 0.240245 0.282104 0.377348 0.238284
就读年级 0.028239 0.240245 1.000000 0.870475 0.107223 0.748354
年龄 0.048411 0.282104 0.870475 1.000000 0.142229 0.825015
是否吸烟 0.258869 0.377348 0.107223 0.142229 1.000000 0.123856
是否拥有驾照 0.037261 0.238284 0.748354 0.825015 0.123856 1.000000


import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set_style('whitegrid')
# 热力图
plt.figure(figsize=(20,12))
sns.heatmap(df.corr(), annot=True)

1696841440927.jpg


四、模型训练


1.网络定义


import paddle
import paddle.nn.functional as F
# 定义动态图
class Net(paddle.nn.Layer):
    def __init__(self):
        super(Net, self).__init__()
        # 定义一层全连接层,输出维度是1,激活函数为None,即不使用激活函数
        self.fc = paddle.nn.Linear(in_features=5,out_features=2)
    # 网络的前向计算函数
    def forward(self, inputs):
        pred = self.fc(inputs)
        return pred


2.超参设置


net=Net()
# 设置迭代次数
epochs = 6
#  paddle.nn.loss.CrossEntropyLoss正常
#  paddle.nn.CrossEntropyLoss不正常
loss_func = paddle.nn.CrossEntropyLoss()
#优化器
opt = paddle.optimizer.Adam(learning_rate=0.1,parameters=net.parameters())


3.模型训练


#训练程序
for epoch in range(epochs):
    all_acc = 0
    for i in range(train.shape[0]):
        x = paddle.to_tensor([train.iloc[i,1:]])
        y = paddle.to_tensor([train.iloc[i,0]])
        infer_y = net(x)
        loss = loss_func(infer_y,y)
        loss.backward()
        y=label = paddle.to_tensor([y], dtype="int64")
        acc= paddle.metric.accuracy(infer_y, y)
        all_acc=all_acc+acc.numpy()
        opt.step()
        opt.clear_gradients#清除梯度
        # print("epoch: {}, loss is: {},acc is:{}".format(epoch, loss.numpy(),acc.numpy()))  #由于输出过长,这里注释掉了
    print("第{}次正确率为:{}".format(epoch+1,all_acc/i))
第1次正确率为:[0.6094259]
第2次正确率为:[0.6070847]
第3次正确率为:[0.5988396]
第4次正确率为:[0.61268324]
第5次正确率为:[0.61115634]
第6次正确率为:[0.5905945]


五、模型评估


1.模型训练


#测试集数据运行
net.eval()#模型转换为测试模式
all_acc = 0
for i in range(test.shape[0]):
        x = paddle.to_tensor([test.iloc[i,:-1]])
        y = paddle.to_tensor([test.iloc[i,-1]])        
        infer_y = net(x)
        y=label = paddle.to_tensor([y], dtype="int64")
    # 计算损失与精度
        loss = loss_func(infer_y, y)
        acc = paddle.metric.accuracy(infer_y, y)
        all_acc = all_acc+acc.numpy()
    # 打印信息
        #print("loss is: {}, acc is: {}".format(loss.numpy(), acc.numpy()))
print("测试集正确率:{}".format(all_acc/i))
测试集正确率:[0.44177523]


2.预测


import numpy as np
#预测结果展示
net.eval()
x = paddle.to_tensor([test.iloc[0,1:]])
y = paddle.to_tensor([test.iloc[0,0]])    
infer_y = net(x)
y=label = paddle.to_tensor([y], dtype="int64")
# 计算损失与精度
loss = loss_func(infer_y, y)
# 打印信息
print("test[0] is :\n{}\n y_test[0] is :{}\n predict is {}".format(test.iloc[0,1:] ,test.iloc[0,0], np.argmax(infer_y.numpy()[0])))
test[0] is :
是否是女性     0.00
就读年级      1.00
年龄        0.75
是否吸烟      1.00
是否拥有驾照    1.00
Name: 481, dtype: float64
 y_test[0] is :0
 predict is 0


目录
相关文章
|
分布式数据库 Hbase 存储
带你读《HBase原理与实践》之一:HBase概述
Apache HBase是基于Apache Hadoop构建的一个高可用、高性能、多版本的分布式NoSQL数据库,是Google BigTable的开源实现,通过在廉价服务器上搭建大规模结构化存储集群,提供海量数据高性能的随机读写能力。
|
7月前
|
传感器 存储 人工智能
用通义灵码2.5打造智能倒计时日历:从零开始的Python开发体验
本文记录了使用通义灵码2.5开发倒计时日历工具的全过程,展现了其智能体模式带来的高效协作体验。从项目构思到功能实现,通义灵码不仅提供了代码生成与补全,还通过自主决策分解需求、优化界面样式,并集成MCP工具扩展功能。其记忆能力让开发流程更连贯,显著提升效率。最终成果具备事件管理、天气预报等功能,界面简洁美观。实践证明,通义灵码正从代码补全工具进化为真正的智能开发伙伴。
|
9月前
|
人工智能 测试技术 API
Windows用户必备:Postman v11详细安装指南与API测试入门教程(附官网下载
Postman是全球领先的API开发与测试工具,支持REST、SOAP、GraphQL等协议调试。2025年最新版v11新增AI智能生成测试用例、多环境变量同步等功能,适用于前后端分离开发、自动化测试、接口文档自动生成及团队协作共享API资源。本文详细介绍Postman的软件定位、核心功能、安装步骤、首次配置、基础使用及常见问题解答,帮助用户快速上手并高效利用该工具进行API开发与测试。
|
编解码 Linux
libfdk-aac和x264安装编译
libfdk-aac和x264安装编译
732 0
libfdk-aac和x264安装编译
|
前端开发 C# 容器
浅谈WPF之控件拖拽与拖动
使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖动,仅供学习分享使用,如有不足之处,还请指正。
442 2
|
自然语言处理 数据可视化 算法
【传知代码】私人订制词云图-论文复现
本文介绍了词云图的原理和生成步骤,包括分词、统计词频、去除停用词等,并提供了Python实现示例,利用`wordcloud`和`jieba`库。此外,还分享了技巧,如处理中文乱码、选择背景图、词库转换及自定义文字颜色。词云图能直观展示文本关键信息,适用于数据分析和文本挖掘,但也有其局限性,如无法显示词汇的语法关系。源码和更多资源可在文章附件获取。
378 0
【传知代码】私人订制词云图-论文复现
|
存储 JSON 数据挖掘
快手商品详情数据接口解析和封装
快手商品详情数据接口解析和封装
|
机器学习/深度学习 存储 算法
DQN、A3C、DDPG、IQN…你都掌握了吗?一文总结强化学习必备经典模型(一)
DQN、A3C、DDPG、IQN…你都掌握了吗?一文总结强化学习必备经典模型
774 0
|
SQL 前端开发 API
Flink教程(22)- Flink高级特性(异步IO)
Flink教程(22)- Flink高级特性(异步IO)
1064 0
|
开发框架 Apache 数据安全/隐私保护
【Flask实战】Apache+WSGI在内网Windows环境下部署Flask项目(艰难爬坑总结)
【Flask实战】Apache+WSGI在内网Windows环境下部署Flask项目(艰难爬坑总结)