本关任务
在前一关卡,我们已经学会了使用sklearn导入数据,然而原始数据总是比较杂乱、不规整的,直接加载至模型中训练会影响预测效果。本关卡,将学会使用sklearn对导入的数据进行预处理。
相关知识
原始数据存在的几个问题:不一致、重复、含噪声、维度高。数据挖掘中,数据预处理包含数据清洗、数据集成、数据变换和数据归约几种方法,在这里不过多叙述预处理方法细节,接下来将简单介绍如何通过调用sklearn中的模块进行数据预处理。
sklearn.preprocessing 模块提供很多公共的方法,将原始不规整的数据转化为更适合分类器的具有代表性的数据。一般说来,使用标准化后的数据集训练学习模型具有更好的效果。
数据标准化的方法有很多种,常用的有“最小—最大标准化”、“Z-score标准化”等等。经过上述标准化处理,各属性值都处于同一个数量级别上,可以进行综合数据分析。
Z-score 标准化
这种方法基于原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。将A的原始值x使用Z-score标准化到x'。
Z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况,其公式为:
新数据=(原数据-均值)/标准差
sklearn.preprocessing.scale函数,可以直接将给定数据进行标准化。
标准化处理后数据的均值和方差:
sklearn.preprocessing.StandardScaler类实现了Transformer接口,可以保存训练数据中的参数(均值mean_、缩放比例scale_),并能将其应用到测试数据的标准化转换中。
将标准化转换器应用到新的测试数据:
min-max 标准化
min-max标准化方法是对原始数据进行线性变换。设minA和maxA分别为属性A的最小值和最大值,将A的一个原始值x通过min-max标准化映射成在区间[0,1]中的值x',其公式为:
新数据=(原数据-极小值)/(极大值-极小值)
sklearn.preprocessing.MinMaxScaler将属性缩放到一个指定的最大和最小值(通常是1-0)之间。
MinMaxScaler中可以通过设置参数feature_range=(min, max)指定最大最小区间。其具体的计算公式为:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
将标准化缩放应用到新的测试数据:
编程要求
本关任务希望对于California housing数据集进行标准化转换。
代码中已通过fetch_california_housing函数加载好了数据集,California housing数据集包含8个特征,分别是['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'],可通过dataset.feature_names访问数据具体的特征名称,通过在上一关卡的学习,相信大家对于原始数据的查看应该比较熟练了,在这里不过多说明。
本次任务只对California housing数据集中的两个特征进行操作,分别是第一个特征MedInc,其数据服从长尾分布;第6个特征AveOccup,数据中包含大量离群点。
本关具体分成为几个子任务:
1.使用MinMaxScaler对特征数据X进行标准化转换,并返回转换后的特征数据的前5条。
要补充的代码块如下:
def getMinMaxScalerValue():
'''
对特征数据X进行MinMaxScaler标准化转换,并返回转换后的数据前5条
返回值:
X_first5 - 数据列表
'''
X_first5 = []
# 请在此添加实现代码 #
# ********** Begin *********#
# ********** End **********#
return X_first5
2.使用scale对目标数据y进行标准化转换,并返回转换后的前5条数据。
要补充的代码块如下:
def getScaleValue():
'''
对目标数据y进行简单scale标准化转换,并返回转换后的数据前5条
返回值:
y_first5 - 数据列表
'''
y_first5 = []
# 请在此添加实现代码 #
# ********** Begin *********#
# ********** End **********#
return y_first5
3.使用StandardScaler对特征数据X的进行标准化转换,并返回转换后的均值和缩放比例值。
要补充的代码块如下:
def getStandardScalerValue():
'''
对特征数据X进行StandardScaler标准化转换,并返回转换后的数据均值和缩放比例
返回值:
X_mean - 均值
X_scale - 缩放比例值
'''
X_mean = None
X_scale = None
# 请在此添加实现代码 #
#********** Begin *********#
#********** End **********#
return X_mean,X_scale
测试说明
本关卡的测试数据来自./step4/testDataPreprocess.py文件,平台将比对您所编写函数的返回值与正确的数值,只有所有数据全部计算正确才能进入下一关。
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import scale
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import fetch_california_housing
'''
Data descrption:
The data contains 20,640 observations on 9 variables.
This dataset contains the average house value as target variable
and the following input variables (features): average income,
housing average age, average rooms, average bedrooms, population,
average occupation, latitude, and longitude in that order.
dataset : dict-like object with the following attributes:
dataset.data : ndarray, shape [20640, 8]
Each row corresponding to the 8 feature values in order.
dataset.target : numpy array of shape (20640,)
Each value corresponds to the average house value in units of 100,000.
dataset.feature_names : array of length 8
Array of ordered feature names used in the dataset.
dataset.DESCR : string
Description of the California housing dataset.
'''
dataset = fetch_california_housing("./step4/")
X_full, y = dataset.data, dataset.target
#抽取其中两个特征数据
X = X_full[:, [0, 5]]
def getMinMaxScalerValue():
'''
对特征数据X进行MinMaxScaler标准化转换,并返回转换后的数据前5条
返回值:
X_first5 - 数据列表
'''
X_first5 = []
# 请在此添加实现代码 #
# ********** Begin *********#
X_first5 = MinMaxScaler().fit_transform(X)
X_first5 = X_first5[:5]
# ********** End **********#
return X_first5
def getScaleValue():
'''
对目标数据y进行简单scale标准化转换,并返回转换后的数据前5条
返回值:
y_first5 - 数据列表
'''
y_first5 = []
# 请在此添加实现代码 #
# ********** Begin *********#
y_first5 = scale(y)
y_first5 = y_first5[:5]
# ********** End **********#
return y_first5
def getStandardScalerValue():
'''
对特征数据X进行StandardScaler标准化转换,并返回转换后的数据均值和缩放比例
返回值:
X_mean - 均值
X_scale - 缩放比例值
'''
X_mean = None
X_scale = None
# 请在此添加实现代码 #
#********** Begin *********#
scale = StandardScaler().fit(X)
X_mean = scale.mean_
X_scale = scale.scale_
#********** End **********#
return X_mean,X_scale