Datawhale AI夏令营 - 用户新增预测挑战赛 | 学习笔记

news2024/11/19 22:35:55

数据分析与可视化

为了拟合出更好的结果就要了解训练数据之间的相互关系,进行数据分析是必不可少的一步

导入必要的库

# 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

pandas库是一个强大的分析结构化数据的python库是Pythonopen in new window的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。

 

numpy是python中科学计算的基础库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。

 

可视化的图标能便于分析数据

matplotlib是一个python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。

 

seaborn 是一个基于matplotlib进行进行二次封装的绘图库,它也绘制更为集成、复杂的图表。

 

 

绘制数据热力图

a698f6138368400e9dd85db4cba481cf.jpg

 

# 相关性热力图
sns.heatmap(train_data.corr().abs(), cmap='YlOrRd')

上面是教程给的代码,下面是自己尝试调整了一部分参数后的

# 相关性热力图
fig, ax = plt.subplots(figsize=(18,18))#设置画布大小
sns.heatmap(
    train_data.corr(),
    square=True, 
    annot=True,     
    vmax=1, 
    vmin=0,
    annot_kws={'size': 5},
    linewidths=0.3,     # 控制每个小方格之间的间距
    linecolor="white",   # 控制分割线的颜色
    cmap="RdBu_r"
    )

绘制直方图

# x7分组下标签均值
sns.barplot(x='x7', y='target', data=train_data)

模型交叉验证

交叉验证(Cross-Validation)是机器学习中常用的一种模型评估方法,用于评估模型的性能和泛化能力。

 

简单来说就是通过数据评估不同模型,避免过拟合或欠拟合,从而可以找到性能最优的模型。

 

上面的代码验证评估了四个模型,通过输出结果,其实不难发现,树模型的macro F1效果好

一般的,随机森林(RandomForestClassifier)效果比决策树(DecisionTreeClassifier)好一些,本题经过一定特征工程后亦是如此。

特征工程

通过进行特征工程,我们可以优化训练数据,使得得到的模型的性能提升

教程给了如上的特征处理,经过训练,发现common_ts_day与x1_mean,x2_mean是其中对提升精度影响比较大的特征

数据清洗 -- 缺失值与异常值处理

训练模型时遇到报错:ValueError:Input contains NaN, infinity or a value too large for dtype('float64').

处理异常值(以训练集 train_data 为例):

1.检查特征类型

print(train_data.dtypes())    #打印训练集特征类型

2.针对不符合类型训练时抛弃

