机器学习之预测房价系列:

探索数据是指研究数据,发现数据的结构。数据集由数据对象构成,一个数据对象代表一个实体,实体由属性构成,属性是一个数据字段,表示数据对象的一个特征,通常,在数据分析和机器学习中,属性、维度、特征和变量这四个术语可以互换。

用来描述一个数据对象的一组属性,称作属性向量或者特征向量。一个属性的类型是由该属性的值决定的,属性可以是标称的、二元的、序数的和数值的。

本文使用的数据,使用以下脚本获得,案例是预测某个区域的房价,本文重点关注的是如何探索数据和对数据进行预处理。

机器学习实战 第一篇:探索数据和数据预处理-LMLPHP机器学习实战 第一篇:探索数据和数据预处理-LMLPHP
import os
import tarfile
import urllib
import pandas as pd

DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/"
HOUSING_PATH = os.path.join("datasets", "housing")
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"

def fetch_housing_data(housing_url=HOUSING_URL, housing_path=HOUSING_PATH):
    if not os.path.isdir(housing_path):
        os.makedirs(housing_path)
    tgz_path = os.path.join(housing_path, "housing.tgz")
    urllib.request.urlretrieve(housing_url, tgz_path)
    housing_tgz = tarfile.open(tgz_path)
    housing_tgz.extractall(path=housing_path)
    housing_tgz.close()


def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)

#get data
fetch_housing_data()
housing = load_housing_data()
View Code

快速查看数据的结构,每一行代表一个区域,共有10个属性,其中median_house_value是需要预测的属性值。

housing.head()

机器学习实战 第一篇:探索数据和数据预处理-LMLPHP

一,属性

属性可以分为两大类:定性属性和定量属性,还可以把属性分为离散属性和连续属性。

1,定性属性和定量属性

定性属性:

  • 标称属性:属性的值代表类别、编码或状态,因此标称属性被看作是分类属性。
  • 二元属性:属性只有两个类别或状态,0和1
  • 序数属性:属性值之间存在有意义的顺序,比如成绩等级可以分为:差、良、优,

定量属性是定量的,它的值是可度量的,用整数或实数来表示,定量属性分为标量和比率。

  • 数量属性:标量数值,比如成绩、温度、销量等
  • 比率属性:表示一个值是另一个的倍数(或比率),比如,增长率、占比等。

2,离散属性和连续属性

离散属性是指存在有限个值,或可数的值

连续属性:值的个数是不可数的

3,对housing数据按照属性进行分析

housing数据共有10个属性,其中9个属性属于标量属性,1个标称属性。

标量属性:

  • longitude 和 latitude:表示区域的经纬度,
  • housing_median_age :表示房龄中位数
  • total_rooms:区域中的总房间数量
  • total_bedrooms:区域中的总卧室数量
  • population:区域中的人口数量
  • households:区域中的家庭数量
  • median_income :区域中的人口收入中位数

标称属性:

  • ocean_proximity:近海

预测值是标量值:

  • median_house_value:房屋价值中位数

二,数据的基本统计描述

数据的基本统计描述,是对数据集的整体做一个统计描述,通常是对一个属性进行统计分析。

1,总体数量统计

值的数量、唯一值的数量

2,缺失值

属性字段是否存在缺失值

3,中心趋势分析

  • 均值
  • 中位数
  • 众数

4,离中趋势分析

值域:最小值和最大值之间的差值

方差和标准差:对同一值域的属性来说,标准差越大,数据的离散程度越大

四分位数:箱线图分析,特别是四分位数间距(IQR),它是上四分位数Q和下四分位数Q之差,其间包含全部观察值的一般,其值越大,说明数据的变异程度越大,离中趋势越明显。

5,对属性值进行基本的统计分析

使用DataFrame的describe()函数,对变量属性进行基本的统计描述分析,行索引是count :表示统计非NaN的行数,mean表示均值,std表示标准差,最大值、最小值、上四分位数(25%),中位数(50%)和下四分位数(75%)。

housing.describe()

机器学习实战 第一篇:探索数据和数据预处理-LMLPHP

三,属性的直方图

在Jupyter notebooks中显示属性的直方图,查看属性值的分布情况,通过DataFrame的hist(),可以对标量属性查看直方图。

%matplotlib inline
import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(20,15))
plt.show()

