python国际化课程capstone(ML预测ACM队员获奖概率)

news2024/10/6 4:13:22

 

目录

前言

原始数据集

爬虫部分

爬取每个队员在buct做题数量

爬取每个队员codeforces的最高分,注册时间,解题数量

爬取每个队员有效做题时间

数据处理部分

模型部分

Linear Regression

XGBregression+gridsearchCV调参 

Random Forset


前言

刚开课时

我:老师我们能不能写深度学习呀

某老师:当然可以呀

本来我们组都弄好了大作业给他写个CNN分类植物种类

数据都跑出来了

某老师给来一句:你这个分类花花草草阿太简单了,不符合大作业的代码量(火速入典)

当天晚上:诶你做我们ACM队员的获奖预测吧!

我:(......wsnd)

于是就有了接下来的故事

原始数据集

从某老师那里得到的学生,学号,班级(没啥用),codeforces的id,atcoder的id(很多没有)

我合并了一下大概500条数据左右

清洗了一波,把信息缺失太严重的删掉,去个重,剩400左右

后面各种删最后有效的只有不到400条

 然后我拟了一些class

从某老师那得到的历届ACM获奖名单,填写下

具体是这样的

class1: 没得过奖+蓝桥杯省三+一些水奖

class2: 蓝桥省二+天梯国三

class3: icpc/ccpc铜奖+蓝桥国二/三/优+天梯国二

class4: icpc/ccpc银奖+蓝桥国一+天梯国一

class5: icpc/ccpc金奖

于是这个荒唐的项目就轰轰烈烈展开了

爬虫部分

爬取每个队员在buct做题数量

xpath+F12抓包,找标签

xpath解析拿到数据

代码如下 (cookie已打码,这个真不能给别人

#//div[@class="extra content"]
import lxml
import numpy as np
import requests
from lxml import etree
import pandas as pd
def create_request(name):
    print(name)
    url = 'https://buctcoder.com/userinfo.php?user='+str(name)
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53',
        'Cookie':'XSYWSND'
    }
    request = requests.get(url=url,headers=headers)
    return request
def get_content_html(request):
    request.encoding='utf-8'
    content = request.text
    content = etree.HTML(content)
    return content
def get_solve_number(content):
    solve_result = content.xpath('//div[@class="extra content"]/a/text()')
    try:
        solve_result = solve_result[0].split(" ")[1]
        return solve_result
    except:
        return 0
if __name__ == '__main__':
    df = pd.DataFrame(pd.read_csv('work.csv'))
    totleset = df.values
    id=[]
    solve_set=[]
    for node in totleset:
        id.append(node[3])
        schoolnumber=int(node[1])
        request=create_request(schoolnumber)
        content=get_content_html(request)
        result=get_solve_number(content)
        solve_set.append(result)

    df = pd.DataFrame(pd.read_csv('oldwork.csv'))
    totleset = df.values
    for node in totleset:
        id.append(node[3])
        schoolnumber=int(node[2])
        request = create_request(schoolnumber)
        content = get_content_html(request)
        result = get_solve_number(content)
        solve_set.append(result)
    result=[]
    for i in range(0,len(id)):
        tmp=[]
        tmp.append(id[i])
        tmp.append(solve_set[i])
        result.append(tmp)
    data = pd.DataFrame(result, columns=['name', 'buct_solve'])
    data.to_csv('data_buct_solve.csv', index=False)



爬取每个队员codeforces的最高分,注册时间,解题数量

maxrating抓包

codeforces这个网站他很鸡贼

蓝名用户的class名字是user-blue

绿名用户class名字就变成user-green

所以写了个颜色列表依次遍历过去

解题数抓包

 注册时间抓包

这个注册时间要根据单位换算成天,不然会混乱 

代码如下 

import lxml
import numpy as np
import requests
from lxml import etree
import pandas as pd
def create_request(name):
    url = 'https://codeforces.com/profile/'+str(name)
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53'
    }
    request = requests.get(url=url,headers=headers)
    return request
def get_content_html(request):
    request.encoding='utf-8'
    content = request.text
    content = etree.HTML(content)
    return content
