Python处理缺失数据

2023-11-04

目录

参考:

缺失原因

  • 无意的:信息被遗漏,比如由于工作人员的疏忽,忘记而缺失;或者由于数据采集器等故障等原因造成的缺失,比如系统实时性要求较高的时候,机器来不及判断和决策而造成缺失;
  • 有意的:有些数据集在特征描述中会规定将缺失值也作为一种特征值,这时候缺失值就可以看作是一种特殊的特征值;
  • 不存在:有些特征属性根本就是不存在的,比如一个未婚者的配偶名字就没法填写,再如一个孩子的收入状况也无法填写;

缺失类型

  • 完全随机缺失(missing completely at random,MCAR):指的是数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失;
  • 随机缺失(missing at random,MAR):指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量,如财务数据缺失情况与企业的大小有关;
  • 非随机缺失(missing not at random,MNAR):指的是数据的缺失与不完全变量自身的取值有关,如高收入人群不原意提供家庭收入;

对于随机缺失和非随机缺失,直接删除记录是不合适的,原因上面已经给出。随机缺失可以通过已知变量对缺失值进行估计,而非随机缺失的非随机性还没有很好的解决办法。

处理方法

  • 删除记录
  • 数据填补
  • 不处理

删除

  • 优点:最简单粗暴;
  • 缺点:牺牲了大量的数据,通过减少历史数据换取完整的信息,这样可能丢失了很多隐藏的重要信息;
    当缺失数据比例较大时,特别是缺失数据非随机分布时,直接删除可能会导致数据发生偏离,比如原本的正态分布变为非正太;
  • 适用场景:这种方法在样本数据量十分大且缺失值不多的情况下非常有效,但如果样本量本身不大且缺失也不少,那么不建议使用。
import pandas as pd
from io import StringIO
csv_data = '''A,B,C,D
1.0,2.0,3.0,4.0
5.0,6.0,,8.0
0.0,11.0,12.0,'''
df = pd.read_csv(StringIO(csv_data))
df
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 NaN 8.0
2 0.0 11.0 12.0 NaN

统计每列缺失值的个数

df.isnull().sum()
A    0
B    0
C    1
D    1
dtype: int64

直接删除含有缺失值的行

df.dropna() # 默认是按行删除 即axis=0
A B C D
0 1.0 2.0 3.0 4.0
# 上面的不等价 
df[df.notnull()]
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 NaN 8.0
2 0.0 11.0 12.0 NaN

直接删除含有缺失值的列

df.dropna(axis=1)
A B
0 1.0 2.0
1 5.0 6.0
2 0.0 11.0

只删除全是缺失值的行

df.dropna(how='all') # 默认是any 
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 NaN 8.0
2 0.0 11.0 12.0 NaN

保留至少有4个非缺失值的行

df.dropna(thresh=4) 
# Require that many non-NA values.
# Keep only the rows with at least 4 non-NA values
A B C D
0 1.0 2.0 3.0 4.0

删除含有缺失值的特定的列

# 删去指定列的缺失值所在的行记录
df.dropna(subset=['C'])
A B C D
0 1.0 2.0 3.0 4.0
2 0.0 11.0 12.0 NaN

数据填补

对缺失值的插补大体可分为3种:

  • 替换缺失值。替换是通过数据中非缺失数据的相似性来填补,其核心思想是发现相同群体的共同特征。
  • 拟合缺失值。拟合是通过其他特征建模来填补
  • 虚拟变量。虚拟变量是衍生的新变量代替缺失值。

均值插补

  • 对于定类数据:使用 众数(mode)填补,比如一个学校的男生和女生的数量,男生500人,女生50人,那么对于其余的缺失值我们会用人数较多的男生来填补。

  • 对于定量(定比)数据:使用平均数(mean)或中位数(median)填补,比如一个班级学生的身高特征,对于一些同学缺失的身高值就可以使用全班同学身高的平均值或中位数来填补。一般如果特征分布为正太分布时,使用平均值效果比较好,而当分布由于异常值存在而不是正太分布的情况下,使用中位数效果比较好。

