【Python-机器学习】数据缺失值的插补:Sciki-LearnVSpandas

star2017 1年前 ⋅ 165 阅读

常见的数据框缺失数据插补有3种方式:

  1. pandas 中简单粗暴的替换取值;
  2. pandas 中的 fillna 函数;
  3. sklearn 机器学习包中的 Imputer。

经过一番对比之后,先上结论:pandas 的 fillna 函数功能最多,使用最灵活,所以可考虑用为 Python 数据插补工具的首选。

1. 数据准备

(完整代码见文末)

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

2. 数据框缺失值的查看

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

这里从count我们可以看出,取值为1460(df的长度)则没有缺失,反之有缺失。
接下来,用 isnull 或者 isna 函数进行缺失值的查看。

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

可见,这里有两列出现了数据缺失,”Alley“列缺失严重。像这种级别的缺失的变量,能提供的信息过少,应该考虑删除。
接下来,我们改进下结果的展现方式。

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

”Alley”缺失的比例高达 94%。

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

上面 “LotFrontage” 变量是一个很常见的数值型变量,有18%的缺失值。接下来,我们用该变量的均值,对缺失的数据进行替代。

3. 第一种方式,pandas 中简单的手工插补

关键就是一个赋值的等号“=”。

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

4. 第二种方式,利用 pandas 的插补函数进行插补

同样是均值插补,用pandas自带的函数会让插补变得更加简洁。

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

除了具体某个值如均值(由函数生成)替代,pandas 还带有多种插补的函数:

  • 基于正则表达式对字符型变量进行替代;
  • 临近值替代;
  • 使用 object 对象进行替代 …

更完整的说明,可以参考 pandas 官网文档:Working with missing data

5. 第三种方式:Sciki-Learn 的 imputer

作为机器学习第一包Sciki-Learn自带有功能丰富的数据插补函数,不过用起来稍显复杂。
比如,不能直接对某一列数据进行插补。

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

转换之后的df1,是 ndarray 而不是 dataframe。这是因为, Sciki-Learn 这个包是基于 NumPy 而不是pandas (虽然pandas 也是基于NumPy)。
考虑将这个 ndarray 数据转换为 DataFrame。

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

数据插补已经完成。
但是,这么操作显然过于啰嗦,难道 Sciki-Learn就不能直接插补一列?
答案是可以的——通过将某列写成二维的形式:

【Python-机器学习】数据缺失值的插补:Sciki-Learn VS pandas

事实证明,Sciki-Learn是可以直接插补一列,只不过要将该列写成二维的样子(两个方括号)。


小结:

  1. pandas 和 sklearn 都提供了多种数据插补方式,其中最简单的是均值替代;
  2. pandas 的数据插补是最方便的;
  3. sklearn 基于 NumPy,且只能插补二维的数据(单列需要写成二维的形式)。

附完整代码:

#!/usr/bin/env python

import pandas as pd
import numpy as np

df = pd.read_csv('/Users/brycewang/Desktop/Python-ML-AI/Python 101/ep1/ep1_train.csv')

df.shape

df = df.iloc[:, 0:10] 

df.shape

df.head()

from pandasgui import show
show(df)

df.info()

df.describe() 

df.isnull().head() 

df.isnull().sum()

df.isnull().sum() / len(df)

np.round(df.isnull().sum() / len(df), 2)

df.LotFrontage.describe()

df.LotFrontage.isnull().sum()

df.shape

df.LotFrontage.mean()

df["l"] = df.LotFrontage.copy()
df.l.describe()

df.l[df.l.isnull()] = df.l.mean()

df.l.isnull().sum()


df = pd.read_csv('/Users/brycewang/Desktop/Python-ML-AI/Python 101/ep1/ep1_train.csv')
df = df.iloc[:, 0:10] 
df["l"] = df.LotFrontage.copy()
df.l.describe()

np.round(df.l.isnull().sum() / len(df), 2)

df.l.fillna(df.l.mean(), inplace=True)  
np.round(df.l.isnull().sum() / len(df), 2)

df.l.describe() 

df = pd.read_csv('/Users/brycewang/Desktop/Python-ML-AI/Python 101/ep1/ep1_train.csv')
df = df.iloc[:, 0:10] 
df["l"] = df.LotFrontage.copy()
df.l.describe()
from sklearn.impute import SimpleImputer 

imputer = SimpleImputer(missing_values = np.nan, strategy = 'mean')
imputer


df1 = df[["l", "MSSubClass"]]
df1.describe()

df1 = imputer.fit_transform(df1) 

pd.DataFrame(df1, columns=["l", "MSSubClass"]).describe()

df = pd.read_csv('/Users/brycewang/Desktop/Python-ML-AI/Python 101/ep1/ep1_train.csv')
df = df.iloc[:, 0:10] 
df["l"] = df.LotFrontage.copy()
df.l.describe()

df[['l']] = imputer.fit_transform(df[['l']]) 

df.l.describe()

本文来自zhihu,观点不代表一起大数据-技术文章心得立场,如若转载,请注明出处:https://zhuanlan.zhihu.com/p/460546198

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: