[机器学习案例][!https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python]
作者主要从以下四个角度进行:
- 理解问题
- 单维度变量学习(依赖变量)
- 多维度变量学习(依赖变量和独立变量之间的关系)
- 数据清洗(处理缺失数据、设定异常值以及分类变量)
- 验证假设(通过多种手段验证是否符合假设)
具体的步骤包括:
导入数据
分析 SalePrice
分析 SalePrice 和数值变量之间的关系
分析 SalePrice 和分类变量之间的关系
分析变量之间的相关关系
分析所有变量之间的关系
处理缺失数据
-
验证假设(标准化数据处理之后分析变量之间的关系)
导入数据总结
语法总结
1. 新模块:seaborn
比 Matplotlib 上手简单,Seaborn本质上使用Matplotlib作为核心库(就像Pandas对NumPy一样)。seaborn有以下几个优点:
- 默认情况下就能创建赏心悦目的图表。
- 创建具有统计意义的图。
- 能理解 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 callingresetwarnings()
.
在案例中出现的代码:
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.箱体的左侧(下)边界代表第一四分位(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 variablesLinearity:数据线性关系
如果不是线性关系,可以考虑数据 transformation;但大多数的时候不需要,因为可以看出线性关系;Absence of correlated errors:相对误差的缺失
观察分析变量之间是否存在相对误差关系;
通常涉及到时间相关的变量;
取对数可以使数据分布更符合正态分布曲线;
如果原始数据中有 0,忽略为 0 的值,直接取对数;
==统计学知识待补充==
语法总结
df_train = pd.get_dummies(df_train)
这里进行把分类变量转变为虚拟变量。
R语言思路总结
R 流程总结:
- load data,load 各种数据
- Structure of data,分析数据结构
- Summarize the missing values in the data,总结分析缺失数据
- 处理分类变量的 missing data
- 数字变量的 missing data
- missing data 的可视化
- Summarize the numeric values and the structure of the data
- Barplots for the categorical features 分类变量的柱形图可视化
- 分析数量变量以及数据结构,数据结构包括最大值、最小值、平均值、四分之一位数、中位数、四分之三位数;
- 分别统计 train 和 test 中的数据缺失比例;
- 检查数据中的重复行;(0行)
- 把 character 转换成 factors;
- Density plots for numeric variables 数字变量的 density 曲线图
- Explore the correlation 相关关系研究
- Plot scatter plot for variables that have high correlation 高相关度的变量的模型
- 既要处理正相关,也要搞清楚负相关的变量
- ==关注绝对值大的相关度