注:此方法虽然简单,但是不够精准,可能会引入噪声,或者会改变特征原有的分布。
下图左为填补前的特征分布,图右为填补后的分布,明显发生了畸变。因此,如果缺失值是随机性的,那么用平均值比较适合保证无偏,否则会改变原分布。

import numpy as np
df
A B C D
0 1.0 2.0 3.0 4.0
1 5.0 6.0 NaN 8.0
2 0.0 11.0 12.0 NaN
# 加一行
df.loc['4'] = [1, 2, 3, np.nan, 6]
# 加一列
df['F'] = ['a', 'a', np.nan, 'b', 'a']
df
A B C D E F
0 1.0 2.0 3.0 4.0 a a
1 5.0 6.0 6.0 8.0 a a
2 0.0 11.0 12.0 NaN NaN NaN
3 1.0 2.0 3.0 NaN b b
4 1.0 2.0 3.0 NaN 6 a
全局填充
df.fillna(0)
A B C D E
0 1.0 2.0 3.0 4.0 a
1 5.0 6.0 0.0 8.0 a
2 0.0 11.0 12.0 0.0 0
3 1.0 2.0 3.0 0.0 b
对每一列分别填充不同的值
df.fillna({'C':1, 'D':2, 'E':'lebron'})
A B C D E
0 1.0 2.0 3.0 4.0 a
1 5.0 6.0 1.0 8.0 a
2 0.0 11.0 12.0 2.0 lebron
3 1.0 2.0 3.0 2.0 b
填充均值
df
A B C D E F
0 1.0 2.0 3.0 4.0 a a
1 5.0 6.0 6.0 8.0 a a
2 0.0 11.0 12.0 NaN NaN NaN
3 1.0 2.0 3.0 NaN b b
4 1.0 2.0 3.0 NaN 6 a
# 定义一个函数
# 对每一列均填充相应列的 均值、中位数、众数
def FillNan(df, col, opt):
    if opt == 1:
        # 均值填充
        df[col] = df[col].fillna(df[col].mean())
    elif opt == 2:
        # 中位数填充
        df[col] = df[col].fillna(df[col].median())
    else:
        # 众数填充
        df[col] = df[col].fillna(df[col].mode()[0])
    return df
FillNan(df, 'D', 1)
A B C D E F
0 1.0 2.0 3.0 4.0 a a
1 5.0 6.0 6.0 8.0 b a
2 0.0 11.0 12.0 6.0 NaN NaN
3 1.0 2.0 3.0 6.0 b b
4 1.0 2.0 3.0 6.0 b a
FillNan(df, 'D', 2)
A B C D E F
0 1.0 2.0 3.0 4.0 a a
1 5.0 6.0 6.0 8.0 b a
2 0.0 11.0 12.0 6.0 NaN NaN
3 1.0 2.0 3.0 6.0 b b
4 1.0 2.0 3.0 6.0 b a
FillNan(df, 'F', 3)
A B C D E F
0 1.0 2.0 3.0 4.0 a a
1 5.0 6.0 6.0 8.0 b a
2 0.0 11.0 12.0 6.0 NaN a
3 1.0 2.0 3.0 6.0 b b
4 1.0 2.0 3.0 6.0 b a

热卡填补

热卡填充法是在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。通常会找到超出一个的相似对象,在所有匹配对象中没有最好的,而是从中随机的挑选一个作为填充值。这个问题关键是不同的问题可能会选用不同的标准来对相似进行判定,以及如何制定这个判定标准。该方法概念上很简单,且利用了数据间的关系来进行空值估计,但缺点在于难以定义相似标准,主观因素较多。

K最近距离邻法(K-means clustering)

另外一种方法就是利用无监督机器学习的聚类方法。通过K均值的聚类方法将所有样本进行聚类划分,然后再通过划分的种类的均值对各自类中的缺失值进行填补。归其本质还是通过找相似来填补缺失值。

