机器学习案例:House Prices: Advanced Re

2017-06-07  本文已影响238人  魏立艳

[机器学习案例][!https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python]

作者主要从以下四个角度进行:

  1. 理解问题
  2. 单维度变量学习(依赖变量)
  3. 多维度变量学习(依赖变量和独立变量之间的关系)
  4. 数据清洗(处理缺失数据、设定异常值以及分类变量)
  5. 验证假设(通过多种手段验证是否符合假设)

具体的步骤包括:

  1. 导入数据

  2. 分析 SalePrice

  3. 分析 SalePrice 和数值变量之间的关系

  4. 分析 SalePrice 和分类变量之间的关系

  5. 分析变量之间的相关关系

  6. 分析所有变量之间的关系

  7. 处理缺失数据

  8. 验证假设(标准化数据处理之后分析变量之间的关系)

导入数据总结

语法总结

1. 新模块:seaborn

比 Matplotlib 上手简单,Seaborn本质上使用Matplotlib作为核心库(就像Pandas对NumPy一样)。seaborn有以下几个优点:

  1. 默认情况下就能创建赏心悦目的图表。
  2. 创建具有统计意义的图。
  3. 能理解 pandas 的 DataFrame 类型

2. 新模块说明:SciPy

scipy 包包含许多专注于科学计算中的常见问题的工具箱。它的子模块对应于不同的应用,比如插值、积分、优化、图像处理、统计和特殊功能等。
scipy 可以与其他标准科学计算包相对比,比如 GSL (C和C++的GNU科学计算包), 或者Matlab的工具箱。scipy是Python中科学程序的核心程序包;这意味着有效的操作numpy数组,因此,numpy和scipy可以一起工作。

在这个案例中,用到了 scipy 的 norm 和 stats,分别是指:==待补充==

norm:

stats:

3. 新模块说明:sklearn

在这个案例中用到了 preprocessing 中的 StandardScaler

标准化预处理数据包括:

  • preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True):
    将数据转化为标准正态分布(均值为0,方差为1)
  • preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True):
    将数据在缩放在固定区间,默认缩放到区间 [0, 1]
  • preprocessing.maxabs_scale(X, axis=0, copy=True):
    数据的缩放比例为绝对值最大值,并保留正负号,即在区间 [-1.0, 1.0] 内。唯一可用于稀疏数据 scipy.sparse 的标准化
  • preprocessing.robust_scale(X, axis=0, with_centering=True, with_scaling=True, copy=True):
    通过 Interquartile Range (IQR) 标准化数据,即四分之一和四分之三分位点之间

它们对应的标准化预处理类:

  • class preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True):
    标准正态分布化的类
    属性:scale_:ndarray,缩放比例mean_:ndarray,均值var_:ndarray,方差n_samples_seen_:int,已处理的样本个数,调用partial_fit()时会累加,调用fit()会重设
  • class preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True):
    将数据在缩放在固定区间的类,默认缩放到区间 [0, 1]
    属性:min_:ndarray,缩放后的最小值偏移量scale_:ndarray,缩放比例data_min_:ndarray,数据最小值data_max_:ndarray,数据最大值data_range_:ndarray,数据最大最小范围的长度
  • class preprocessing.MaxAbsScaler(copy=True):
    数据的缩放比例为绝对值最大值,并保留正负号,即在区间 [-1.0, 1.0] 内。可以用于稀疏数据 scipy.sparse
    属性:scale_:ndarray,缩放比例max_abs_:ndarray,绝对值最大值n_samples_seen_:int,已处理的样本个数
  • class preprocessing.RobustScaler(with_centering=True, with_scaling=True, copy=True):
    通过 Interquartile Range (IQR) 标准化数据,即四分之一和四分之三分位点之间
    属性:center_:ndarray,中心点scale_:ndarray,缩放比例
  • class preprocessing.KernelCenterer
    生成 kernel 矩阵,用于将 svm kernel 的数据标准化(参考资料不全)

以上几个标准化类的方法:

  • fit(X[, y]):根据数据 X 的值,设置标准化缩放的比例
  • transform(X[, y, copy]):用之前设置的比例标准化 X
  • fit_transform(X[, y]):根据 X 设置标准化缩放比例并标准化
  • partial_fit(X[, y]):累加性的计算缩放比例
  • inverse_transform(X[, copy]):将标准化后的数据转换成原数据比例
  • get_params([deep]):获取参数
  • set_params(**params):设置参数

4. 新模块说明:warnings

如果希望程序能够生成警告信息(比如废弃特性或使用问题)(即,需要输出一个警告信息),可以使用 warning.warn( ) 函数。

The determination whether to issue a warning message is controlled by the warning filter, which is a sequence of matching rules and actions. Rules can be added to the filter by calling filterwarnings() and reset to its default state by calling resetwarnings().

在案例中出现的代码:

import warnings
warnings.filterwarnings('ignore')

是指 never print matching warnings

5. 新模块说明:matplotlib

关于案例中出现的代码:

%matplotlib inline

matplotlib 支持输出多种格式的图形图像,并且可以使用多种 GUI 界面库交互式地显示图表。使用%matplotlib命令可以将 matplotlib 的图表直接嵌入到 Notebook之中,或者使用指定的界面库显示图表,它有一个参数指定 matplotlib 图表的显示方式。inline表示将图表嵌入到Notebook中。

理解问题的总结

数据处理总结

1. 变量管理

对于即将要处理的问题 SalePrice,案例作者对变量数据建议采用表格进行管理,表格示意如下:

Variable Type Segment Expectation Conclusion Comments
TotalBsmtSF numerical space high high

表格说明及注意事项:

Type 变量类型分为数值变量、类别变量;

segment,所属部分,在这个问题下,分为三种类型——building、space、location;

Expectation:变量对房屋销售价格影响程度的预期,用"中"、"高"、"低"来衡量即可;

Conclusion:检查完 Data 之后对变量重要性的结论,衡量标准可以与 Expectation 保持一致。

Comments:任何想到的备注说明。

注意:

Type 和 Segment 只是为了将来一时之需;
Expectation 很重要,因为有利于培养我们的第六感,可以通过自我提问来判断(自己买房时会考虑这个变量吗?如果考虑,我们判断某个变量有多重要?变量之间是否和其他变量有重合?)

根据分析过程,填充表格;

利用数据分析变量和销售价格之间的关系,利用 Conclusion 修正 Expectation;

2. 分析目标问题(房价)

目标问题本身研究

可以先直接观察一下目标问题的数据,包括个数、平均值、标准差、最小值、最大值、分位数等;还可以利用直方图,画出数据分布情况;

通过观察直方图,可以看出数据并不是完全符合正态分布曲线,有偏度和峰度;

==统计学意义待补充==

目标问题与数字变量之间的研究分析

分析了目标问题和两个数字变量之间的关系

目标问题与分类变量之间的研究分析

在分析分类变量是,用到了盒图,关于盒图的作用整理总结如下:

盒图是在 1977 年由美国的统计学家约翰·图基 (John Tukey) 发明的。它由五个数值点组成:最小值(min),下四分位数(Q1),中位数(median),上四分位数(Q3),最大值(max)。也可以往盒图里面加入平均值(mean)。如上图。下四分位数、中位数、上四分位数组成一个“带有隔间的盒子”。上四分位数到最大值之间建立一条延伸线,这个延伸线成为“胡须(whisker)”。

由于现实数据中总是存在各式各样地“脏数据”,也成为“离群点”,于是==为了不因这些少数的离群数据导致整体特征的偏移,将这些离群点单独汇出,而盒图中的胡须的两级修改成最小观测值与最大观测值==。这里有个经验,就是最大(最小)观测值设置为与四分位数值间距离为1.5个IQR(中间四分位数极差)。即

  • IQR = Q3-Q1,即上四分位数与下四分位数之间的差,也就是盒子的长度。
  • 最小观测值为min = Q1 - 1.5*IQR,如果存在离群点小于最小观测值,则胡须下限为最小观测值,==离群点单独以点汇出==。如果没有比最小观测值小的数,则胡须下限为最小值。
  • 最大观测值为max = Q3 -1.5*IQR,如果存在离群点大于最大观测值,则胡须上限为最大观测值,==离群点单独以点汇出==。如果没有比最大观测值大的数,则胡须上限为最大值。

通过盒图,在分析数据的时候,盒图能够有效地帮助我们识别数据的特征

  1. 直观地识别数据集中的异常值(查看离群点)。
  2. 判断数据集的数据离散程度和偏向(观察盒子的长度,上下隔间的形状,以及胡须的长度)。

1.箱体的左侧(下)边界代表第一四分位(Q1),而右侧(上)边界代表第三四分位(Q3)。至于箱体部分代表四分位距(IQR),也就是观测值的中间 50% 值。

2.在箱体中间的线代表的是数据的中位数值。

3.从箱体边缘延伸出去的直线称为触须(whisker).触须(whisker)的向外延伸表示了数据集中的最大和最小(异常点除外)。

