

【scikit-learn基础】--『预处理』之 缺失值处理 - wang_yb
source link: https://www.cnblogs.com/wang_yb/p/17921351.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

数据的预处理是数据分析,或者机器学习训练前的重要步骤。
通过数据预处理,可以
- 提高数据质量,处理数据的缺失值、异常值和重复值等问题,增加数据的准确性和可靠性
- 整合不同数据,数据的来源和结构可能多种多样,分析和训练前要整合成一个数据集
- 提高数据性能,对数据的值进行变换,规约等(比如无量纲化),让算法更加高效
本篇介绍的缺失值处理,是数据预处理中非常重要的一步,因为很多机器学习算法都假设数据是完整的,算法的执行过程中没有考虑缺失值的影响。
所以,为了提高数据质量、改进数据分析结果、提高数据挖掘和机器学习的效果,缺失值处理必不可少。
处理缺失值的手段大致有4类:
- 删除存在缺失值数据行
- 填充缺失值
- 不处理缺失值
- 用深度学习方法处理
1.1. 删除缺失值数据
删除缺失值是最简单的一种处理方式,不过,在某些情况下,这可能会导致数据的大量丢失。
如果数据丢失过多,可能会改变数据的分布,影响模型的准确性。
所以,只有在缺失值占比很小的情况下,才会考虑使用这种处理方式。
删除缺失值用pandas
库的方法即可,比如:
import pandas as pd
df = pd.util.testing.makeMissingDataframe()
print("删除前: {} 行".format(len(df)))
df = df.dropna()
print("删除后: {} 行".format(len(df)))
# 运行结果
删除前: 30 行
删除后: 19 行
1.2. 填充缺失值
直接删除存在缺失值的数据行虽然简单,但是在实际应用中,使用的并不多。
实际情况下,使用最多的还是填充缺失值。
scikit-learn
库中,填充缺失值的方式主要有:
1.2.1. 均值填充
均值填充就是用缺失值所在列的平均值来填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("均值填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="mean")
data = imp.fit_transform(data)
print("均值填充后:\n{}".format(data))
# 运行结果
均值填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
均值填充后:
[[1. 2. 3. ]
[4. 5. 6. ]
[7. 8. 4.5]]
填充的5
和4.5
分别是第二列和第三列的平均值。
1.2.2. 中位数填充
中位数填充就是用缺失值所在列的中位数来填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 11, 12]])
print("中位数填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="median")
data = imp.fit_transform(data)
print("中位数填充后:\n{}".format(data))
# 运行结果
中位数填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 11. 12.]]
中位数填充后:
[[ 1. 2. 3.]
[ 4. 8. 6.]
[ 7. 8. 6.]
[10. 11. 12.]]
填充的8
和6
分别是第二列和第三列的中位数。
1.2.3. 众数填充
众数填充就是用缺失值所在列的众数数来填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 8, 3]])
print("众数填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="most_frequent")
data = imp.fit_transform(data)
print("众数填充后:\n{}".format(data))
# 运行结果
众数填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 8. 3.]]
众数填充后:
[[ 1. 2. 3.]
[ 4. 8. 6.]
[ 7. 8. 3.]
[10. 8. 3.]]
填充的8
和3
分别是第二列和第三列的众数。
1.2.4. 常量填充
常量填充就是用指定的常量来填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("常量填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, fill_value=100, strategy="constant")
data = imp.fit_transform(data)
print("常量填充后:\n{}".format(data))
# 运行结果
常量填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
常量填充后:
[[ 1. 2. 3.]
[ 4. 100. 6.]
[ 7. 8. 100.]]
缺失值用常量100
填充了。
1.2.5. 插值填充
插值填充就是使用线性插值或多项式插值等方法,基于已知的数据点估计缺失值。
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("插值填充前:\n{}".format(data))
imp = IterativeImputer(max_iter=10, random_state=0)
data = imp.fit_transform(data)
print("插值填充后:\n{}".format(data))
# 运行结果
插值填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
插值填充后:
[[1. 2. 3. ]
[4. 5.00203075 6. ]
[7. 8. 8.99796726]]
1.2.6. K近邻填充
K近邻填充就是利用K近邻算法,找到与缺失值最近的K个数据点,用它们的值的平均数或中位数来填充缺失值。
from sklearn.impute import KNNImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 11, 12]])
print("K近邻填充前:\n{}".format(data))
imp = KNNImputer(n_neighbors=2)
data = imp.fit_transform(data)
print("K近邻填充后:\n{}".format(data))
# 运行结果
K近邻填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 11. 12.]]
K近邻填充后:
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[10. 11. 12.]]
缺失值处理的主要作用包括:
- 提高数据完整性和准确性:如果数据中存在缺失值,可能会影响分析的准确性,甚至导致错误的结论。因此,通过填补缺失值,我们可以确保数据的完整性和准确性。
- 提升数据质量:缺失值可能会降低数据的质量,使得数据分析变得更为困难。通过处理缺失值,我们可以提升数据的质量,使得分析结果更加可靠。
- 提高算法性能:许多机器学习和数据挖掘算法在处理不完整数据时性能会下降。处理缺失值可以使得这些算法更好地运行,提高其性能。
- 减少信息丢失:在某些情况下,缺失值可能代表着某些信息的丢失。通过对这些缺失值进行处理,我们可以尽量减少信息丢失的数量。
- 消除或减少噪声:缺失值的存在可能会引入数据中的噪声,这种噪声可能会对数据分析产生干扰,甚至影响模型的训练效果。通过填补这些缺失值,我们可以消除或减少这种噪声。
在选择处理缺失值的方法时,需要考虑数据的性质、缺失值的比例、数据的分布以及具体的分析任务等因素。
同时,不同的方法可能适用于不同的场景,需要结合具体情况进行选择。
Recommend
-
5
一种提高区块链处理速度的交易预处理方案 | 登链社区 | 深入浅出区块链技术一种提高区块链处理速度的交易预处理方案 ...
-
2
1. 数据样本矩阵 一般数据集的构造形式:一行一样本,一列一特征,以下为一个示例 姓名 年龄 性别 工作经验 月薪
-
2
安装解压缩工具 tar # 检查是否安装了解压缩工具 tar yum list tar # 如未安装 tar yum install tar -y 安装必备的 java # 检查是否安装了 java-openjdk,这里选择 java-1.8.0.openjdk 版 y...
-
7
【pandas基础】--目录(完结) pandas 基础内容的目录...
-
9
Matplotlib中刻度是用于在绘图中表示数据大小的工具。 刻度是坐标轴上的数字或标签,用于指示数据的大小或值,通常以整数或小数表示,具体取决于坐标轴的类型和限制。 1. 主次刻度 默认...
-
4
【scikit-learn基础】--『预处理』之 离散化 数据的...
-
6
【scikit-learn基础】--『监督学习』之 LASSO回归
-
8
层次聚类算法是机器学习中常用的一种无监督学习算法,它用于将数据分为多个类别或层次。该方法在计算机科学、生物学、社会学等多个领域都有广泛应用。 层次聚类算法的历史可以追溯到上世纪60年代,当时它主要被用于...
-
14
分类模型评估时,scikit-learn提供了混淆矩阵和分类报告是两个非常实用且常用的工具。它们为我们提供了详细的信息,帮助我们了解模型的优缺点,从而进一步优化模型。 这两个工具之所...
-
6
模型持久化(模型保存与加载)是机器学习完成的最后一步。因为,在实际情况中,训练一个模型可能会非常耗时,如果每次需要使用模型时都要重新训练,这无疑会浪费大量的计算资源和时间。 通过将训练好的模型持久化到磁盘,我们可以在需...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK