机器学习中的缺失值处理

机器学习项目中,数据集经常包含“None”或“NaN”类型的缺失值。在处理机器学习算法和训练时,必须小心处理这些缺失数据。缺失值可以通过基础的Python编程、pandas库和名为SimpleImputer的scikit-learn库来填充。使用scikit-learn库中的SimpleImputer处理缺失值是最简单和最方便的方法之一。

简而言之,SimpleImputer是一个用于填充数据集中缺失值的scikit库。正如其名,该类对数据集执行简单的插补,并根据给定的策略用另一个值替换缺失数据。

SimpleImputer初始化的基本语法或结构如下:

SimpleImputer( missing_values=np.nan, strategy='mean', fill_value=None, verbose=0, copy=True, add_indicator=False )

SimpleImputer参数说明:

  • missing_values: 表示数据集中的缺失值。默认设置为np.nan,意味着所有包含np.nan的值将被视为缺失值。
  • strategy: 想要填充缺失值的方法。strategy的值可以是“mean”、“median”、“most_frequent”或“constant”。
  • fill_value: 当strategy设置为constant时使用的参数。当strategy为constant时,Nan值将被fill_value参数中传递的值替换。
  • verbose: 控制SimpleImputer的详细程度的参数。默认值设置为0。
  • copy: 如果此参数设置为True,则会创建数据集的副本,否则将不复制直接进行插补。
  • add_indicator: 如果此参数设置为True,MissingIndicator转换将堆叠到imputer的transform输出上。

要开始使用SimpleImputer库,首先必须安装并从scikit-learn导入该库。

# 安装scikit-learn库 pip install scikit-learn # 导入sklearn import sklearn # 导入simpleimputer from sklearn.impute import SimpleImputer

使用“Mean”插补策略,允许通过数据集的平均值来插补缺失值。这种策略只能用于数值型数据集。

imputer = SimpleImputer(missing_values=np.nan, strategy='mean') imputer.fit(df['age']) df['age'] = imputer.fit_transform(df['age'])

例如,假设数据集中有一个名为“Age”的数值列,其中一些值缺失。使用均值策略将允许通过所有年龄值的平均值来填充该列中的缺失值。

imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') imp_mean.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]]) age = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]] print(imp_mean.transform(age))

上述代码的输出将是:

[[ 7. 2. 3. ] [ 4. 3.5 6. ] [10. 3.5 9. ]]

在使用均值策略插补时,应考虑异常值的情况,因为均值策略计算值的平均值并用计算出的平均值填充缺失值,但在异常值的情况下,由于异常值的影响,平均值可能会偏向一侧并产生偏差,导致不准确的平均值插补。

使用“Median”插补策略,允许通过数据集的中位数来插补缺失值。这种策略只能用于数值型数据集。

imputer = SimpleImputer(missing_values=np.nan, strategy='median') imputer.fit(df['age']) df['age'] = imputer.fit_transform(df['age'])

例如,假设数据集中有一个名为“Age”的列,其中有一个缺失值。使用中位数策略将允许通过该列年龄的中位数来填充缺失值。

imp_median = SimpleImputer(missing_values=np.nan, strategy='median') imp_median.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]]) age = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]] print(imp_median.transform(age))

上述代码的输出将是:

[[ 7. 2. 3. ] [ 4. 3.5 6. ] [10. 3.5 9. ]]

“Most_frequent”插补是一种用于处理分类缺失数据的技术。这种技术用于有分类列中的缺失值时。

imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent') imputer.fit(df['category']) df['category'] = imputer.fit_transform(df['category'])

例如,假设有一个分类列“Category”,其中包含缺失值。使用最常见的插补技术将允许通过数据集中该列最常见的值来填充缺失值。

imp_mf = SimpleImputer(missing_values=np.nan, strategy='most_frequent') imp_mf.fit([['one', 'two', 'three'], ['four', np.nan, 'six'], ['two', 'five', 'two']]) category = [[np.nan, 'two', 'two'], ['four', np.nan, 'six'], ['ten', np.nan, 'nine']] print(imp_mf.transform(category))

上述代码的输出将是:

[['two' 'two' 'two'] ['four' 'two' 'six'] ['ten' 'two' 'nine']]

“Constant”插补是一种在SimpleImputer中使用的技术,通过它可以将缺失值填充为想要的任何值。这可以用于字符串和数值数据集。

imputer = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=20) imputer.fit(df['age']) df['age'] = imputer.fit_transform(df['age'])

例如,假设想要将所有缺失值填充为20。通过将期望的值传递给fill_value参数,可以用fill_value参数中传递的值填充数据集中的所有缺失值。

imp_constant = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=20) imp_constant.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]]) age = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]] print(imp_constant.transform(age))

上述代码的输出将是:

[[20. 2. 3. ] [ 4. 20. 6. ] [10. 20. 9. ]]
  • 在使用均值策略时,应考虑异常值的情况,因为异常值可能会影响数据插补,可能导致模型不够准确,出现意外行为。(在异常值的情况下避免使用均值策略)。
  • 均值和中位数策略只能用于数值数据,最频繁策略只能用于分类数据。它们是最容易和计算量最小的方法之一。
  • 当对数据集有更好的理解,并且已经知道用期望的数字或字符串填充缺失值的影响时,可以使用常数策略。它可以用于字符串和数值数据。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485