多层感知机(MLP)实现考勤预测二分类任务(sklearn)

news2024/10/12 5:46:51
'''
1、基础应用:
https://blog.csdn.net/qq_36158230/article/details/118670801
多层感知机(MLP)实现考勤预测二分类任务(sklearn)
2、分类器参数:https://scikit-learn.org/dev/modules/generated/sklearn.neural_network.MLPClassifier.html
3、损失函数:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html
看着示例数据、参数训练出的模型效果不好呀hhh
'''

import csv
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
 
# 加载训练数据集
def load_dataset(path):
    dataset_file = csv.reader(open(path))
    vector_x = []   # 样本
    y = []          # 样本所对应的标签
    # 从文件读取训练数据集
    for content in dataset_file:
        # 如果读取的不是表头
        if dataset_file.line_num != 1:
            # 读取一行并转化为列表
            content = list(map(float, content))
            if len(content) != 0:
                vector_x.append(content[1:12])  # 第0-11列是样本的特征,其中第0列是id
                y.append(content[-1])           # 最后一列是样本的标签
                #print(content,len(content)) # [2.0, 1.0, 1.0, 2.0, 3.0, 1.0, 4.0, 1.0, 3.0, 2.0, 1.0, 3.0, 1.0] 13
                #break
    return vector_x, y  # 返回训练数据集
 
# 训练模型
def mlp_cls(vector_x_train, y_train):
    # 输入层->第一层->第二层->输出层
    #    12      30     20      1  # 节点个数
    # MLPClassifier参数说明详情见https://www.cnblogs.com/-X-peng/p/14225973.html
    mlp = MLPClassifier(solver='adam', alpha=0, hidden_layer_sizes=(30, 20), random_state=1)
    mlp.fit(vector_x_train, y_train)        # 训练
    return mlp
 
# 模型预测
def mlp_cls_predict(mlp, vector_x_test, y_test):
    # 预测
    y_predict = mlp.predict(vector_x_test)
    n = 3
    print("模型预测值:", y_predict[:n], ", 模型true值:", y_test[:n])
    print(y_predict[0]==y_test[0])
    print("测试集大小:", len(y_test), len(y_predict))
    label_1 = []
    label_fu1 = []
    for p in y_test:
        if p==1:
            label_1.append(p)
            #print("label: 1")
        if p==-1:
            label_fu1.append(-1)
    print('测试集:和',len(label_1)+len(label_fu1),',len(label_1)', len(label_1), ',len(label_fu1)',len(label_fu1))
    error_n = 0
    for i in range(len(y_predict)):
        if y_predict[i] != y_test[i]:
            print('错误预测结果:', y_predict[i], ', 真实值:', y_test[i])
            error_n +=1
    print('预测错误的数量:', error_n)
    # 输出模型预测的准确度
    print(accuracy_score(y_predict, y_test))
 
# 实验
if __name__ == '__main__':
    # 1. 加载数据集
    
    vector_x, y = load_dataset("dataset.csv") # 如果报错,原因:ipynb创建的时候在其他目录,而不是csv文件的路径下
    print('数据集大小(预期161):', len(vector_x), len(y))
    count_fu1 = []
    for p in y:
        if p==-1:
            count_fu1.append(p)
    print('总的负样本数:', len(count_fu1))
        
    print(vector_x[:3], y[:3])
    scalar = StandardScaler()               # 标准化转换
    scalar.fit(vector_x)                    # 训练标准化对象
    vector_x = scalar.transform(vector_x)   # 转换数据集
    print(vector_x[:3], y[:3])
    print("每个特征的Mean:", scalar.mean_, "特征数量:", len(scalar.mean_))
    print("每个特征的Standard Deviation:", scalar.scale_, "特征数量:", len(scalar.scale_))
    '''
    在数据处理中,标准化是一种常见的预处理步骤,用于将数据转换为均值为 0,标准差为 1 的分布。这有助于确保不同特征的值处于相似的尺度,避免某些特征对模型的影响过大。
    1)对每个特征计算其均值和标准差。
    2)将每个特征的值减去均值,然后除以标准差,以完成标准化处理。
    
    preprocessing.scale(data) 是 Scikit-learn 中 preprocessing 模块提供的一种快速标准化数据的方法。这个方法会对输入的数据进行标准化处理,即将数据按特征进行标准化,使得每个特征的均值为 0,标准差为 1。
    这个方法适用于需要快速对数据进行标准化的情况,但是它并不像使用 StandardScaler 那样可以保存均值和标准差供后续使用。
    '''
    # 2. 划分训练集和测试集
    # https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
    vector_x_train, vector_x_test, y_train, y_test = train_test_split(vector_x, y, test_size=0.2, random_state=0)
    # vector_x_train, vector_x_test, y_train, y_test = train_test_split(vector_x, y, test_size=0.2, random_state=10)
    label_1 = []
    label_fu1 = []
    for p in y_train:
        if p==1:
            label_1.append(p)
            #print("label: 1")
        if p==-1:
            label_fu1.append(-1)
    print('训练集:和',len(label_1)+len(label_fu1),',len(label_1)', len(label_1), ',len(label_fu1)',len(label_fu1))
    # 3. 训练
    mlp = mlp_cls(vector_x_train, y_train)
    # 4. 预测
    mlp_cls_predict(mlp, vector_x_test, y_test)

    print('【感觉模型预测时,将结果都预测为正样本1了,看看训练的精度怎么样】')
    mlp_cls_predict(mlp, vector_x_train, y_train)