4.极端值或异常点(outlier),用星号(*)来标识.如果一个值位于箱体外面(大于Q3或小于Q1),并且距离相应边界大于 1.5 倍的 IQR,那么这个点就被认为是一个异常点(outlier)。

如果你选择通过分组变量(By variable)来分组数据,MINITAB 将把图像变成垂直放置,否则图形将水平放置。(==注:在本案例中,因为是分类变量,所以是垂直放置==)

使用箱形图来评估数据的对称性:
1.如果数据是明显对称,中位数值线将近似位于四分位距箱体的中间,上下触须(whisker)在长度上将近似相等。

2.如果数据是偏态的,中位数将可能不位于四分位距(IQR)箱体的中间,某一触须(whisker)将可能显著地比另一个长。

在降水数据的箱形图(boxplot)中,中位数位于四分位距(IQR)箱体的中间,上下触须(whisker)长度相等。这表明除了异常点(outlier)星号(*)外,数据是对成的。这很好的说明了异常点(outlier)可能和其它的样本数据不是来自同一个母体(population)。

在这个案例中,通过盒图分析,我们可以:

找到异常点;

分析变量和目标问题之间的关系趋势;

变量与变量之间的关系

分析变量之间的关系,转变分析维度,可以利用相关关系来实现;

热力图以及放大的热力图都可以用来分析相关关系;

两两组合分析变量之间的关系

这样不仅可以分析目标问题和变量之间的关系,还可以分析变量与变量之间的关系,方便我们理解变量,并未后续处理做准备。

比如,在此案例中,除了 SalePrice 和其他变量之间的关系;

我们还可以直观看到某个某个变量的分布情况(直方图);

可以看到变量与变量之间是否存在关系,比如 TotalBsmtSF 和 GrLivArea 之间;

语法总结

1. 可以直接用的描述性语法

分析数据可以直接运用的语法:

# describe statistics summary
df_train['SalePrice'].describe

# histogram
sns.distplot(df_train['SalePrice'])

# skewness and kurtosis
print("Skewness: %f" % df_train['SalePrice'].skew)

2. 利用 seaborn 来绘制分析相关关系

seaborn 的用法

热力图的用法及意义

处理 missing data 部分的总结

处理数据总结

可以按照以下方式处理确实数据:

计算数据缺失比例;

对不同比例的数据利用不同的原则进行处理;

缺失百分比高的变量:
1)买房时不会考虑;
2)==超过 15%== 我们就应该考虑不需要补充缺失的数据;
3)这样的变量可以直接删除(包括 PoolQC、MiscFeature、Alley 等);

缺失比例相同的变量:
1)可以推测缺失的原因应该相同;
2)通过一个变量可以得知另外一个变量的信息,所以只考虑一个变量即可;
3)删除一个变量即可,相似的变量组还有 BsmtX 相关;

不必要且与已知变量强相关的变量:
1)MasVnrArea、MasVnrType 和 YearBuilt、OverallQual 之间强关联,且此类信息并不重要;
2)删除信息也不会丢失信息;

异常值处理

数据处理总结

如果数据分布不符合正态分布曲线,可以对数据进行 Standardize 处理;

同时可以对处理之后的数据进行分析,分析 low range 和 high range;

进行双变量分析,判断异常值并根据情况进行处理,注意:

偏离太多的异常值可以删除;

偏离但是仍然符合分布的异常值可以保留;

处理异常值要考虑清楚 trade-off,是否值得花力气处理;

语法总结

fit_transform 以及 scale 的介绍见前文 sklearn 模块内容。

核心分析

数据处理总结

需要从以下四个角度进行验证假设部分:

Normality:数据应该符合正态分布曲线
目前只考虑了 SalePrice 这个单一变量是否符合 Normality;
虽然单一变量不能保证多变量是符合正态分布的,但是有助于实现这一点;
保证数据正态分布,可以避免很多问题(如异方差);

Homoscedasticity:数据的残差具有同方差性
依赖变量具有相同的方差;我们想要同方差性。
因为 we want the error term to be the same across all values of the independent variables

Linearity:数据线性关系
如果不是线性关系,可以考虑数据 transformation;但大多数的时候不需要,因为可以看出线性关系;

Absence of correlated errors:相对误差的缺失
观察分析变量之间是否存在相对误差关系;
通常涉及到时间相关的变量;

取对数可以使数据分布更符合正态分布曲线;

如果原始数据中有 0,忽略为 0 的值,直接取对数;

==统计学知识待补充==

语法总结

df_train = pd.get_dummies(df_train)

这里进行把分类变量转变为虚拟变量。

R语言思路总结

R 流程总结:

上一篇下一篇

猜你喜欢

热点阅读