train_data.drop(['udmap', 'common_ts', 'uuid')  #训练时

3.无穷值处理

#检查是否有无穷数据
print(np.isfinite(train_data).all())
#或
print(np.isinf(train_data).all())

#处理
train_inf = np.isinf(train_data)  #提取
train_data[train_inf] = 0  #替换

在使用 dropna 时遇到删除带有缺失值行数据失败的情况:

这里是因为 NaN 是一个空字符串, 但 dropna 并不会将空字符串当作缺失值处理, 所以没能成功删除

同时,因为删除带有缺失值的行会改变行数,处理测试集 test_data 后会导致提交平台检测出错误

所以采用填充处理

最简单的是用 0 填充

 train_data.fillna(0)  #将 NaN 替换成 0

也可以使用 replace()

train_data.replace("0",np.nan,inplace=True) #将缺失值替换成 0
#如果在其他项目中这里也可以替换成 "nan" 然后使用 dropna 

缺失值填补有很多方法

1.人工填补 2.平均数填补 3.众数填补 4.中位数填补 5.临近数填补

等等等等,还可以采用一些算法进行填补

1.独热编码(One-HotEncoding)

可以扩充特征,采用N位状态寄存器来对N个可能的取值进行编码,每个状态都由独立的寄存器来表示

baseline 中的函数 udmap_onethot :

# 定义函数 udmap_onethot,用于将 'udmap' 列进行 One-Hot 编码
def udmap_onethot(d):
    v = np.zeros(9)         # 创建一个长度为 9 的零数组
    if d == 'unknown':      # 如果 'udmap' 的值是 'unknown'
        return v        # 返回零数组
    
    d = eval(d)         # 将 'udmap' 的值解析为一个字典
    for i in range(1, 10):          # 遍历 'key1' 到 'key9', 注意, 这里不包括10本身
        if 'key' + str(i) in d:     # 如果当前键存在于字典中
            v[i-1] = d['key' + str(i)]  # 将字典中的值存储在对应的索引位置上
            
    return v    # 返回 One-Hot 编码后的数组

对星期进行 One-Hot 编码 :

# 定义函数 week_onethot,用于将 'common_ts_week' 列进行 One-Hot 编码
def week_onethot(d):
    v = np.zeros(7)
 if d == 'Sunday':
        v[0] = 1
 elif d == 'Monday':
        v[1] = 1
 elif d == 'Tuesday':
        v[2] = 1
 elif d == 'Wednesday':
        v[3] = 1
 elif d == 'Thursday':
        v[4] = 1
 elif d == 'Friday':
        v[5] = 1
 elif d == 'Saturday':
        v[6] = 1
 return v 

2.特征二元化

将数值型的属性转换为布尔值的属性,设定一个阈值或条件划分属性值为0或1

简单来说就是将特征分成两部分,用 1 / 0 区分是否满足某条件

baseline 中的 udmap_isunknown :

# 编码 udmap 是否为空
train_data['udmap_isunknown'] = (train_data['udmap'] == 'unknown').astype(int)
test_data['udmap_isunknown'] = (test_data['udmap'] == 'unknown').astype(int)

判断 x7 是否为 1 :

# 特征 x7 是否为 1 
train_data['x7_is1'] = train_data['x7'].apply(lambda d : d == 1)
test_data['x7_is1'] = test_data['x7'].apply(lambda d : d == 1)

 

 

 

 

 

 

 

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

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

相关文章

Python框架【自定义过滤器、自定义数据替换过滤器 、自定义时间过滤器、选择结构、选择练习、循环结构、循环练习、导入宏方式 】(三)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

【OpenMp】openmp库的介绍及安装

目录 什么是OpenMPOpenMP的工作原理Amdahl 定律Gustafson 定律openmp的库在ubuntu下的编译 什么是OpenMP OpenMP(Open Multi-Processing)是一种并行编程框架,用于在共享内存系统中实现并行计算。它是GCC编译器的一部分,提供了一组…

向量检索:基于ResNet预训练模型构建以图搜图系统

1 项目背景介绍 以图搜图是一种向量检索技术,通过上传一张图像来搜索并找到与之相关的其他图像或相关信息。以图搜图技术提供了一种更直观、更高效的信息检索方式。这种技术应用场景和价值非常广泛,经常会用在商品检索及购物、动植物识别、食品识别、知…

leetcode48. 旋转图像(java)

旋转图像 题目描述旋转技巧上期经典算法 题目描述 难度 - 中等 原题链接 - 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像…

StreamPark

1、StreamPark的标语 一个神奇的框架,让流处理更简单 2、StreamPark的前世今生 早期用名streamx,加入apache孵化器之后更名为StreamPark 3、StreamPark可以为你提供什么 降低学习成本、开发门槛,让开发者只用关心核心的业务 简单来说&#xf…

Pytorch学习:torchvison.transforms常用包(ToTensor、Resize、Compose和RandomCrop)

transforms常用包 1. torchvision.transforms.ToTensor2. torchvision.transforms.Resize3. torchvision.transforms.Compose4. torchvision.transforms.Normalize5. torchvision.transforms.RandomCrop 1. torchvision.transforms.ToTensor 将PIL Image或ndarray转换为张量并…

基于React实现无限滚动的日历详细教程,附源码【手写日历教程第二篇】

前言 最常见的日历大部分都是滚动去加载更多的月份,而不是让用户手动点击按钮切换日历月份。滚动加载的交互方式对于用户而言是更加丝滑和舒适的,没有明显的操作割裂感。 那么现在需要做一个这样的无限滚动的日历,前端开发者应该如何去思考…

【数据结构】实现栈和队列

目录 一、栈1.栈的概念及结构(1)栈的概念(2)栈的结构 2.栈的实现(1)类型和函数的声明(2)初始化栈(3)销毁(4)入栈(5&#x…

在 Redis 中处理键值 | Navicat

Redis 是一个键值存储系统,允许我们将值与键相关联起来。与关系型数据库不同的是, 在Redis 中,不需要使用数据操作语言 (DML) 和查询语法,那么我们如何进行数据的写入、读取、更新和删除操作呢?…

shell 11(shell重定向输入输出)

一、标准输入输出 标准输入介绍 从键盘读取用户输入的数据,然后再把数据拿到Shell程序中使用; 标准输出介绍 Shell程序产生的数据,这些数据一般都是呈现到显示器上供用户浏览查看

go学习一之go的初体验

go语言学习笔记 一、golang初体验: 1.简单体验案例: package main{ //把这个test.go归属到main import "fmt" //引入一个包 func main(){//输出hellofmt.Println("hello world")} }2.从案例学到的知识点: (1) go文件的后缀是.…

【集合学习HashMap】HashMap集合详细分析

HashMap集合详细分析 一、HashMap简介 HashMap 主要用来存放键值对(key-value的形式),它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。 HashMap 可以存储 null 的 key 和 value,但 …

nginx基本介绍(安装、常用命令、反向代理)

文章目录 引言一、nginx是什么二、nginx的下载和安装1. 下载2. windows下安装3. 运行4. 外部服务器无法访问问题 三、nginx的常用命令四、nginx.config五、FileZilla1. 什么是FileZilla2. FileZilla的下载和安装 六、反向代理1. 什么是nginx的反向代理2. 反向代理工作流程3. 如…

2023-8-23 连通块中点的数量

题目链接&#xff1a;连通块中点的数量 #include <iostream>using namespace std;const int N 100010;int n, m; int p[N], Size[N], idx;int find(int x) {if(p[x] ! x) p[x] find(p[x]);return p[x]; }int main() {cin >> n >> m;for(int i 1; i <…

七、任务优先级和Tick

1、任务与中断的优先级 (1)相同优先级任务轮流执行。 (2)高优先级任务打断低优先级任务。 (3)中断可以打断所有优先级的任务。 2、任务优先级 (1)优先级的取值范围是&#xff1a;0~(configMAX_PRIORITIES – 1)&#xff0c;数值越大优先级越高。 (2)FreeRTOS会确保最高优…

API 网关基础

目录 一、网关概述二、网关提供的功能三、常见网关系统3.1 Netflix Zuul3.2 Spring Cloud Gateway3.3 Kong3.4 APISIX3.5 Shenyu 一、网关概述 API网关是一个服务器&#xff0c;是系统的唯一入口。 从面向对象设计的角度看&#xff0c;它与外观模式类似。API网关封装了系统内部…

小白带你学习linux的LVS集群(三十六)

一、集群概述 1、负载均衡技术类型 四层负载均衡器 也称为 4 层交换机&#xff0c;主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡&#xff0c;如常见的 LVS、F5 等&#xff1b; 七层负载均衡器 也称为 7 层交换机&#xff0c;位于 OSI 的最高层&#…

机器人力控入门——牛顿欧拉法动力学建模

建立机器人的动力学模型是完成力控的基础&#xff0c;常用的动力学模型建模法有拉格朗日法和牛顿-欧拉法&#xff0c;其中牛顿-欧拉采用递推形式&#xff0c;计算更为简便&#xff0c;使用也更为广泛。本文就来介绍下牛顿-欧拉的动力学建模方法&#xff0c; PS&#xff0c;网上…

C++--动态规划两个数组的dp问题

1.最长公共子序列 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串…

day 37 | ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 与前一道分割等和子集的思路差不多&#xff0c;都是01背包问题。因为是采用滚动数组的形式&#xff0c;所以必须要倒序遍历才可以。 dp[i]代表着在i的限制下最大的承重。所以另一半就是all - dp【all / 2】 func lastStoneWeightII(stones []int…