六、准备数据(数据预处理)
首先分开特征(feature)和目标标签(label),以median_house_value为标签,其他为特征
train_housing = strat_train_set.drop("median_house_value", axis=1)
train_housing_labels = strat_train_set["median_house_value"].copy()
数据清理
①处理缺失值:三种方案:去掉含有缺失值的个体(dropna);去掉含有缺失值的特征(drop);
给缺失值补上一些值(0、平均数、中位数)(fillna)
Scikit-Learn 中对缺失值处理的类Imputer(只对实数值有效,需要先去除文本特征)
from sklearn.preprocessing import Imputer
imputer = Imputer(strategy="median")
housing_num = train_housing.drop("ocean_proximity", axis=1)
imputer.fit(housing_num)
②处理类别文本特征
由于文本特征不能做median等操作,所以需要将文本特征转换为实数特征,对应的类Scikit-Learn中的LabelEncoder,通过调用LabelEnconder类,在使用fit_transform()方法自动将文本特征编码
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
housing_cat = train_housing["ocean_proximity"]
housing_cat_encoded = encoder.fit_transform(housing_cat)
print(housing_cat_encoded)
print(encoder.classes_)
由于0到1的距离比0到3的距离要近,所以这种数字编码暗含了0和1的相似性比0到3的相似性要强,然而事实
上并非如此,每个元素的相似性应趋于相等。如果该数字编码作为label,则只是一个标签,没有什么影响。但
是如果用于特征,则这种数字编码不适用,应该采用one hot编码(形式可以看下面的图),对应Scikit-Learn
中的类为OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
housing_cat_1hot = encoder.fit_transform(housing_cat_encoded.reshape(-1,1))
默认的输出结果为稀疏矩阵Scipy(sparse matrix),而不是Numpy,由于矩阵大部分为0,浪费空间,所以使
用稀疏矩阵存放,如果想看矩阵的具体样子,则用toarray()方法变为dense matrix(Numpy)
上述文本编码先经过数字编码再转为one hot编码用了两步,当然也可以一步到位,直接从文本编码到one
hot,对应Scikit-Learn中的类为LabelBinarizer
from sklearn.preprocessing import LabelBinarizer
encoder = LabelBinarizer()
#encoder = LabelBinarizer(sparse_output=True)
housing_cat_1hot = encoder.fit_transform(housing_cat)
要注意的是,不设参数sparse_output=True的话,默认输出的是Numpy矩阵。