无论是打比赛还是在实际工程项目中,都会遇到数据缺失的情况,如果数据集较小,还能在 Excel 或者其他可视化软件大致看一下导致数据缺失的原因。但当数据集较大时,手工查看每个变量的缺失值是非常麻烦的一件事情。
数据探索和预处理也是任何数据科学或机器学习工作流中的重要步骤。缺失数据可能是处理真实数据集时最常见的问题之一,数据丢失的原因很多,包括传感器故障、数据过时、数据管理不当,甚至人为错误。丢失的数据可能以单个值、一个要素中的多个值或整个要素丢失的形式出现。
重要的是,在进行数据分析或机器学习之前,需要我们对缺失的数据进行适当的识别和处理。许多机器学习算法不能处理丢失的数据,需要删除整行数据,其中只有一个丢失的值,或者用一个新值替换(插补)
pip install missingno -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
# 读取训练集excel数据 查看首尾10行
df_t = pd.read_excel("train_data.xlsx")
df_t.head().append(df_t.tail())
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号
plt.rcParams['figure.dpi'] = 500 # dpi
msno.matrix(df_t)
每列特征缺失数据数量条形图可视化和打印统计结果:
missing = df_t.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing_label = missing.index
missing_values = missing.values
per_value = ["{:.2%}".format(i / 30000) for i in missing_values]
missing_dic = {k: [v, z] for k, v, z in zip(list(missing_label), missing_values, per_value)}
print(missing_dic)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
# 可视化 水平柱形图
fig, ax = plt.subplots(figsize=(6, 4), dpi=500)
b = ax.barh(range(len(missing_label)),
missing_values, color='blue',
ec="r", lw=1.2,
)
# 为横向水平的柱图右侧添加数据标签
for rect in b:
w = rect.get_width()
ax.text(w + 180, rect.get_y() + rect.get_height() / 2, '%d' % int(w),
ha='left', va='center', fontdict={
"family": "Times New Roman", "fontsize": 8
})
ax.set_ylim(bottom=0, top=14)
# 设置Y轴纵坐标上的刻度线标签。
ax.set_yticks(range(len(missing_label)))
ax.set_yticklabels(missing_label)
ax.tick_params(axis='y', direction='in', labelsize=8, length=0)
for spine in ['top', 'right', "left", "bottom"]:
ax.spines[spine].set_color('none')
# 不需要X横坐标上的label标签
plt.xticks(())
# 保存图片 展示show
plt.savefig("./results/01 训练集缺失值情况.png", dpi=500)
plt.show()
结果如下: