数据清洗
接上一篇博客:机器学习实战之多变量房价预测详解
继续学习:
大多数机器学习算法不能处理有缺失数据的特征,所以我们要处理特征缺失的问题。前面的数据中属性total_bedrooms有一些缺失值。
常见的解决方法有:
去掉对应的街区。
去掉整个属性。
进行赋值(0,平均值,中位数)。
使用dDataFrame的dropna() drop() fillna()方法对应如上三种操作。
housing.dropna(subset=["total_bedrooms"]) ##去除对应街区
housing.drop("total_bedrooms",axis=1) ## 去掉整个属性
median=housing["total_bedrooms"].median()
housing["total_bedrooms"].fillna(median)
###使用中位数填充
使用sklearn来对缺失值进行处理。方法:Imputer()
使用方法:创建一个Imputer实例,指定用某属性的中位数来替换该属性的所有缺失值。
##使用sklearn来对缺失值进行处理。方法:Imputer()
##使用方法:创建一个Imputer实例,指定用某属性的中位数来替换该属性的所有缺失值。
from sklearn.preprocessing import Imputer
imputer=Imputer(strategy="median")
因为只有数值属性我们才能计算中位数,所以删除文本属性ocean_proximity
housing_num=housing.drop("ocean_proximity",axis=1)
###使用fit()方法拟合到训练数据中。
imputer.fit(housing_num)
上面是使用Imputer计算出了每个属性的中位数。并将所有属性的中位数的结果保存到statistics_中。使用命令查看这些中位数。
#上面是使用Imputer计算出了每个属性的中位数。并将所有属性的中位数的结果保存到statistics_中。使用命令查看这些中位数。
print(imputer.statistics_)
print(housing_num.median().values)
###将训练过的imputer对训练集进行转换,缺失值替换为中位数
X=imputer.transform(housing_num)
得到的结果是numpy数组,然后转换成dataframe格式。
housing_tr=pd.DataFrame(X,columns=housing_num.columns)
处理文本和类别属性
将文字标签转换成数字。
Scikit-Learn 为这个任务提供了一个转换器 LabelEncoder :
##将文本标签转换成数字,Scikit-Learn 为这个任务提供了一个转换器 LabelEncoder :
from sklearn.preprocessing import LabelEncoder
encoder=LabelEncoder()
housing_cat=housing["ocean_proximity"]
housing_cat_encoded=encoder.fit_transform(housing_cat)
###对数据进行转换
housing_cat_encoded
以上只能对一列文本特征进行转换,如果需要多列,则使用factorize()如下操作:
####以上只能对一列文本特征进行转换,如果需要多列,则使用factorize()如下操作:
housing_cat_encoded,housing_categories = housing_cat.factorize()
housing_cat_encoded[:10]
###对应的数值
housing_categories
###对应的标签
这种做法的问题是, ML 算法会认为两个临近的值比两个疏远的值要更相似。 显然这样不对( 比如, 分类 0 和 4 比 0 和 1 更相似) 。使用独热编码(要解决这个问题, 一个常见的方法是给每个分类创建一个二元属性: 当分类是 <1H OCEAN , 该属性为 1( 否则为 0) , 当分类是 INLAND , 另一个属性等于 1( 否则为 0) , 以此类推。 这称作独热编码( One-Hot Encoding) )将整数分类转化成独热变量。
from sklearn.preprocessing import OneHotEncoder
encoder=OneHotEncoder()
housing_cat_1hot=encoder.fit_transform(housing_cat_encoded.reshape(-1,1))
## fit_transform() 用于 2D 数组, 而 housing_cat_encoded 是一个 1D 数组, 所以需要将其变
形
housing_cat_1hot
使用LabelBinarizer可以直接实现标签列从文本分类到整数分类,再从整数分类到独热向量。
from sklearn.preprocessing import LabelBinarizer
encoder=LabelBinarizer()
housing_cat_1hot=encoder.fit_transform(housing_cat)
housing_cat_1hot
###返回结果是一个Numpy数组向构造器 LabelBinarizer 传递 sparse_output=True , 就可以得到一个稀疏矩阵。
训练集数据列实现文本到独热编码转化:
##训练集数据列实现文本到独热编码转化:
from sklearn.preprocessing import CategoricalEncoder
cat_encoder = CategoricalEncoder()
housing_cat_reshaped = housing_cat.values.reshape(-1, 1)
housing_cat_1hot = cat_encoder.fit_transform(housing_cat_reshaped)
housing_cat_1hot
特征缩放
常见的两种特征缩放的方法分别是线性函数归一化和标准化。、
线性函数归一化(归一化)值被转变,重新缩放,直到范围变成0-1.通过减去最小值,然后除以最大值与最小值的差值,进行归一化。Scikit-Learn 提供了一个转换器 MinMaxScaler 来实现这个功能。 它有一个超参数 feature_range , 可以让你改变范围, 如果不希望范围是 0 到 1。
标准化:首先减去平均值,然后除以方差,标准化的数据不会限定在某个范围。但是标准化受到异常值的影响很小。
Scikit-Learn 提供了一个转换器 StandardScaler 来进行标准化。