ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【scikit-learn基础】--『预处理』之 缺失值处理 [打印本页]

作者: 东湖之滨    时间: 2024-3-1 12:05
标题: 【scikit-learn基础】--『预处理』之 缺失值处理
数据的预处理是数据分析,或者机器学习训练前的重要步骤。
通过数据预处理,可以
本篇介绍的缺失值处理,是数据预处理中非常重要的一步,因为很多机器学习算法都假设数据是完整的,算法的执行过程中没有考虑缺失值的影响。
所以,为了提高数据质量、改进数据分析结果、提高数据挖掘和机器学习的效果,缺失值处理必不可少。
1. 原理

处理缺失值的手段大致有4类
1.1. 删除缺失值数据

删除缺失值是最简单的一种处理方式,不过,在某些情况下,这可能会导致数据的大量丢失。
如果数据丢失过多,可能会改变数据的分布,影响模型的准确性。
所以,只有在缺失值占比很小的情况下,才会考虑使用这种处理方式。
删除缺失值用pandas库的方法即可,比如:
  1. import pandas as pd
  2. df = pd.util.testing.makeMissingDataframe()
  3. print("删除前: {} 行".format(len(df)))
  4. df = df.dropna()
  5. print("删除后: {} 行".format(len(df)))
  6. # 运行结果
  7. 删除前: 30 行
  8. 删除后: 19 行
复制代码
1.2. 填充缺失值

直接删除存在缺失值的数据行虽然简单,但是在实际应用中,使用的并不多。
实际情况下,使用最多的还是填充缺失值。
scikit-learn库中,填充缺失值的方式主要有:
1.2.1. 均值填充

均值填充就是用缺失值所在列的平均值来填充缺失值。
  1. from sklearn.impute import SimpleImputer
  2. data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
  3. print("均值填充前:\n{}".format(data))
  4. imp = SimpleImputer(missing_values=np.nan, strategy="mean")
  5. data = imp.fit_transform(data)
  6. print("均值填充后:\n{}".format(data))
  7. # 运行结果
  8. 均值填充前:
  9. [[ 1.  2.  3.]
  10. [ 4. nan  6.]
  11. [ 7.  8. nan]]
  12. 均值填充后:
  13. [[1.  2.  3. ]
  14. [4.  5.  6. ]
  15. [7.  8.  4.5]]
复制代码
填充的5和4.5分别是第二列第三列的平均值。
1.2.2. 中位数填充

中位数填充就是用缺失值所在列的中位数来填充缺失值。
  1. from sklearn.impute import SimpleImputer
  2. data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 11, 12]])
  3. print("中位数填充前:\n{}".format(data))
  4. imp = SimpleImputer(missing_values=np.nan, strategy="median")
  5. data = imp.fit_transform(data)
  6. print("中位数填充后:\n{}".format(data))
  7. # 运行结果
  8. 中位数填充前:
  9. [[ 1.  2.  3.]
  10. [ 4. nan  6.]
  11. [ 7.  8. nan]
  12. [10. 11. 12.]]
  13. 中位数填充后:
  14. [[ 1.  2.  3.]
  15. [ 4.  8.  6.]
  16. [ 7.  8.  6.]
  17. [10. 11. 12.]]
复制代码
填充的8和6分别是第二列第三列的中位数。
1.2.3. 众数填充

众数填充就是用缺失值所在列的众数数来填充缺失值。
  1. from sklearn.impute import SimpleImputer
  2. data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 8, 3]])
  3. print("众数填充前:\n{}".format(data))
  4. imp = SimpleImputer(missing_values=np.nan, strategy="most_frequent")
  5. data = imp.fit_transform(data)
  6. print("众数填充后:\n{}".format(data))
  7. # 运行结果
  8. 众数填充前:
  9. [[ 1.  2.  3.]
  10. [ 4. nan  6.]
  11. [ 7.  8. nan]
  12. [10.  8.  3.]]
  13. 众数填充后:
  14. [[ 1.  2.  3.]
  15. [ 4.  8.  6.]
  16. [ 7.  8.  3.]
  17. [10.  8.  3.]]
复制代码
填充的8和3分别是第二列第三列的众数。
1.2.4. 常量填充

常量填充就是用指定的常量来填充缺失值。
  1. from sklearn.impute import SimpleImputer
  2. data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
  3. print("常量填充前:\n{}".format(data))
  4. imp = SimpleImputer(missing_values=np.nan, fill_value=100, strategy="constant")
  5. data = imp.fit_transform(data)
  6. print("常量填充后:\n{}".format(data))
  7. # 运行结果
  8. 常量填充前:
  9. [[ 1.  2.  3.]
  10. [ 4. nan  6.]
  11. [ 7.  8. nan]]
  12. 常量填充后:
  13. [[  1.   2.   3.]
  14. [  4. 100.   6.]
  15. [  7.   8. 100.]]
复制代码
缺失值用常量100填充了。
1.2.5. 插值填充

插值填充就是使用线性插值或多项式插值等方法,基于已知的数据点估计缺失值。
  1. from sklearn.experimental import enable_iterative_imputer
  2. from sklearn.impute import IterativeImputer
  3. data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
  4. print("插值填充前:\n{}".format(data))
  5. imp = IterativeImputer(max_iter=10, random_state=0)
  6. data = imp.fit_transform(data)
  7. print("插值填充后:\n{}".format(data))
  8. # 运行结果
  9. 插值填充前:
  10. [[ 1.  2.  3.]
  11. [ 4. nan  6.]
  12. [ 7.  8. nan]]
  13. 插值填充后:
  14. [[1.         2.         3.        ]
  15. [4.         5.00203075 6.        ]
  16. [7.         8.         8.99796726]]
复制代码
1.2.6. K近邻填充

K近邻填充就是利用K近邻算法,找到与缺失值最近的K个数据点,用它们的值的平均数或中位数来填充缺失值。
  1. from sklearn.impute import KNNImputer  
  2. data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 11, 12]])
  3. print("K近邻填充前:\n{}".format(data))
  4. imp = KNNImputer(n_neighbors=2)  
  5. data = imp.fit_transform(data)
  6. print("K近邻填充后:\n{}".format(data))
  7. # 运行结果
  8. K近邻填充前:
  9. [[ 1.  2.  3.]
  10. [ 4. nan  6.]
  11. [ 7.  8. nan]
  12. [10. 11. 12.]]
  13. K近邻填充后:
  14. [[ 1.  2.  3.]
  15. [ 4.  5.  6.]
  16. [ 7.  8.  9.]
  17. [10. 11. 12.]]
复制代码
2. 作用

缺失值处理的主要作用包括:
3. 总结

在选择处理缺失值的方法时,需要考虑数据的性质、缺失值的比例、数据的分布以及具体的分析任务等因素。
同时,不同的方法可能适用于不同的场景,需要结合具体情况进行选择。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4