def get_max_score(content):
    color_set = ['gray', 'green', 'cyan', 'blue', 'violet', 'orange', 'red', 'legendary']
    for color in color_set[::-1]:
        targetstr = "//span[@class=\"user-" + str(color) + "\"]/text()"
        maxscore_result = content.xpath(targetstr)
        if len(maxscore_result) == 4:
            maxscore_result = maxscore_result[3]
            return int(maxscore_result)
        elif len(maxscore_result) == 2:
            maxscore_result = maxscore_result[1]
            return int(maxscore_result)
    return 0
def get_solve_problem(content):
    solve_result = content.xpath('//div[@class="_UserActivityFrame_counterValue"]/text()')
    solve_result = solve_result[0]
    solve_result = solve_result.split(' ')[0]
    return int(solve_result)
def get_age_time(content):
    time_result = content.xpath('//span[@class="format-humantime"]/text()')
    time_result = time_result[-1].split(' ')
    if time_result[1] == 'months':
        time_result = int(time_result[0]) * 4 * 7
    elif time_result[1] == 'years':
        time_result = int(time_result[0]) * 12 * 4 * 7
    elif time_result[1] == 'week':
        time_result = int(time_result[0]) * 7
    else:
        time_result = int(time_result[0])
    return time_result

if __name__ == '__main__':
    df = pd.DataFrame(pd.read_csv('work.csv'))
    totleset = df.values
    maxscore_set = []
    solveproblem_set = []
    time_age_set = []
    id=[]

    for node in totleset:
        id.append(node[3])
        codeforcesid_set=node[4:7]
        maxscore=-1
        timeage=0
        solvepro=0
        for name in codeforcesid_set:
            if name is not np.nan:
                print(name)
                request = create_request(name)
                content = get_content_html(request)
                maxscore = max(maxscore,get_max_score(content))
                solvepro=solvepro+get_solve_problem(content)
                timeage=timeage+get_age_time(content)
        maxscore_set.append(maxscore)
        solveproblem_set.append(solvepro)
        time_age_set.append(timeage)
    df = pd.DataFrame(pd.read_csv('oldwork.csv'))
    totleset = df.values
    for node in totleset:
        id.append(node[3])
        name=node[6]
        maxscore=0
        timeage=0
        solvepro=0
        if name is not np.nan:
            print(name)
            request = create_request(name)
            content = get_content_html(request)
            maxscore = max(maxscore,get_max_score(content))
            solvepro=solvepro+get_solve_problem(content)
            timeage=timeage+get_age_time(content)
        maxscore_set.append(maxscore)
        solveproblem_set.append(solvepro)
        time_age_set.append(timeage)

    # print(id)
    # print(maxscore_set)
    # print(solveproblem_set)
    # print(time_age_set)
    result = []
    for i in range(0,len(id)):
        tmp=[]
        tmp.append(id[i])
        tmp.append(maxscore_set[i])
        tmp.append(solveproblem_set[i])
        tmp.append(time_age_set[i])
        result.append(tmp)
    data=pd.DataFrame(result,columns=['name','cf_max_rating','cf_solve','cf_time'])
    data.to_csv('data.csv',index=False)



爬取每个队员有效做题时间

在https://codeforces.com/api/user.rating?handle=用户id'

 

这个地址里,有json格式的每个账号打比赛的所有记录

其中时间戳只差是以秒为单位的

也就是说,我们用用户打过的最后一场比赛和第一场比赛时间戳相减,在单位换算,就可以得到用户有效做题时间 

代码如下: 

import lxml
import numpy as np
import requests
from lxml import etree
import pandas as pd
import json

import jsonpath
import requests
from lxml import etree
def create_request(name):
    url = 'https://codeforces.com/api/user.rating?handle='+str(name)
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53'
    }
    request = requests.get(url=url,headers=headers)
    return request
def get_content(request):
    try:
        request.encoding = 'utf-8'
        content = request.text
        content = json.loads(content)
        return content
    except:
        return False
def get_time(content):
    if(content==False):
        return 0
    contest_list = jsonpath.jsonpath(content, '$..result..ratingUpdateTimeSeconds')
    if(not contest_list):
        return 0
    return (contest_list[-1]-contest_list[0])//3600//24