注:缺失值填补的准确性就要看聚类结果的好坏了,而聚类结果的可变性很大,通常与初始选择点有关,并且在下图中可看到单独的每一类中特征值也有很大的差别,因此使用时要慎重。

拟合缺失值

  • 回归预测
  • 极大似然估计
  • 多重插补
  • 随机森林

试验一下随机森林

from sklearn.ensemble import RandomForestRegressor
# 使用kaggle的泰坦尼克号数据集
titanic_data = pd.read_csv('./titanic/train.csv')
print(titanic_data.shape)
titanic_data.head()
(891, 12)
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
titanic_data.isnull().sum()
# 可以看到年龄的缺失比较多 我们来用随机森林的方法进行插补
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64
age_df = titanic_data[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
# 乘客分成已知年龄和未知年龄两部分
known_age = age_df[age_df.Age.notnull()].as_matrix()
unknown_age = age_df[age_df.Age.isnull()].as_matrix()
/Users/apple/anaconda3/lib/python3.6/site-packages/ipykernel/__main__.py:3: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.
  app.launch_new_instance()
/Users/apple/anaconda3/lib/python3.6/site-packages/ipykernel/__main__.py:4: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.
# y即目标年龄
y = known_age[:, 0]
y
array([22.  , 38.  , 26.  , 35.  , 35.  , 54.  ,  2.  , 27.  , 14.  ,
        4.  , 58.  , 20.  , 39.  , 14.  , 55.  ,  2.  , 31.  , 35.  ,
       34.  , 15.  , 28.  ,  8.  , 38.  , 19.  , 40.  , 66.  , 28.  ,
       42.  , 21.  , 18.  , 14.  , 40.  , 27.  ,  3.  , 19.  , 18.  ,
        7.  , 21.  , 49.  , 29.  , 65.  , 21.  , 28.5 ,  5.  , 11.  ,
       22.  , 38.  , 45.  ,  4.  , 29.  , 19.  , 17.  , 26.  , 32.  ,
       16.  , 21.  , 26.  , 32.  , 25.  ,  0.83, 30.  , 22.  , 29.  ,
       28.  , 17.  , 33.  , 16.  , 23.  , 24.  , 29.  , 20.  , 46.  ,
       26.  , 59.  , 71.  , 23.  , 34.  , 34.  , 28.  , 21.  , 33.  ,
       37.  , 28.  , 21.  , 38.  , 47.  , 14.5 , 22.  , 20.  , 17.  ,
       21.  , 70.5 , 29.  , 24.  ,  2.  , 21.  , 32.5 , 32.5 , 54.  ,
       12.  , 24.  , 45.  , 33.  , 20.  , 47.  , 29.  , 25.  , 23.  ,
       19.  , 37.  , 16.  , 24.  , 22.  , 24.  , 19.  , 18.  , 19.  ,
       27.  ,  9.  , 36.5 , 42.  , 51.  , 22.  , 55.5 , 40.5 , 51.  ,
       16.  , 30.  , 44.  , 40.  , 26.  , 17.  ,  1.  ,  9.  , 45.  ,
       28.  , 61.  ,  4.  ,  1.  , 21.  , 56.  , 18.  , 50.  , 30.  ,
       36.  ,  9.  ,  1.  ,  4.  , 45.  , 40.  , 36.  , 32.  , 19.  ,
       19.  ,  3.  , 44.  , 58.  , 42.  , 24.  , 28.  , 34.  , 45.5 ,
       18.  ,  2.  , 32.  , 26.  , 16.  , 40.  , 24.  , 35.  , 22.  ,
       30.  , 31.  , 27.  , 42.  , 32.  , 30.  , 16.  , 27.  , 51.  ,
       38.  , 22.  , 19.  , 20.5 , 18.  , 35.  , 29.  , 59.  ,  5.  ,
       24.  , 44.  ,  8.  , 19.  , 33.  , 29.  , 22.  , 30.  , 44.  ,
       25.  , 24.  , 37.  , 54.  , 29.  , 62.  , 30.  , 41.  , 29.  ,
       30.  , 35.  , 50.  ,  3.  , 52.  , 40.  , 36.  , 16.  , 25.  ,
       58.  , 35.  , 25.  , 41.  , 37.  , 63.  , 45.  ,  7.  , 35.  ,
       65.  , 28.  , 16.  , 19.  , 33.  , 30.  , 22.  , 42.  , 22.  ,
       26.  , 19.  , 36.  , 24.  , 24.  , 23.5 ,  2.  , 50.  , 19.  ,
        0.92, 17.  , 30.  , 30.  , 24.  , 18.  , 26.  , 28.  , 43.  ,
       26.  , 24.  , 54.  , 31.  , 40.  , 22.  , 27.  , 30.  , 22.  ,
       36.  , 61.  , 36.  , 31.  , 16.  , 45.5 , 38.  , 16.  , 29.  ,
       41.  , 45.  , 45.  ,  2.  , 24.  , 28.  , 25.  , 36.  , 24.  ,
       40.  ,  3.  , 42.  , 23.  , 15.  , 25.  , 28.  , 22.  , 38.  ,
       40.  , 29.  , 45.  , 35.  , 30.  , 60.  , 24.  , 25.  , 18.  ,
       19.  , 22.  ,  3.  , 22.  , 27.  , 20.  , 19.  , 42.  ,  1.  ,
       32.  , 35.  , 18.  ,  1.  , 36.  , 17.  , 36.  , 21.  , 28.  ,
       23.  , 24.  , 22.  , 31.  , 46.  , 23.  , 28.  , 39.  , 26.  ,
       21.  , 28.  , 20.  , 34.  , 51.  ,  3.  , 21.  , 33.  , 44.  ,
       34.  , 18.  , 30.  , 10.  , 21.  , 29.  , 28.  , 18.  , 28.  ,
       19.  , 32.  , 28.  , 42.  , 17.  , 50.  , 14.  , 21.  , 24.  ,
       64.  , 31.  , 45.  , 20.  , 25.  , 28.  ,  4.  , 13.  , 34.  ,
        5.  , 52.  , 36.  , 30.  , 49.  , 29.  , 65.  , 50.  , 48.  ,
       34.  , 47.  , 48.  , 38.  , 56.  ,  0.75, 38.  , 33.  , 23.  ,
       22.  , 34.  , 29.  , 22.  ,  2.  ,  9.  , 50.  , 63.  , 25.  ,
       35.  , 58.  , 30.  ,  9.  , 21.  , 55.  , 71.  , 21.  , 54.  ,
       25.  , 24.  , 17.  , 21.  , 37.  , 16.  , 18.  , 33.  , 28.  ,
       26.  , 29.  , 36.  , 54.  , 24.  , 47.  , 34.  , 36.  , 32.  ,
       30.  , 22.  , 44.  , 40.5 , 50.  , 39.  , 23.  ,  2.  , 17.  ,
       30.  ,  7.  , 45.  , 30.  , 22.  , 36.  ,  9.  , 11.  , 32.  ,
       50.  , 64.  , 19.  , 33.  ,  8.  , 17.  , 27.  , 22.  , 22.  ,
       62.  , 48.  , 39.  , 36.  , 40.  , 28.  , 24.  , 19.  , 29.  ,
       32.  , 62.  , 53.  , 36.  , 16.  , 19.  , 34.  , 39.  , 32.  ,
       25.  , 39.  , 54.  , 36.  , 18.  , 47.  , 60.  , 22.  , 35.  ,
       52.  , 47.  , 37.  , 36.  , 49.  , 49.  , 24.  , 44.  , 35.  ,
       36.  , 30.  , 27.  , 22.  , 40.  , 39.  , 35.  , 24.  , 34.  ,
       26.  ,  4.  , 26.  , 27.  , 42.  , 20.  , 21.  , 21.  , 61.  ,
       57.  , 21.  , 26.  , 80.  , 51.  , 32.  ,  9.  , 28.  , 32.  ,
       31.  , 41.  , 20.  , 24.  ,  2.  ,  0.75, 48.  , 19.  , 56.  ,
       23.  , 18.  , 21.  , 18.  , 24.  , 32.  , 23.  , 58.  , 50.  ,
       40.  , 47.  , 36.  , 20.  , 32.  , 25.  , 43.  , 40.  , 31.  ,
       70.  , 31.  , 18.  , 24.5 , 18.  , 43.  , 36.  , 27.  , 20.  ,
       14.  , 60.  , 25.  , 14.  , 19.  , 18.  , 15.  , 31.  ,  4.  ,
       25.  , 60.  , 52.  , 44.  , 49.  , 42.  , 18.  , 35.  , 18.  ,
       25.  , 26.  , 39.  , 45.  , 42.  , 22.  , 24.  , 48.  , 29.  ,
       52.  , 19.  , 38.  , 27.  , 33.  ,  6.  , 17.  , 34.  , 50.  ,
       27.  , 20.  , 30.  , 25.  , 25.  , 29.  , 11.  , 23.  , 23.  ,
       28.5 , 48.  , 35.  , 36.  , 21.  , 24.  , 31.  , 70.  , 16.  ,
       30.  , 19.  , 31.  ,  4.  ,  6.  , 33.  , 23.  , 48.  ,  0.67,
       28.  , 18.  , 34.  , 33.  , 41.  , 20.  , 36.  , 16.  , 51.  ,
       30.5 , 32.  , 24.  , 48.  , 57.  , 54.  , 18.  ,  5.  , 43.  ,
       13.  , 17.  , 29.  , 25.  , 25.  , 18.  ,  8.  ,  1.  , 46.  ,
       16.  , 25.  , 39.  , 49.  , 31.  , 30.  , 30.  , 34.  , 31.  ,
       11.  ,  0.42, 27.  , 31.  , 39.  , 18.  , 39.  , 33.  , 26.  ,
       39.  , 35.  ,  6.  , 30.5 , 23.  , 31.  , 43.  , 10.  , 52.  ,
       27.  , 38.  , 27.  ,  2.  ,  1.  , 62.  , 15.  ,  0.83, 23.  ,
       18.  , 39.  , 21.  , 32.  , 20.  , 16.  , 30.  , 34.5 , 17.  ,
       42.  , 35.  , 28.  ,  4.  , 74.  ,  9.  , 16.  , 44.  , 18.  ,
       45.  , 51.  , 24.  , 41.  , 21.  , 48.  , 24.  , 42.  , 27.  ,
       31.  ,  4.  , 26.  , 47.  , 33.  , 47.  , 28.  , 15.  , 20.  ,
       19.  , 56.  , 25.  , 33.  , 22.  , 28.  , 25.  , 39.  , 27.  ,
       19.  , 26.  , 32.  ])
# X即特征属性值
X = known_age[:, 1:]
X
array([[ 7.25  ,  0.    ,  1.    ,  3.    ],
       [71.2833,  0.    ,  1.    ,  1.    ],
       [ 7.925 ,  0.    ,  0.    ,  3.    ],
       ...,
       [30.    ,  0.    ,  0.    ,  1.    ],
       [30.    ,  0.    ,  0.    ,  1.    ],
       [ 7.75  ,  0.    ,  0.    ,  3.    ]])
# fit到RandomForestRegressor之中
rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
rfr.fit(X, y)
RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,
           max_features='auto', max_leaf_nodes=None,
           min_impurity_decrease=0.0, min_impurity_split=None,
           min_samples_leaf=1, min_samples_split=2,
           min_weight_fraction_leaf=0.0, n_estimators=2000, n_jobs=-1,
           oob_score=False, random_state=0, verbose=0, warm_start=False)
