大多数机器学习算法都在特征缺失的情况下正常工作,所以让我们创建一些函数来处理它们。您之前注意到total_bedroom属性有一些缺失值,所以我们来修复这个问题。你有三个选择:
去掉相应的地区数据
去掉整个属性
将缺失的值设置为某个指定的值(如0、平均值、中值等)。
您可以使用DataFrame的dropna()、drop()和fillna()方法轻松完成这些操作:
housing.dropna(subset=["total_bedrooms"]) # option 1
housing.drop("total_bedrooms", axis=1) # option 2
median = housing["total_bedrooms"].median()
housing["total_bedrooms"].fillna(median) # option 3
如果您选择了第3个选择,您应该计算训练集的中值,并使用它来填充训练集中的缺失值,但也不要忘记保存您计算过的中值。当您想要评估您的系统时,您将需要它来替换测试集中所缺少的值,并且在得到新的数据时,系统也可以实时替换丢失的值。
Scikit-Learn提供了一个方便的类来处理缺失的值:Imputer类。下面是如何使用它。首先,您需要创建一个Imputer实例,指定要将每个属性的缺失值替换为该属性的中值:
from sklearn.preprocessing import Imputer
imputer = Imputer(strategy="median")
由于中值只能在数字属性上计算,所以我们需要创建一个数据的副本,该副本去除了文本属性ocean_proximity。
housing_num = housing.drop("ocean_proximity", axis=1)
现在,您可以使用fit()方法将该imputer实例与训练数据相匹配:
imputer.fit(housing_num)
该属性仅计算每个属性的中位数,并将结果存储在其实例变量 statistics_ 中。只有 total_bedrooms属性缺少值,但是我们不能确定系统运行后的新数据中不会有任何缺失值,所以将imputer应用到所有数字属性上更安全:
>>> imputer.statistics_
array([ -118.51 , 34.26 , 29. , 2119. , 433. , 1164. , 408. , 3.5414])
>>> housing_num.median().values
array([ -118.51 , 34.26 , 29. , 2119. , 433. , 1164. , 408. , 3.5414])
现在您可以使用这个“经过训练”的imputer来通过学习到的中值来替换缺失的值,以达到转换训练集的作用:
X = imputer.transform(housing_num)
其结果是一个包含转换后的特征的普通Numpy数组。如果你想把它放回Pandas的DataFrame,它很简单:
housing_tr = pd.DataFrame(X, columns=housing_num.columns)
Scikit-Learn设计
scikitt - learn的API设计得非常好。主要设计原则为:
Consistency(一致性).所有对象共享一个一致且简单的接口
Estimators.任何可以根据数据集估计一些参数的对象都称为估计器[Estimators](例如,imputer就是一种估计器)。估计本身是由fit()方法执行的,它只需要一个数据集作为参数(或者两个数据集,以用于监督学习算法;第二个数据集包含的是标签label)。指导估计过程所需的任何其他参数都被认为是一个超参数(比如 imputer的strategy ),它必须被设置为一个实例变量(通常通过构造函数参数)。
Transformers.一些估计器(例如一个imputer)也可以转换数据集;这些被称为转换器[transformers]。同样,这个API非常简单:转换由transform()方法执行,该方法的入参是待转换的数据集。而这个方法的返回值是转换后的数据集。这种转换通常依赖于所习得的参数,就像imputer一样。所有的转换器都有一个名为fit_transform()的便利方法,它相当于调用fit(),然后transform()(但有时fit_transform()是更优的,他可能运行的速度要更快)。
Predictors。最后,一些估计器能够预测给定的数据集;他们被称为预测器[Predictors]。例如,前一章的LinearRegression模型就是一个预测器:它预测了一个国家人均GDP的生活满意度。预测器有一个predict()方法。,它返回新样本的数据集,并返回对应预测得的数据集。它也有一个score()方法,用来度量给定测试集的预测质量(以及在监督学习算法中对应的标签。)。
Inspection(检查).所有的估计器的超参数都可以通过公共实例变量直接访问(例如,imputer.strategy),并且所有的估计器的习得参数也可以通过公共实例变量来访问,这些变量有一个下划线后缀(例如,imputer.statistics_)。
Nonproliferation of classes(不扩散的类).数据集被表示为NumPy数组或SciPy稀疏矩阵,而不是自制类。超参数只是普通的Python字符串或数字。
Composition(组合).尽可能的重用现有的构建块。例如,可以很容易会用任意顺序的转换器,然后紧跟着一个估计其,很简单的创建出一个Pipeline估计器。
Sensible defaults.。Scikit-Learn为大多数参数提供了合理的默认值,这使得创建一个基线工作系统变得非常容易。