在之前一期笔记里面,我们对于赛题进行了分析以及理解了相关代码。
在这一期笔记里面我主要从数据分析与可视化,模型交叉验证与特征工程三个面,对于本赛题进行优化,来提升最后预测的分数。
目录
前言
在之前的阶段,我主要通过参考赛题组提供的基准代码,简单地复现了一遍,并没有对结果进行优化。然而,在接下来的学习过程中,我学到了几种优化方法。因此,我计划从这三种优化方法入手,对题目进行深入分析并进行优化。
首先,我会仔细研究赛题的特点和要求,了解数据的结构和特征。然后,我会尝试使用特征工程的方法,对原始数据进行处理和转换,以提取更有用的特征。这可能涉及到数据清洗、特征选择、特征组合等技术手段,从而提升模型的性能和泛化能力。
其次,我会探索不同的机器学习算法和模型,并进行模型的选择和调参。可能会尝试使用决策树、随机森林、梯度提升树等集成学习方法。通过尝试不同的模型和参数组合,优化模型的性能和预测能力。
通过这三种优化方法的探索和实践,我希望能够在解题过程中取得更好的结果,并提升我的学习和实践能力。
运行环境
在这一期的学习过程中,我将数据集下载到本电脑中,在自己电脑中的Pycharm里面,进行操作。
集成开发环境: Pycharm
Python版本: Python 3.7.9
CPU: 10750H
GPU: 1650Ti
相关库: pandas, numpy, matplotlib, seaborn, sklearn
数据分析与可视化
相关代码:
# 导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 读取训练集和测试集文件
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
# 相关性热力图
sns.heatmap(train_data.corr().abs(), cmap='YlOrRd')
plt.show() # 显示图形
# x7分组下标签均值
sns.barplot(x='x1', y='target', data=train_data)
plt.show() # 显示图形
数据集热力图:
注意:本次绘制的热力图是"YlOrRd"色谱图。
"YlOrRd"是一种颜色映射(colormap),用于将数据值映射到颜色空间。它代表了黄色(Yellow)、橙色(Orange)和红色(Red)的颜色渐变。
颜色映射可以帮助我们将数据中的数值转换为可视化中使用的颜色,从而更直观地观察数据的模式、趋势或关系。在热力图中,"YlOrRd"色谱图被用来表示特征之间的相关性程度,其中颜色的深浅表示相关性的强弱。
在观察热力图时,我们可以注意到一些特征之间的相关性模式。在这个特定的热力图中,我们可以观察到以下几个现象,这些现象表明了特定特征之间的相关性强度:
首先,我们注意到common_ts
与x6
之间的方块颜色较深。这暗示着这两个特征之间存在较强的正相关性,即当common_ts
的值增加时,x6
的值也往往会增加,反之亦然。这种强烈的正相关性可能意味着common_ts
和x6
之间存在某种关联或依赖关系。另外,我们还可以观察到x7
与x8
之间的方块颜色也较深。这表明这两个特征之间存在较强的正相关性,即当x7
的值增加时,x8
的值通常也会增加,反之亦然。这种相关性的强度可能意味着x7
和x8
之间存在某种相互影响或共同变化的关系。
x1-x8属性分组下标签均值:
数据分析可视化思考:
思考一:
字段x1至x8为用户相关的属性,为匿名处理字段。添加代码对这些数据字段的取值分析,那些字段为数值类型?那些字段为类别类型?
拿到这样的题目首先我们可以从数据集中查看哪些是数值类型哪些是类别类型,做到心中有数。其次我来讲解我对这道题目的思考:
首先,从训练集中选择了字段 x1
至 x8
并存储在 user_attributes
变量中。
接下来,通过使用user_attributes.columns
遍历user_attributes
数据框中的每个字段。对于每个字段,使用nunique()
函数计算唯一值的数量。如果唯一值的数量小于或等于10,则将字段标识为类别属性;否则,将字段标识为数值属性,并打印相应的输出。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 读取训练集和测试集文件
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
# 获取字段 x1 至 x8 的数据
user_attributes = train_data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8']]
# 遍历每个字段,计算唯一值数量
for column in user_attributes.columns:
unique_values_num = user_attributes[column].nunique() # 唯一值的数量
if unique_values_num <= 10:
print(f"{column} is a categorical attribute.")
else:
print(f"{column} is a numerical attribute.")
思考二:
对于数值类型的字段,考虑绘制在标签分组下的箱线图。
从思考题1中我们得知x3-x5为数值类型;然后我们来编写箱线图代码:
# 绘制箱线图
plt.figure(figsize=(8, 6))
sns.boxplot(x=column, y='target', data=train_data)
plt.xlabel(column)
plt.ylabel('target')
plt.title(f"Boxplot of {column} vs. target")
plt.show()
优化的运行结果
最终我跑出来的结果为0.73019