数据预处理----缺失值的填充

概述

机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因此,数据预处理中非常重要的一项就是处理缺失值。

缺失值的常用处理方式

  • 删除:数据缺失量比较少,删除后对模型的结果几乎不会造成影响;与模型准确性几乎无关的属性
  • 填充
    • 均值
    • 众数
    • 中位数
    • 0
    • 随机森林

sklearn中缺失值填充模块

对pandas熟悉的可用使用pandas来进行缺失值的填充,详情见我的pandas笔记,这里主要将sklearn中对缺失值处理的相关方法。本次使用的数据为kaggle上泰坦尼克幸存者数据集,原始数据下载地址,也可以在我的数据集下载地址获得同样的数据
sklearn中impute模块的SimpleImputer类专门用来进行缺失值的简单填充,它包含四个重要参数

参数含义
missing_values告诉SimpleImputer对象,数据的缺失值长什么样子,默认为np.nan
strategy填补缺失值的策略
strategy=‘mean’(默认)仅适用数值型特征
strategy=‘median’ 使用中值填充,仅适用数值型特征
strategy=‘most_frequent’ 使用众数填充,数值型字符型均可使用
strategy=‘constant’ 表示参考fill_value参数中的值,数值型和字符型均可使用
fill_value参数为strategy=‘constant’时可用,可输入字符串或数值来填充缺失值
copy默认为True,表示创建原数据的副本,修改后的数据不会对原始数据造成影响

缺失值填充示例

准备工作

导入相关模块,读取数据集

# 导入相关模块
from sklearn.impute import SimpleImputer
import numpy as np
import pandas as pd

# 数据路径,自己本地的文件路径
file_name = "../../data/titanic/train.csv"

# 加载数据集
df = pd.read_csv(file_name)
df.head()

# 删除不必要的列
df.drop(['Name', 'Ticket', 'Cabin'], inplace=True, axis=1)
df.head()

在这里插入图片描述

查看原始数据的信息

df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 9 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Fare           891 non-null float64
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(2)
memory usage: 62.8+ KB
'''

原始数据共891条记录,其中Age属性缺失接近200个数据,占比达到了20%左右,这是一个很巨大的占比了,已经不能简单的删除缺失值操作了,如果删除了这个属性,样本数据会变小很多,那么训练出来的模型将会获得一个不好的表现。所以这里需要对Age属性进行缺失值填充。Embarked属性缺失两个,占比相当小,这种情况可用直接删除即可,这里只考虑对Age的填充,可用使用 的方法由pandas填补缺失值,详见我的pandas笔记,下面主要介绍用sklearn.impute模块的SimpleImputer类进行填充缺失值。
注意点:使用sklearn中的方法时,要求输入的数据必须是二维的,所以需要对单特征列进行reshape操作

0填充

# 用0填充年龄的缺失值
df0 = df.copy() # 复制原数据,避免原数据被覆盖

# 实例化
impute_0 = SimpleImputer(strategy='constant', fill_value=0)

# 去除Age属性的原始数据,并通过values转化为一维数组,在通过reshape变为二维数组
# 因为sklearn中传到数据必须是二维的
raw_data = df0['Age'].values.reshape(-1, 1)

# fit_transform()一步到位,返回填充后的数据
new_data = impute_0.fit_transform(raw_data)

# 用新数据替换原数据
df0['Age'] = new_data
df0.head(10)

在这里插入图片描述

均值填充

# 用均值填充年龄的缺失值
df_mean = df.copy()
impute_mean = SimpleImputer()
raw_data = df_mean['Age'].values.reshape(-1, 1)
new_data = impute_mean.fit_transform(raw_data)
df_mean['Age'] = new_data
df_mean.head(10)

在这里插入图片描述

众数填充

# 用众数填充年龄缺失值
df_mode = df.copy()
impute_mode = SimpleImputer(strategy='most_frequent')
raw_data = df_mode['Age'].values.reshape(-1, 1)
new_data = impute_mode.fit_transform(raw_data)
df_mode['Age'] = new_data
df_mode.head(10)

在这里插入图片描述

中位数填充

# 用中位数填充年龄缺失值
df_median = df.copy()
impute_median = SimpleImputer(strategy='median')
raw_data = df_median['Age'].values.reshape(-1, 1)
new_data = impute_median.fit_transform(raw_data)
df_median['Age'] = new_data
df_median.head(10)

在这里插入图片描述

随机森林填充

用随机森林填充缺失值

总结

具体用哪一种填充方式看个人和具体的数据情况,只要达到目的都是好的。大多数情况下先考虑常规的填充方法(0,均值,中位数,众数),当这些方法用了之后发现鲜果不明显,但是又不能将缺失值删除的情况下九月考虑用随机森林等方式来填充缺失值。

数据预处理数据分析中非常重要的一个环节,它可以让原始数据更加适合用于各种分析和建模任务。常见的数据预处理包括数据清洗、缺失值处理、异常值处理、特征选择、特征缩放和特征变换等。下面我们将介绍一些常见的数据预处理方法。 1. 数据清洗 数据清洗是指在数据中去除不合理、重复或者无效的数据,保证数据的完整性和准确性。常见的数据清洗方法包括: - 删除重复数据 - 去除异常值 - 去除不合理数据 - 填充缺失值 2. 缺失值处理 缺失值是指数据集中某些数据缺失的情况。常见的缺失值处理方法包括: - 删除缺失值 - 插值法填补缺失值 - 使用均值、中位数、众数等统计量填补缺失值 3. 异常值处理 异常值是指数据集中不符合正常规律的数据。常见的异常值处理方法包括: - 删除异常值 - 修改异常值 - 使用插值法填补异常值 4. 特征选择 特征选择是指从原始数据中选择最具有代表性的特征,以便用于分析和建模。常见的特征选择方法包括: - 过滤式特征选择 - 包裹式特征选择 - 嵌入式特征选择 5. 特征缩放 特征缩放是指将不同量纲的特征缩放到相同的范围内。常见的特征缩放方法包括: - 标准化 - 归一化 - 对数变换 6. 特征变换 特征变换是指通过对原始数据进行某些变换,使得数据更适合用于分析和建模。常见的特征变换方法包括: - 主成分分析(PCA) - 线性判别分析(LDA) - 因子分析 以上就是一些常见的数据预处理方法,通过对数据进行适当的预处理,可以提高数据分析和建模的准确性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值