机器学习预处理-表格数据的分析与可视化

机器学习预处理-表格数据的分析与可视化

最近在做一些模型部署的工作,但是发现对于数据的处理、分析、训练方面还是缺少一些系统的学习,因此抽空余时间分析总结一些使用python进行数据处理的实用案例,希望能够方便自己已经其他人的Ctrl C+V。

之前做稠密(表格)数据的处理都是使用一些现有的分析软件去做(如SPSS),学习成本低但是自由度比较受限,此处介绍使用python的处理。

此处的数据分析部分参考博客:【机器学习】最经典案例:房价预测(完整流程:数据分析及处理、模型选择及微调)

本文的数据集和代码下载:机器学习预处理-表格数据的分析与可视化-数据集和python文件

目录

1、数据下载

01LoadDataSet.py

运行下面代码即可自动下载数据集(经典房价数据 ),但是由于目标的url在国外地址,可能需要科学上网工具,代码会自动下载数据集并解压:

python 复制代码
import os
import tarfile
from urllib import request

DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/"
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"#网址位置
HOUSING_PATH = os.path.join("datasets", "housing")#存储位置

def fetch_housing_data(housing_url = HOUSING_URL, housing_path = HOUSING_PATH):
    os.makedirs(housing_path, exist_ok = True)
    tgz_path = os.path.join(housing_path, "housing.tgz")
    request.urlretrieve(housing_url, tgz_path)
    housing_tgz = tarfile.open(tgz_path)
    housing_tgz.extractall(path = housing_path)#解压
    housing_tgz.close()
    
fetch_housing_data()

下载得到的为tgz压缩格式,进行解压即可得到原始数据的csv格式

2、数据查看

02DataView.py

2.1、查看表格数据头和数据案例

运行下面代码,会打印表格csv数据的表头和5行案例数据,帮我我们快速了解表格数据的大致内容和格式:

python 复制代码
import pandas as pd
import os

HOUSING_PATH = os.path.join("datasets", "housing")  # 存储位置
def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)  # 返回 包含所有数据的pandas DataFrame对象

housing = load_housing_data()
print(housing.head())

但是,由于表格数据比较大,部分数据不能全部打印出来,推荐直接打开csv的表格文件进行查看,更加方便直观一些。

2.2、总体查看数据大小、数据类型和空缺情况

使用下面的代码可以直接打印出数据集的属性描述:

python 复制代码
housing.info()#查看数据集属性描述,自动打印

2.3、查看数值属性列的均值、最小最大值等信息

使用下面的命令查看数据集每列的信息,此处直接打印会在输出窗口显示不完全 ,因此直接把数据输出为xlsx文件查看

python 复制代码
# 查看数值属性列的均值、最小最大值等信息-结果导出为housing_describe.xlsx
housing_describe = housing.describe()
housing_describe.to_excel('housing_describe.xlsx')  # 保存到 Excel 文件

生成后的文件信息如下:

文件中各个行的数据解释如下:

  • count:非空(非NA/null)值的数量
  • mean:平均值,所有非空值的算术平均。
  • std:标准差,衡量数据的离散程度
  • min:最小值,数据中的最小值。 25%:第25百分位数,也称为下四分位数,表示数据中有25%的数据小于这个值
  • 50%(median):中位数,数据排序后位于中间的数。如果数据量是奇数,则中位数就是中间那个数;如果是偶数,则中位数是中间两个数的平均值
  • 75%:第75百分位数,也称为上四分位数,表示数据中有75%的数据小于这个
  • max:最大值,数据中的最大值。

2.4、绘制每列数据的分布情况

数字形式的数据绘图

实际中,我们往往需要观察每个数据的实际分布的情况,使用下面代码绘制分布图:

python 复制代码
import matplotlib.pyplot as plt
housing.hist(bins = 50, figsize = (20,15))#各属性各自的分布:即处于横轴区间(x轴)的样本个数为多少(y轴)
plt.savefig('distribution01.png', dpi=300)#保存图片为png
plt.show()

运行得到的结果如下所示,还是比较美观的:

文字形式的数据显示

我们之前可以分析到"ocean_proximity"这一列的数据为字符串格式,对于字符格式的数据我们可以使用下面代码观察其分布:

python 复制代码
print(housing["ocean_proximity"].value_counts())#查看ocean_proximity栏中有多少种分类

运行结果为:

2.5、绘制多维数据关系

三个自变量对应一个因变量

多维度数据关系的绘制需要根据具体情况来具体分析,此处选择影响房价的三个因素 为例进行。从之前的原始数据的观察,此处绘制数据的自变量包含经度、纬度、人口密度 ,绘制数据的因变量就是房价数据

python 复制代码
#房价分布, s-蓝色-人口数量,c-颜色-价格-(蓝-红)
housing.plot(kind = "scatter", x = "longitude", y = "latitude", alpha = 0.4,
             s = housing["population"]/100, label = "population", figsize = (10,7),
             c = "median_house_value", cmap = plt.get_cmap("jet"), colorbar = True,
            )
plt.legend()
plt.savefig('distribution02.png', dpi=300)#保存图片为png

绘制得到的图表如下所示,其中横纵坐标分别为经纬度 ,图中圆圈大小代表人口的密度 ,图中的颜色深浅代表房价的具体数值 ,可以看到美国沿海地区人口密度大,房价更高:

2.6、绘制两两间互相关关系图

说白了就是以其中一个数据为横坐标,另一个数据为纵坐标绘图

