数据预处理与机器学习算法

机器学习的世界里,数据预处理是一个至关重要的步骤,它直接影响到算法的性能和结果的准确性。本文将带了解数据预处理的基本概念、重要性以及实际操作方法。将以房屋数据集为例,详细探讨数据预处理的各个环节。

数据预处理简介

数据预处理,又称为数据清洗,是机器学习中不可或缺的一环。它涉及到将原始数据转换成算法能够理解和处理的形式。数据可能以多种形式存在,如音频、视频、图像等,但机器学习算法目前只能理解数字数据。因此,需要将这些数据转换成算法能够处理的形式。

数据清洗

数据清洗是数据预处理的首要步骤。大多数机器学习算法无法处理缺失特征的数据。例如,在房屋数据集中,总卧室数(total_bedrooms)存在一些缺失值。可以通过以下三种方式处理这些缺失值:

  1. 移除所有包含缺失值的行:df.dropna(subset=["total_bedrooms"])
  2. 移除整个属性列:df.drop("total_bedrooms",axis=1)
  3. 用其他值(如均值、中位数或0)替换缺失值:median = df['total_bedrooms'].median() df['total_bedrooms'].fillna(median, inplace=True)

通常,会选择用中位数替换缺失值,并保存这些中位数值,以便后续在测试集和项目上线时使用。Scikit-Learn 提供了一个名为 SimpleImputer 的类,可以帮助处理缺失值。

from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy="median") imputer_df = df.drop("ocean_proximity",axis=1) imputer.fit(imputer_df) X = imputer.transform(imputer_df) revised_df = pd.DataFrame(X, columns=imputer_df.columns, index=imputer_df.index)

经过上述步骤,所有的缺失值都被相应的中位数替换。

文本和分类属性处理

对于文本和分类属性,需要将它们转换成数字,以便机器学习算法能够处理。在数据集中,有一个名为 ocean_proximity 的文本属性,它包含了有限数量的唯一值,每个值代表一个类别。可以使用 Scikit-Learn 中的 OrdinalEncoder 类来处理这类数据。

from sklearn.preprocessing import OrdinalEncoder oe = OrdinalEncoder() encoded_ocean_proximity = oe.fit_transform(ocean)

这种方法将所有分类数据转换成对应的数字。但是,如果机器学习算法假设两个相近的值比两个相距较远的值更相关,这可能会导致问题。为了解决这个问题,可以为每个类别创建一个二进制属性,这就是所谓的 one-hot 编码。

from sklearn.preprocessing import OneHotEncoder ohe = OneHotEncoder() df_hot = ohe.fit_transform(ocean)

这种方法将每个类别转换成一个二进制属性,只有一个属性是“热”的(即值为1),其余都是“冷”的(即值为0)。这种编码方式在处理成千上万个类别时非常有用,因为它避免了创建大量包含零的列,从而节省了内存。

特征缩放

特征缩放是数据预处理中非常重要的一步。机器学习算法通常在数值属性具有相同尺度时表现更好。在数据集中,中位数收入的范围仅为0到15,而总房间数的范围约为2到39,320。可以通过两种方式使所有属性具有相同的尺度:

  1. 最小-最大缩放(Min-Max Scaling):也称为归一化,它通过减去最小值并除以最大值和最小值之间的差来调整值的范围,使其在0到1之间。
  2. 标准化(Standardization):它首先减去均值,然后除以标准差,以获得单位方差。这种方法不会将值限制在特定的范围内,但对异常值的影响较小。

Scikit-Learn 提供了 MinMaxScaler 和 StandardScaler 这两个转换器来完成这些任务。

数据预处理中,需要执行许多数据转换步骤,并且必须按照正确的顺序执行。幸运的是,Scikit-Learn 提供了一个名为 Pipeline 的类,可以帮助轻松管理这些任务的顺序。

from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler pipe = Pipeline([ ('imputer', SimpleImputer(strategy="median")), ('std_scaler', StandardScaler()) ]) df_tr = pipe.fit_transform(imputer_df)

Pipeline 构造函数接受一个按顺序排列的估计器列表。最后一个估计器必须是转换器,即它们应该具有 fit_transform() 方法。当调用 pipeline 的 fit_transform 方法时,fit_transform 会按顺序对每个转换器调用,将每个转换器的输出传递给下一个调用,直到调用 fit() 方法(最终的估计器)。

制作完美菜肴的关键在于选择正确的食材。同样,在机器学习项目中,正确的数据预处理是获得最佳结果的关键。本文讨论了数据预处理的必要性、制作数据准备函数的好处以及几种数据预处理方法。请务必查看使用的所有转换器的官方文档,以更好地掌握它们。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485