作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123308480
第1章 预处理缺失值概述
1.1 简介
机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实际收集数据的人却不是如此,因为各种各样的原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格、NaN,或者是其他的占位符。但是这样的数据集并不能和scikit-learn学习算法兼容。使用不完整的数据集的一个最简单的策略就是:舍弃掉整行或整列包含缺失值的数据。但是这样就付出了舍弃可能有价值数据(即使是不完整的 )的代价,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因此,数据预处理中非常重要的一项就是处理缺失值。
1.2 预处理缺失值的策略
处理缺失数值的一个更好的策略就是从已有的数据推断出缺失的数值。
推断缺失值的算法有:
(1)平均值mean:其他样本对应特征值的平均值替代缺失值
(2)频率最高值most_frequent:其他样本对应特征值的最高值替代缺失值
(3)中位数median:其他样本对应特征值的中位数替代缺失值
1.3 sklearn对缺失值处理的支持
(1)impute.SimpleImputer
class sklearn.impute.SimpleImputer ( missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True)
这个类是专门用来填补缺失值的。
它包括四个重要参数:
这4个参数,阐述了sklearn对缺失值处理的所有方法。
第2章 代码案例
2.1 直接丢弃:dropna
import pandas as pd
import numpy as np
from numpy import nan as NaN
data_raw = pd.DataFrame([[1,2,3],[NaN,NaN,2],[NaN,NaN,NaN],[8,8,NaN]])
print("data_raw:\n",data_raw)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False
data_drop = data_raw.dropna(axis=0, inplace=False)
print("\ndata_drop:\n",data_raw)
print("\ndata_dropna:\n",data_drop)
data_raw.dropna(axis=0, inplace=True)
print("\ndata_dropna:\n",data_raw)
data_raw: 0 1 2 0 1.0 2.0 3.0 1 NaN NaN 2.0 2 NaN NaN NaN 3 8.0 8.0 NaN data_drop: 0 1 2 0 1.0 2.0 3.0 1 NaN NaN 2.0 2 NaN NaN NaN 3 8.0 8.0 NaN data_dropna: 0 1 2 0 1.0 2.0 3.0 data_drop: 0 1 2 0 1.0 2.0 3.0
2.2 用常数填充:fillna
import pandas as pd
import numpy as np
from numpy import nan as NaN
data_raw = pd.DataFrame([[1,2,3],[NaN,NaN,2],[NaN,NaN,NaN],[8,8,NaN]])
print("data_raw:\n",data_raw)
#data_raw.info()
#data.fillna 在DataFrame里面直接进行填补
data_fill = data_raw.fillna(0)
print("\ndata_fill:\n",data_fill)
#data_fill.info()
data_raw: 0 1 2 0 1.0 2.0 3.0 1 NaN NaN 2.0 2 NaN NaN NaN 3 8.0 8.0 NaN data_fill: 0 1 2 0 1.0 2.0 3.0 1 0.0 0.0 2.0 2 0.0 0.0 0.0 3 8.0 8.0 0.0
2.3 用平均值mean填充: SimpleImputer(strategy='mean')
import numpy as np
from sklearn.impute import SimpleImputer
#策略有 mean,most_frequent,median
X = [[1, 6],
[np.nan, 3],
[7, 6]]
print(X)
print("")
# 设定缺失值填补策略
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
# 根据策略和输入数据,进行学习:计算获得缺失值
# 第一列缺失值=(1+7)/2 = 4;
# 第二列缺失值=(6+3+6)/3 = 5
imp.fit(X)
print(imp.transform(X))
print("")
# 用学习到的缺失值填充新的输入数据
Y = [[np.nan, 2],
[np.nan, np.nan],
[7, 6]]
print(imp.transform(Y))
[[1, 6], [nan, 3], [7, 6]] [[1. 6.] [4. 3.] [7. 6.]] [[4. 2.] [4. 5.] [7. 6.]]
2.4 频率最高值most_frequent填充:SimpleImputer(strategy='most_frequent')
import numpy as np
from sklearn.impute import SimpleImputer
#策略有 mean,most_frequent,median
X = [[1, 6],
[np.nan, 3],
[7, 6]]
print(X)
print("")
# 设定缺失值填补策略
imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
# 根据策略和输入数据,进行学习:计算获得缺失值
# 第一列缺失值= 1
# 第二列缺失值= 6
imp.fit(X)
print(imp.transform(X))
print("")
# 用学习到的缺失值填充新的输入数据
Y = [[np.nan, 2],
[np.nan, np.nan],
[7, 6]]
print(imp.transform(Y))
[[1, 6], [nan, 3], [7, 6]] [[1. 6.] [1. 3.] [7. 6.]] [[1. 2.] [1. 6.] [7. 6.]]
2.5 中位数median填充:SimpleImputer(strategy='median')
import numpy as np
from sklearn.impute import SimpleImputer
#策略有 mean,most_frequent,median
X = [[1, 6],
[np.nan, 3],
[7, 6]]
print(X)
print("")
# 设定缺失值填补策略
imp = SimpleImputer(missing_values=np.nan, strategy='median')
# 根据策略和输入数据,进行学习:计算获得缺失值
# 第一列缺失值= 4
# 第二列缺失值= 6
imp.fit(X)
print(imp.transform(X))
print("")
# 用学习到的缺失值填充新的输入数据
Y = [[np.nan, 2],
[np.nan, np.nan],
[7, 6]]
print(imp.transform(Y))
[[1, 6], [nan, 3], [7, 6]] [[1. 6.] [4. 3.] [7. 6.]] [[4. 2.] [4. 6.] [7. 6.]]
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123308480