if __name__ == '__main__':
    df = pd.DataFrame(pd.read_csv('work.csv'))
    totleset=df.values
    id=[]
    time_set=[]
    for node in totleset:
        id.append(node[3])
        codeforcesid_set = node[4:7]
        time_tmp=0
        for name in codeforcesid_set:
            if name is not np.nan:
                print(name)
                request = create_request(name)
                content = get_content(request)
                time_tmp=max(time_tmp,get_time(content))
        time_set.append(time_tmp)
    df = pd.DataFrame(pd.read_csv('oldwork.csv'))
    totleset = df.values
    for node in totleset:
        id.append(node[3])
        name = node[6]
        time_tmp=0
        if name is not np.nan:
            print(name)
            request = create_request(name)
            content = get_content(request)
            time_tmp = max(time_tmp, get_time(content))
        time_set.append(time_tmp)
    print(id)
    print(time_set)
    result=[]
    for i in range(0,len(id)):
        tmp=[]
        tmp.append(id[i])
        tmp.append(time_set[i])
        result.append(tmp)
    data = pd.DataFrame(result, columns=['name', 'real_time'])
    data.to_csv('data_time.csv', index=False)

数据处理部分

得到爬取的数据后,我们得到了一张并不干净的数据

其中有因为网络问题爬出来挂0的,有一场比赛没打过的等等

这部分我们可以按自己的意愿酌情删除或修改数据(tmd数据本来就少)

由于我们之后模型训练要用分类模型,所以对连续数据进行分箱使其离散化

依据事实我们选择等距分箱

最终用于回归模型的data如下

用于分类模型的data如下

模型部分

回归模型,先归一化

 得到如下数据

Linear Regression

来一发Linear Regression试试水

from sklearn.linear_model import LinearRegression
lin = LinearRegression()
lin.fit(x_train,y_train)

prediction = lin.predict(x_train)

 

得分确实假了才60多好像 

ZZX那么强才给铜牌水平是吧(模型背大锅)

XGBregression+gridsearchCV调参 

 当时忘记看得分了,反正高了巨多

ZZX给了3.8,小低一点可以接受

之后是分类模型

Random Forset

随机森林

起码在训练集上有百分之85的准确率,也算挺好了

没有测试集给咱试呀

 结语

没想到阴差阳错之后最后答辩的外教就是我三天之前机器学习课答辩时的外教(希望我的异乡人英语别给他留太深印象)

还好没有认出我,最后他还小夸了我们组一下,可能写的专业对他口了

老师给分别太离谱/doge

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

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

相关文章

Redis框架(九):大众点评项目 缓存工具封装

大众点评项目 缓存工具封装需求:缓存工具封装业务实现代码总览总结SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则 基础实战的Demo和Coding上传到我的代码仓库在原有基础…

视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等

1、引言 随着移动网络网速的提升与资费的降低,视频直播作为一个新的娱乐方式已经被越来越多的用户逐渐接受。特别是最近这几年,视频直播已经不仅仅被运用在传统的秀场、游戏类板块,更是作为电商的一种新模式得到迅速成长。 本文将通过介绍实时…

爆火Chatgpt注册完全指南

1 chatgpt 简介 ChatGPT是一种语言模型,它被训练来对对话进行建模。它能够通过学习和理解人类语言来进行对话,并能够生成适当的响应。ChatGPT使用了一种叫做Transformer的神经网络架构,这是一种用于处理序列数据的模型,能够在输入…

第33篇 网络(三)FTP(一)

导语 上一节我们讲述了HTTP的编程,这一节讲述与其及其相似的FTP的编程。FTP即FileTransfer Protocol,也就是文件传输协议。FTP的主要作用,就是让用户连接上一个远程计算机,查看远程计算机有哪些文件,然后把文件从远程…

STM32F4 | STM32CubeMX 图形配置工具

文章目录一、STM32CubeMX 简介二、STM32CubeMX 运行环境搭建1.Java环境安装2.STM32CubeMX 图形化工具安装三、使用 STM32CubeMX 工具配置工程模板1.工程初步建立和保存2.RCC 设置3.时钟系统(时钟树)配置4.GPIO 功能引脚配置5.生成工程源码6.编写用户程序…

汽车行业:充分借力数据价值,推动数字化营销链路闭环

当下,汽车行业已慢慢由曾经的增量市场逐步转变为存量市场。更年轻的消费群体偏好、更精准智能的营销投放策略和强势入局的新能源汽车等因素都在推动着汽车行业的不断发展。对于汽车厂商和垂域媒体来说,进行丰富的人群洞察与用户分层,能挖掘更…

陪诊服务系统源码,可以在线预约陪诊师的软件平台

随着生活方式受互联网的影响,我们的各方面都变得更加便利,也伴随着我国人口老龄化,大部分年轻人都选择了外出打工,背井离乡,从而没有办法待在父母身边照顾,陪诊师就是在这个大背景下诞生了,陪诊…

班级校园网页设计作业 静态HTML我的班级网页 DW班级网站模板下载 大学生简单班级网页作品代码 我的大学网页制作 学生班级网页设计作业

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

LeetCode刷题复盘笔记—一文搞懂动态规划之121. 买卖股票的最佳时机问题(动态规划系列第二十篇)

今日主要总结一下动态规划的一道题目,121. 买卖股票的最佳时机 题目:121. 买卖股票的最佳时机 Leetcode题目地址 题目描述: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一…

QML入门教程:QML和QtQuick简介以及QML实例

从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。…

激光焊接3系铝合金的工艺分析

随着汽车行业的不断壮大,纯电动汽车和燃料电池汽车将共同主导中国新能源汽车市场的未来发展。电动车轻量化和燃料电池的大量使用,必然涉及到越来越多的铝合金焊接工艺。铝合金具有良好的物理、化学和机械性能,是工业生产中一种重要的轻金属材…

搜索引擎搜索特定网站的方法 :site

前言 从13开始的贴吧时代,还记得当时在贴吧里要搜索某些特定的帖子或者关键字的时候,用的都是“吧内搜索”,但用过的人都知道,这个所谓的吧内搜索其实很难用,大家都是用关键字空格贴吧之类的办法去搜索相关的内容。我…

2025年350万辆市场空间!舱驾一体「抢」行泊/舱泊风头

过去三年是汽车智能化「细分作战」阶段,无论是智能驾驶还是智能座舱,由于品牌、车型定位不同,导致在不同价位区间、不同品牌、不同车型,舱内舱外智能化功能组合并不一致。 而随着跨域融合、中央计算平台带动汽车行业进入新的增长…

《树莓派项目实战》第九节 使用PCF8591模块和光敏电阻传感器测量光照强度

目录 8.1 PCF8691模块引脚介绍 8.2 工作原理 8.3 开启I2C接口 8.4 连接到树莓派 8.5 编写代码测量光照强度 在上一节我们使用光敏电阻传感器检测了环境中的光照是否达到了设定的阈值。在本节,我们将使用PCF8591模块和光敏电阻度传感器测量环境中光照强度的具体…

Continua CI捆绑的PostgreSQL数据库服务

Continua CI捆绑的PostgreSQL数据库服务 捆绑的PostgreSQL数据库服务已升级到15.1版。 现在可以使用表达式和变量在“配置存储库分支映射”对话框中为每个存储库指定默认分支。 在“停止”操作中添加了“将失败视为错误”选项。如果选中此项并且该操作位于“Try”块内&#xff…

Qt 模型视图编程之可编辑数据模型

背景 Qt 模型视图编程中模型定义了标准接口对数据进行访问,可根据需求继承对应的抽象模型类来实现自定义的数据模型。一个基本的数据模型至少要实现以下虚函数: ①.rowCount:行数,返回要显示多少行; ②&…

SpringBoot+Vue实现在线电子小说网站

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

伙伴福利,100个项目彻底精通Java!【开源】

为了帮助更多的小伙伴,快速成长进步,冲进大厂中厂,我分享了很多的项目哟,例如: java项目精品实战案例 | JavaSwing实战项目 但很多小伙伴,还觉得不够,好吧!今天就拿出压箱底的项目…

CPU工作原理概述

为了了解CPU的完整工作过程,我们需要知道两件事,第一,CPU是如何获取到数据或者指令的;第二,CPU是如何执行指令的。 目录 一、CPU和内存的交互方式 1、地址空间的概念 2、CPU的取值过程 二、CPU内部的执行过程 1、…

OceanBase-安装

文章目录部署规划机器准备统一配置hosts设置设置机器名和静态ip关闭大页配置信息查看时钟源ntp配置(需要所有机器root)磁盘规划创建用户配置limits.conf配置sysctl.conf关闭防火墙关闭SELinux克隆虚拟机差异化配置中控机设置无密码SSH登录目标机器时钟源…