Abstract:18年复活节前的五天,kaggle举办了数据预处理的五个挑战。这里做每天学习到的技术要点的回顾。这篇是第一天的内容,主要是有关数据缺失的分析和操作。
1. 导入原始数据,检视一小部分
这里用到的library是pandas和numpy。
# modules we'll use
import pandas as pd
import numpy as np
# read in all our data
nfl_data = pd.read_csv("../input/nflplaybyplay2009to2016/NFL Play by Play 2009-2017 (v4).csv")
sf_permits = pd.read_csv("../input/building-permit-applications-data/Building_Permits.csv")
检视5个数据样本
sf_permits.sample(5)
2. 统计缺失数据数量和所占比重
利用pandas的查缺功能
# get the number of missing data points per column
missing_values_count = nfl_data.isnull().sum()
# look at the # of missing points in the first ten columns
missing_values_count[0:10]
计算缺失数据的数量在总数据中的占比
# how many total missing values do we have?
total_cells = np.product(nfl_data.shape)
total_missing = missing_values_count.sum()
# percent of data that is missing
(total_missing/total_cells) * 100
3. 分析为什么这里的数据会缺失
数据缺失的原因有两个:一是这个数据不存在。比如在做人口统计的时候有一问是家里小孩的年龄,如果家庭还没有生育,那这里就只有空着、填NA或者不适用;二是这个数据没有被录入。比如招聘问卷里问对薪资的预期,有些人会选择不填。
对于这两种情况的数据缺失,处理的方法也应该是不一样的。情况二中,由于这些数据缺失的原因是没有被录入,我们可以根据现有的信息来推测缺失数据的值,以便让和它同宗同族的其他数据不至于被连坐删除。而情况一中,对于不存在的数据,应该让它保持为一种缺失的独特状态,标记为0或者“都不是”,这样才能保留真实信息。
4. 缺失数据的处理手段
-
暴力删除。虽然快捷便利,但是会丢失大量有用的数据信息。使用pandas里的.dropna()功能。
最省事的办法就是把所有带有NaN的数据行都删掉:
# remove all the rows that contain a missing value nfl_data.dropna()
但在这个例子中,所有的行里都或多或少有缺失项,结果就是所有数据都被删 除了。
退而求其次,尝试删掉所有带有缺失项的列:
# remove all columns with at least one missing value columns_with_na_dropped = nfl_data.dropna(axis=1) # just how much data did we lose? print("Columns in original dataset: %d \n" % nfl_data.shape[1]) print("Columns with na's dropped: %d" % columns_with_na_dropped.shape[1])
Columns in original dataset: 102
Columns with na's dropped: 41加入
axis = 1
以后,可以在列的方向上删掉含NaN的项。结果虽然还剩一部分数据,但是和原本数据比损失惨重。 -
自动填充。根据上下文,平均值,常见值,推测值等,推断该填入什么数据。
首先尝试以特定值(0)填充所有空档。这样可能填的太假太硬。
# replace all NA's with 0 nfl_data.fillna(0
接下来可以使用后续值填充前面的缺失。填不上的再用0填
# replace all NA's the value that comes directly after it in the same column, # then replace all the reamining na's with 0 subset_nfl_data.fillna(method = 'bfill', axis=0).fillna("0")
于是乎,所有的NaN都被替换掉了。
总结:第一天的内容主要讲如何分析和处理原始数据中的缺失项。介绍了如何查看,统计和替换缺失项。内容比较初级,大佬轻拍。
感受:数据预处理在机器学习的程序中占比别我想象的要大。早些在Coursera上deep learning课的时候都是老师给喂好数据,只要编写算法结构就行。等接触了真实数据就会发现很多问题,比如数据缺失,数据格式不对等。数据预处理就是在保留更多信息的前提下将数据转变为机器可以接受的形态,然后才能放心的喂给算法,以保证预测的准确率。