[机器学习与scikit-learn-9]:数据预处理-2-缺失数据na的预处理

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值