从直方图中可以看出,除了经纬度latitude 和 longitude之外,有5个属性households、population、total_bedrooms、total_rooms和meidan_income的直方图中出现重尾现象,呈现出左偏分布,中位数右侧的延伸比左侧要远的多,余下的2个属性 housing_median_age 和 median_house_value的直方图,最右侧都呈现出一个异常的值。

机器学习实战 第一篇:探索数据和数据预处理-LMLPHP

对于属性直方图中出现的重尾分布,有时需要对数据进行转换,比如计算其对数。

四,属性之间的相关性

利用相关系数查看各个属性之间的相关性,用于发现不同变量之间的关联性,关联是指数据之间变化的相似性,这可以通过相关系数来描述。发现相关性可以帮助你预测未来,而发现因果关系意味着你可以改变世界。 

由于housing的数据集不大,可以使用DataFrame.corr()方法计算出每队属性之间的标准相关系数(也称作皮尔逊r),查看median_house_value和其他属性的相关系数:

corr_matrix = housing.corr()
corr_matrix["median_house_value"].sort_values(ascending=False)

从相关系数中可以看出:median_house_value 和 median_income的相关系数是最高的,这也符合“房价和收入呈现正相”的常识。

还有一种方法用于检测属性之间的相关性,就是使用pandas的scatter_matrix函数,它会绘制出每个数值属性相对于其他数值属性的相关性。

from pandas.plotting import scatter_matrix

attributes = ["median_house_value", "median_income", "total_rooms", "housing_median_age"]
scatter_matrix(housing[attributes], figsize=(12, 8))

由于篇幅无法完全展示9个属性的散点图矩阵,下面的散点图矩阵仅仅绘制出四个属性的相关性,主对角线位置(从左上到右下)是每个属性的直方图,其他网格是都是两个属性之间的相关性。

机器学习实战 第一篇:探索数据和数据预处理-LMLPHP

五,属性的组合

对变量属性进行组合,通常是跟标量属性推导出比率属性,比如,根据房间总数(total_rooms)和家庭总数(household)计算每个家庭的房间的数量,或者根据房间总数计算卧室的占比,或者根据人口和家庭来计算每个家庭的人口数量:

housing["rooms_per_household"] = housing["total_rooms"]/housing["households"]
housing["bedrooms_per_room"] = housing["total_bedrooms"]/housing["total_rooms"]
housing["population_per_household"]=housing["population"]/housing["households"]

corr_matrix = housing.corr()
corr_matrix["median_house_value"].sort_values(ascending=False)

计算新加的属性跟median_house_value的相关性:

六,缺失值

 对于缺失值,有多种处理方式,本文只简单介绍一下:

  • 删除缺失的数据行
  • 删除缺失的属性
  • 把缺失值设置为某个常量值,通常是均值
  • 插补法,插入的值是不固定的,

七,分类属性的编码

 对于文本属性,如果是标称属性,那么该属性用于对数据对象进行分类,可能只有有限多个取值,每个值代表一个类别。机器学习算法无法直接处理文本属性,通常把文本属性转换为数值来处理,这就需要把文本编码为数值。

1,有序编码

使用Scikit-Learn 的 OrdinalEncoder类把属性编码为有序的:

from sklearn.preprocessing import OrdinalEncoder

ordinal_encoder = OrdinalEncoder()
housing_cat_encoded = ordinal_encoder.fit_transform(housing_cat)

2,One-Hot编码

独热(One-Hot)编码把分类属性的各个属性值转换为数据集的新属性,在由分类属性派生的属性组中,对于同一个数据行,只有一个属性是1,其他属性都是0,使用Scikit-Learn 的OneHotEncoder编码器可以把分类属性转换为独热向量:

from sklearn.preprocessing import OneHotEncoder

cat_encoder = OneHotEncoder()
housing_cat_1hot = cat_encoder.fit_transform(housing_cat)

八,特征缩放

如果输入的数值属性具有非常大的比例差异,往往会导致机器学习算法的性能表现不佳。

1,最小-最大缩放(归一化)

使用Scikit-Learn 的MinMaxScaler()实现标准化缩放

2,标准化

使用Scikit-Learn 的StandardScaler()实现标准化缩放

参考文档:

12-13 19:33
查看更多