python 复制代码
from pandas.plotting import scatter_matrix
attributes = ["median_house_value", "median_income", "total_rooms", "housing_median_age"]
scatter_matrix(housing[attributes], figsize = (12,8))
plt.savefig('correlation.png', dpi=300)#保存图片为png

从下面的第一列的第二行的图片可以看到,房价数据和收入的绘图有一定的线性关系 ,其余的数据的关系并不显著:

2.7、绘制相关性系数热力图

上一小节2.6、绘制两两间互相关关系图的绘制不太直观,可以使用相关性系数的热力图对两两变量的相关性进行分析,代码如下:

python 复制代码
# 计算相关性系数矩阵
correlation_matrix = housing[['median_house_value', 'median_income', 'total_rooms', 'housing_median_age']].corr()
import seaborn as sns
# 设置 seaborn 样式
sns.set(style="white")
# 绘制相关性热力图
plt.figure(figsize=(8, 6))  # 设置图形大小
heatmap = sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.subplots_adjust(left=0.2, right=0.9, top=0.9, bottom=0.3)
# 添加标题和标签(可选)
plt.title('Correlation Heatmap')
# 显示图形
# plt.show()
# 保存图形为图片文件
plt.savefig('correlation_heatmap.png', dpi=300)

运行结果如下,可见收入和房价间的相关性确实比较大

3、代码

3.1、01LoadDataSet.py

python 复制代码
import os
import tarfile
from urllib import request


DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/"
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"#网址位置
HOUSING_PATH = os.path.join("datasets", "housing")#存储位置

def fetch_housing_data(housing_url = HOUSING_URL, housing_path = HOUSING_PATH):
    os.makedirs(housing_path, exist_ok = True)
    tgz_path = os.path.join(housing_path, "housing.tgz")
    request.urlretrieve(housing_url, tgz_path)
    housing_tgz = tarfile.open(tgz_path)
    housing_tgz.extractall(path = housing_path)#解压
    housing_tgz.close()
    
fetch_housing_data()

3.2、02DataView.py

python 复制代码
import pandas as pd
import os

HOUSING_PATH = os.path.join("datasets", "housing")  # 存储位置
def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)  # 返回 包含所有数据的pandas DataFrame对象

housing = load_housing_data()
print(housing.head())


housing.info()#查看数据集属性描述


# 查看数值属性列的均值、最小最大值等信息-结果导出为housing_describe.xlsx
housing_describe = housing.describe()
housing_describe.to_excel('housing_describe.xlsx')  # 保存到 Excel 文件


import matplotlib.pyplot as plt
housing.hist(bins = 50, figsize = (20,15))#各属性各自的分布:即处于横轴区间(x轴)的样本个数为多少(y轴)
plt.savefig('distribution01.png', dpi=300)#保存图片为png
# plt.show()

print(housing["ocean_proximity"].value_counts())#查看ocean_proximity栏中有多少种分类


#房价分布, s-蓝色-人口数量,c-颜色-价格-(蓝-红)
housing.plot(kind = "scatter", x = "longitude", y = "latitude", alpha = 0.4,
             s = housing["population"]/100, label = "population", figsize = (10,7),
             c = "median_house_value", cmap = plt.get_cmap("jet"), colorbar = True,
            )
plt.legend()
plt.savefig('distribution02.png', dpi=300)#保存图片为png




from pandas.plotting import scatter_matrix
attributes = ["median_house_value", "median_income", "total_rooms", "housing_median_age"]
scatter_matrix(housing[attributes], figsize = (12,8))
plt.savefig('correlation.png', dpi=300)#保存图片为png

# 计算相关性系数矩阵
correlation_matrix = housing[['median_house_value', 'median_income', 'total_rooms', 'housing_median_age']].corr()
import seaborn as sns
# 设置 seaborn 样式
sns.set(style="white")
# 绘制相关性热力图
plt.figure(figsize=(8, 6))  # 设置图形大小
heatmap = sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.subplots_adjust(left=0.2, right=0.9, top=0.9, bottom=0.3)
# 添加标题和标签(可选)
plt.title('Correlation Heatmap')
# 显示图形
# plt.show()
# 保存图形为图片文件
plt.savefig('correlation_heatmap.png', dpi=300)
相关推荐
独孤求败Ace30 分钟前
第18天:信息收集-Web应用&搭建架构&指纹识别&WAF判断&蜜罐排除&开发框架&组件应用
前端·人工智能·安全·网络安全·架构·系统安全
猫头不能躺1 小时前
【pytorch】softmax回归
人工智能·pytorch·回归
Babyfacer1 小时前
AI 语言模型产业的投资困境与发展困境分析
人工智能·生成式 ai·投资困境
阿正的梦工坊1 小时前
PyTorch如何通过 torch.unbind 和torch.stack动态调整张量的维度顺序
人工智能·pytorch·python
zybishe1 小时前
计算机毕业设计原创定制(免费送源码):Node.JS+Express+MySQL Express 流浪动物救助系统
android·深度学习·机器学习·小程序·node.js·课程设计·express
終不似少年遊*2 小时前
02LLM的整体认知
人工智能·深度学习·ai·语言模型·llm·学习笔记
计算机科研之友(Friend)2 小时前
【深度学习】数据集合集!
人工智能·科技·深度学习·安全·机器学习·无人机
小成晓程2 小时前
opencv——(图像梯度处理、图像边缘化检测、图像轮廓查找和绘制、透视变换、举例轮廓的外接边界框)
人工智能·opencv·计算机视觉
星途码客2 小时前
下一代通信与网络:创新技术引领未来
人工智能
三天不学习2 小时前
Visual Studio 使用 GitHub Copilot 聊天
人工智能·github·copilot·ai编程·visual studio