参考内容
《机器学习实战》原作者github:https://github.com/ageron/handson-ml
hist参数解读https://bingw.blog.csdn.net/article/details/85075968
《机器学习实战》完整总结https://blog.csdn.net/jh1137921986/article/details/79843700
数据分割https://blog.csdn.net/m0_52974810/article/details/118529320?spm=1001.2014.3001.5501
目录
一、加载数据
(1)导入本地数据
import pandas as pd
housing = pd.read_csv(r"C:\Users\Hudie\Desktop\dataset\housing.csv")
#housing是自定义变量,housing.csv是文件名
housing
(2)导入在线数据
import pandas as pd
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
(3)导入sklearn模块自带的数据集
from sklearn.datasets import load_boston,load_digits,fetch_20newsgroups
boston = load_boston()
#查看数据说明(DESCR)
print boston.DESCR
digits = load_digits()
#查看数据规模和特征维度
print digits.data.shape
#与之前预存的数据不同,fetch_20newsgroups需要即时从互联网下载数据
news=fetch_20newsgroups(subset='all')
#查验数据规模和细节
print len(news.data)
print news.data[0]
二、快速查看数据结构
(1)了解各个属性和前五行数据
housing.head()#查看数据前五行
(2)快速获得数据集的简单描述
housing.info()#快速获得数据集的简单描述
可以看到,数据集总共包含20640个实例,需要注意total_bed这个属性只有20433个非空值,有207个缺失值。
(3)查看某个分类属性的各个类别
观察数据集可能会觉得ocean_proximinty这个属性是一个分类属性:
housing["ocean_proximity"].value_counts()
#通过value_counts()方法查看有多少种分类,每种类别下分别有多少个区域。
(4)显示数值属性
housing.describe()#显示数值属性
std显示的是标准差(衡量数值的离散程度);25%、50%和75%显示的是百分位数:百分位数表示一组观测值中给定百分比的观测值都低于该值(housing_median_age的值25%的区域低于18)
也可以通过hist()方法绘制每个属性的直方图。
import matplotlib.pyplot as plt
housing.hist(bins = 50, figsize=(20,15))
plt.show()
hist方法常用的参数如下:
参数名 | 类型 | 描述 |
---|---|---|
data | DataFrame | pandas 数据对象,存储数据 |
column | string 或者sequence | 如果传递了这个参数,则画图时只用到数据的一个子集,具体是谁,由本参数值指定 |
by | object | 这就是Group By里的by ,会按照分组来绘制直方图 |
grid | boolean | 是否显示坐标线 |
xlabelsize | int | 如果指定了这个值,则可以改变x-axis 的标记尺寸 |
xrot | float | 旋转x 轴的度数 |
ylabelsize | int | 如果指定了这个值,则可以改变y-axis 的标记尺寸 |
yrot | float | 旋转y 轴的度数 |
ax | Matplot axes | 指定要绘制直方图的坐标系 |
sharex | boolean | 如果ax 为None 则默认为True 否则默认为False 。在subplots=True 时,会共享x轴并将某个x轴设置为不可见;如果ax 传递进来了,且sharex=True ,会改变所有子图的x 轴的标记。 |
sharey | booelan | 同理可推导出sharey 的功效。 |
figsize | tuple | 单位是英寸,表示要创建的图的大小。默认使用在matplotlib.rcParams 中定义的数值。 |
layout | tuple | (rows, columns) ,表示绘图有多少行多少列。 |
bins | int 或者sequence | 默认为10,就是指定显示多少竖条 |
**kwds | 其他的关键词参数可以在这里传递 | |
axes (返回值) | 返回一个matplotlib.AxesSubplot 或者numpy.ndarray 对象 |
观察分析直方图:
a.观察收入中位数(median_income)的图像可以发现,单位可能不是以美元(USD)在衡量(可以猜测是等比例缩放)。由图可以看出中位数的上限大约是15,下限是0.5,此时需要和负责收集数据的团队核实。在机器学习中,将属性进行预处理是很常见的,但是关键是需要知道处理后的数据是怎么来的。
b.观察各属性的缩放程度。可以看到这个项目各属性的缩放程度是各不相同的。
c.由图可知,房龄中位数(housing_median_age)和房价中位数(median_house_value)(目标属性;标签)被设定了上限(学习到的数据不会超过这个限制)。所以需要和客户进行核实,是否存在问题。如果需要精确的预测值,甚至允许超过限制,则有两种选择:
- 对那些被设置了上限的地区重新收集标签值;
- 将超出上限的数据从数据集中移除。
d.许多直方图都有重尾的现象,图形在中位数右侧的延伸比左侧多的多。一般数据直方图呈正态分布(钟形)的情况时会比较容易得到好的结果。
三、数据探索及可视化
注意:这部分探索的数据只有训练集。
如果训练集很大的话,采用抽样的方法建立探索集,现在这个项目不需要。
为了不损害训练集达到随意尝试的目的,我们先创建一个副本:
housing = strat_train_set.copy()
(1)可视化地理数据
根据经纬度绘制散点图
housing.plot(kind = "scatter", x = "longitude", y = "latitude")
plt.show()
上图在高密集的地方特征不太明显,可以通过设置合适的alpha选项进行修改提高。
alpha取值与其对应的图像:
这里选择alpha = 0.1:
housing.plot(kind = "scatter", x = "longitude", y = "latitude", alpha = 0.1)
plt.show()
这样就可以清楚地看到高密度地区。结合地图可以知道,在湾区、洛杉矶和圣地亚哥附近,同时,在中央山谷处有一条高密度长线。
(2)可视化房价
使用jet的预定义颜色表(cmap)来进行可视化,颜色从蓝色(低)到红色(高)。
housing.plot(kind = "scatter", x = "longitude", y = "latitude",alpha = 0.4,
s = housing["population"] / 100, label = "population",
c = "median_house_value", cmap = plt.get_cmap("jet"), colorbar = True)
plt.legend()
plt.show()
s - 每个圈的半径表示街区的人口;
c - 颜色代表价格。
从图中可以分析出房价和地理位置(比如是否靠海)以及人口密度息息相关。可以使用聚类的算法来检测主要的聚集,然后可以添加一个新的更具代表性的特征值(海洋临近度)。
plt.legend()具体用法参考:
(3)寻找相关性
- corr()方法
适合数据集不大的时候使用该方法来计算每对属性之间的标准相关系数
corr_matrix = housing.corr()
corr_matrix["median_house_value"].sort_values(ascending = False)
DataFrame.sort_value()用来排序;sascending = False表示降序.
相关系数的范围是[-1,1],正数表示正相关,负数表示负相关,0表示没有线性相关性,但是要注意可能有非线性关系。
- scatter_matrix函数
使用scatter_matrix函数绘制出每个数值属性与其他数值属性的相关性。
由于本项目的属性有11个,会得到11*11=121个图像,所以选择与房价中位数最相关的3个属性"median_income", "total_rooms", "housing_median_age"进行分析:
from pandas.plotting import scatter_matrix
attributes = ["median_house_value", "median_income", "total_rooms",
"housing_median_age"]
scatter_matrix(housing[attributes], figsize = (12, 8))
忽略对角线(自相关)
仔细观察图像可以发现,收入中位数(median_income)会与房价中位数的相关性会好一点。可以单独被这两者的相关性图打开进行分析:
housing.plot(kind = "scatter",x = "median_income", y = "median_house_value",
alpha = 0.1)
可以看到图中出现了几条水平线(50万美元、45、35、28…附近)。为了避免影响算法学习,可以尝试删掉这些相应地区。
(4)试验不同属性的组合median_income
有些特征可能没有实际上的意义,因此我们可以尝试创造组合新的特征。比如说我们可能比较关心的,这套房有几个房间:
housing["bedrooms_per_room"] = housing["total_bedrooms"] / housing["total_rooms"]
接着再用corr()方法看看关联矩阵:
可以发现相关性甚至比房子年龄的相关性还要高。因此我们需要多去尝试新的可能,探索数据的奥秘。