titanic_data.loc[(titanic_data.Age.isnull()), 'Age'] = rfr.predict(unknown_age[:, 1:])
titanic_data.isnull().sum()
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age              0
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

封装成函数

def set_missing_values(df, col):
    age_df = df[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
    # 乘客分成已知年龄和未知年龄两部分 针对年龄这一列进行缺失统计
    known_age = age_df[age_df[col].notnull()].values
    unknown_age = age_df[age_df[col].isnull()].values
    # y即目标年龄 完整数据的年龄
    y = known_age[:, 0]
    # X即为完整数据的除了年龄的所有指标
    X = known_age[:, 1:]
    # 建立模型
    rf_clf = RandomForestRegressor(random_state=23, n_estimators = 500, n_jobs=-1)
    # 拟合数据
    rf_clf.fit(X, y)
    # 预测 用年龄缺失部分的非年龄变量作为X
    rf_clf_pre = rf_clf.predict(unknown_age[:,1:])
    # 用上述预测值填补原始数据的相应部分
    df.loc[(df[col].isnull()), col] = rf_clf_pre
    return df    
df2 = set_missing_values(titanic_data, 'Age')
df2.isnull().sum()
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age              0
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64
df2['Age']
0      22.000000
1      38.000000
2      26.000000
3      35.000000
4      35.000000
5      23.753711
6      54.000000
7       2.000000
8      27.000000
9      14.000000
10      4.000000
11     58.000000
12     20.000000
13     39.000000
14     14.000000
15     55.000000
16      2.000000
17     32.030236
18     31.000000
19     29.756073
20     35.000000
21     34.000000
22     15.000000
23     28.000000
24      8.000000
25     38.000000
26     29.756073
27     19.000000
28     22.179209
29     27.949556
         ...    
861    21.000000
862    48.000000
863    11.025302
864    24.000000
865    42.000000
866    27.000000
867    31.000000
868    26.070169
869     4.000000
870    26.000000
871    47.000000
872    33.000000
873    47.000000
874    28.000000
875    15.000000
876    20.000000
877    19.000000
878    27.949556
879    56.000000
880    25.000000
881    33.000000
882    22.000000
883    28.000000
884    25.000000
885    39.000000
886    27.000000
887    19.000000
888    16.773188
889    26.000000
890    32.000000
Name: Age, Length: 891, dtype: float64

虚拟变量

虚拟变量其实就是缺失值的一种衍生变量。具体做法是通过判断特征值是否有缺失值来定义一个新的二分类变量。比如,特征为A含有缺失值,我们衍生出一个新的特征B,如果A中特征值有缺失,那么相应的B中的值为1,如果A中特征值没有缺失,那么相应的B中的值为0。

titanic_data.isnull().sum()
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age              0
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

使用虚拟变量方法来处理缺失值变量Cabin

titanic_data['Cabin_0_1'] = '0'
titanic_data.loc[titanic_data['Cabin'].isnull(), 'Cabin_0_1'] = 'Yes'
titanic_data.loc[titanic_data['Cabin'].notnull(), 'Cabin_0_1'] = 'No'
titanic_data.head()
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Cabin_0_1
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S Yes
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C No
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S Yes
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S No
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S Yes

不处理

补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。

在实际应用中,一些模型无法应对具有缺失值的数据,因此要对缺失值进行处理。然而还有一些模型本身就可以应对具有缺失值的数据,此时无需对数据进行处理,比如Xgboost,rfr等高级模型。

总而言之,大部分数据挖掘的预处理都会使用比较方便的方法来处理缺失值,比如均值法,但是效果上并一定好,因此还是需要根据不同的需要选择合适的方法,并没有一个解决所有问题的万能方法。具体的方法采用还需要考虑多个方面的:

数据缺失的原因;
数据缺失值类型;
样本的数据量;
数据缺失值随机性等;

参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python处理缺失数据 的相关文章

随机推荐