对应的输出

数据集大小(预期161): 161 161
总的负样本数: 18
[[1.0, 1.0, 2.0, 3.0, 1.0, 4.0, 1.0, 3.0, 2.0, 1.0, 3.0], [1.0, 2.0, 2.0, 3.0, 1.0, 4.0, 1.0, 4.0, 2.0, 2.0, 3.0], [2.0, 2.0, 2.0, 3.0, 1.0, 3.0, 1.0, 3.0, 1.0, 2.0, 3.0]] [1.0, 1.0, 1.0]
[[-0.41854806 -1.31484355  0.36579067  0.3130227  -0.80178373  0.49383162
  -0.48832524  0.23600208  0.06141296 -2.9104275  -0.39633848]
 [-0.41854806  0.76054676  0.36579067  0.3130227  -0.80178373  0.49383162
  -0.48832524  1.23590565  0.06141296  0.34359214 -0.39633848]
 [ 2.38921186  0.76054676  0.36579067  0.3130227  -0.80178373 -0.71081824
  -0.48832524  0.23600208 -1.35108513  0.34359214 -0.39633848]] [1.0, 1.0, 1.0]
每个特征的Mean: [1.14906832 1.63354037 1.88198758 2.74534161 1.39130435 3.59006211
 1.19254658 2.76397516 1.95652174 1.89440994 3.31677019] 特征数量: 11
每个特征的Standard Deviation: [0.35615581 0.48183708 0.32262283 0.81354605 0.48804227 0.83011673
 0.39429988 1.00009644 0.70796556 0.30731222 0.79924157] 特征数量: 11
训练集:和 128len(label_1) 111 ,len(label_fu1) 17
模型预测值: [1. 1. 1.] , 模型true值: [1.0, 1.0, 1.0]
True
测试集大小: 33 33
测试集:和 33len(label_1) 32 ,len(label_fu1) 1
错误预测结果: 1.0 , 真实值: -1.0
预测错误的数量: 1
0.9696969696969697
【感觉模型预测时,将结果都预测为正样本1了,看看训练的精度怎么样】
模型预测值: [1. 1. 1.] , 模型true值: [1.0, -1.0, 1.0]
True
测试集大小: 128 128
测试集:和 128len(label_1) 111 ,len(label_fu1) 17
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
错误预测结果: 1.0 , 真实值: -1.0
预测错误的数量: 13
0.8984375
/base/envs/py36/lib/python3.6/site-packages/sklearn/neural_network/_multilayer_perceptron.py:617: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.
  % self.max_iter, ConvergenceWarning)

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

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

相关文章

未来战争中的指控体系不仅是分布式的

指控体系,作为军事指挥与控制的重要组成部分,经历了从传统的集权指挥向现代分布式指挥的转变。历史上,战争指挥体系主要依赖于集中式指挥官的决策,信息流动缓慢,决策过程受到地理位置、通信手段等多种因素的制约。随着…

数据库实例

例3.5建立一个“学生”表student create table student(sno char(9) primary key,sname char(20) unique,ssex char(2),sage smallint,sdept char(20)); 例3.6建立一个“课程”表course create table course(cno char(4) primary key,cname char(40) not null,cpno char(4),…

保姆级教程 | VMD输出局部结构及利用TkConsole实现旋转

背景 由于课题需要,现需要展示lammps模拟轨迹中的局部结构(主要是想可视化这里的结果:保姆级教程 | 输出分子动力学轨迹文件输出特定原子范围内的化学环境),因为ovito效果有点笨笨的,所以我这里选用VMD软件为例进行操作,效果图(超级好看夸夸): (说明:主要的分子构…

计算机毕业设计 | SSM 旅游网站后台管理系统(附源码)

1,概述 1.1 背景分析 随着人们生活水平的提高和对休闲旅游的日益重视,旅游业已成为全球最大的经济产业之一。越来越多的人选择通过在线方式进行旅行预订,这种趋势为旅游网站提供了巨大的商机。用户体验是决定旅游网站成功与否的关键因素。良…

vue代码中关于字符串对比的实现

常见的数据比较都只限制于数字比较的比较,但是现在遇到一个框架他会自动将所有传输过来的值转化为字符串形式,导致在比较的时候无法进入到表单校验的代码中去 1.使用Number函数 2.使用 号运算符,都可以实现

python networkx 计算路径A*

import matplotlib.pyplot as plt # 导入 Matplotlib 工具包 import networkx as nx # 导入 NetworkX 工具包 from typing import List# 初始化空的无向图 graph nx.Graph() # 向图中添加多条赋权边: (node1,node2,weight) graph.add_weighted_edges_from([(1, 2, 50),(1, 3…

智能扭矩系统在制造领域应用_SunTorque

【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。一站式数智工厂解决方案服务商】 在当今高度自动化和智能化的制造领域,各种先进技术不断涌现,为提高生产效率、保证产品质量和降低成本提供了有力支持。智能扭矩系统作为其中…

【电子电力】基于DSP28335+DSP28035的三相三电平大功率并网逆变器程序代码

摘要 本文介绍了基于DSP28335和DSP28035的三相三电平大功率并网逆变器设计和实现。通过DSP控制器对三电平逆变器的精确控制,实现了逆变器与电网的并网控制,保证了系统的高效稳定运行。该设计主要应用于光伏发电和风力发电系统中的并网发电部分。本文通过…

在AI大模型时代遨游,你不得不知道的一些事

用户到底为什么而买单/产品和研发要抛弃的历史包袱 在大模型时代之前,其实企业和企业之间的软件产品壁垒来自两个地方: 交互,让用户用起来感觉舒服。打磨,我花了五年修复了用户遇到的一万个bug,所以我的产品比你好。 但是无论如何…

如何使用flutter doctor命令检测环境是否配置成功

Flutter Windows Android环境搭建 真机调试学习地址: 17 Flutter介绍-Flutter Windows Android环境搭建 真机调试 如何使用flutter doctor命令检测环境是否配置成功,详细步骤如下: 第一次执行可能会提示下面错误: 1、错误一&am…

建站:腾讯云+宝塔linux+xftp

1.首先,控制台,服务器 2.服务器-网络与域名-ip地址,能看到公网地址 3.宝塔Linux面板-网站-添加站点 4.填写域名会自动生成 ftp 帐号密码 域名可以加上端口,端口号可以写大点 5.xftp新建会话 主机地址:腾讯云拿到的公…

直流有刷电机驱动芯片:【TOSHIBA:TB6612】

Toshiba TB6612是是东芝半导体的一款驱动电机的IC。一个TB6612FNG可以驱动两个电机,每一个驱动都有两个逻辑输入引脚,一个输出引脚和一个PWM引脚。可以通过给两个逻辑输入引脚不同的电平来控制电机的运行状态,通过PWM输入引脚实现电机调速。 …

怎么看待数字化转型是大势所趋?

怎么看到数字化转型是大势所趋?下面我结合最新数据给大家讲明白这个事。 近日,我通过大量的数据相关性分析,有了一些关键发现。 【数字化转型】之所以势在必行,主要是因为数字化转型为各个国家数字经济发展提供了重要的参考依据。…

R2:RNN-心脏病预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、实验目的: 本地读取并加载数据。了解循环神经网络(RNN)的构建过程测试集accuracy到达87% 拔高:测试集accur…

腾讯云Android 相关

集成遇到异常怎么办? 您可以使用 armeabi 和 armeabi-v7a 架构。 如上图所示,请在app的 build.gradle 中指定 abiFilters 为“armeabi”。 功能模块升级后,短视频 SDK 的功能不能使用? 1. 如果使用的是 androidstudio&#xff0…

2024Selenium自动化常见问题!

"NoSuchElementException"异常: 确保使用了正确的选择器来定位元素。可以使用id、class、XPath或CSS选择器等。 可以尝试使用find_elements方法来查找元素列表,并检查列表的长度来判断元素是否存在。 使用显式等待(WebDriverWait…

考研编程:10.11 回文数 水仙花 生成一定范围内的随机数 求二叉树宽度

回文数 #include <stdio.h>int main(){int a,b,c0,sum;scanf("%d",&a);ba;while(b!0){c b%10 c*10;b b/10;}if(ca){printf("yes");}return 0; } 水仙花 #include <stdio.h> #include <math.h> int main(){int a,b,c0,sum;scan…

内嵌服务器Netty Http Server

内嵌式服务器不需要我们单独部署&#xff0c;列如SpringBoot默认内嵌服务器Tomcat,它运行在服务内部。使用Netty 编写一个 Http 服务器的程序&#xff0c;类似SpringMvc处理http请求那样。举例&#xff1a;xxl-job项目的核心包没有SpringMvc的Controller层&#xff0c;客户端却…

css多层嵌套折叠

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>美观的纯 CSS 折叠列表</title><style>b…

如何使用Python爬虫处理JavaScript动态加载的内容?

JavaScript已经成为构建动态网页内容的关键技术。这种动态性为用户带来了丰富的交互体验&#xff0c;但同时也给爬虫开发者带来了挑战。传统的基于静态内容的爬虫技术往往无法直接获取这些动态加载的数据。本文将探讨如何使用Python来处理JavaScript动态加载的内容&#xff0c;…