问题:
介绍数据清洗方法。。
解答:
所谓数据清洗主要处理的是数据中的缺失值、异常值和重复值:
缺失值处理
数据缺失值指由于各种原因导致数据中存在的空缺值:数据库中的null,python返回对象none,pandas或numpy中的nan;另空字符串是有实体的不算是缺失值,缺失值没有实体。
处理数据缺失值一般有4中方法:
- 丢弃
- 补全
- 真值转化
- 不处理
丢弃
如果缺失的数据量不大,且对其丢弃对数据特征的影响有限,可以选着丢弃,毕竟这样容易操作。某一列丢失的数据过多,为了避免增加噪声,可以丢弃。
补全
相对于丢弃补全更常用,毕竟数据的完整性很重要,但是补全的方式也很重要,会影响到后续的数据处理。
对全的方法:
- 用平均值、中值、分位数、众数、随机值等替代。效果一般,因为等于人为增加了噪声。
- 建立一个模型来“预测”缺失的数据。
- 对于重要的数据,可以专家不足,或是调用数据源头补全,缺点是成本高
转化法
我们承认缺失值的存在,并且把数据缺失也作为数据分布规律的一部分,这将变量的实际值和缺失值都作为输入维度参与后续数据处理和模型计算。但是变量的实际值可以作为变量值参与模型计算,而缺失值通常无法参与运算,因此需要对缺失值进行真值转换。
以用户性别字段为例,很多数据库集都无法对会员的性别进行补足,但又舍不得将其丢弃,那么我们将选择将其中的值,包括男、女、未知从一个变量的多个值分布状态转换为多个变量的真值分布状态。
不处理
一些模型可以自己处理缺失值,所以可以不对缺失值进行处理。常见的能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)等
数据:
# 数据缺失值处理
import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer
import random
# 获取数据
df1 = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/boston/train.csv')
df = df0.iloc[:10,:7]
# 查看是否有缺失值
df.isna().values.any()
# False 没有缺失值
# 数据行列
df.shape
# (10, 7) 10行 7列
# 制造10个缺失值
for i in range(10):
df.iloc[random.choice(range(10)), random.choice(range(3,7))] = np.nan
看下数据:
# 查看缺失值分布
df.isna().sum()
ID 0
crim 0
zn 0
indus 1
chas 2
nox 3
rm 3
dtype: int64
# 丢弃缺失值
df_droped = df.dropna()
df_droped
ID crim zn indus chas nox rm
2 4 0.03237 0.0 2.18 0.0 0.458 6.998
3 5 0.06905 0.0 2.18 0.0 0.458 7.147
9 15 0.63796 0.0 8.14 0.0 0.538 6.096
# 将缺失值替代为特定值
# 用后面的值替代缺失值
df.fillna(method='backfill')
ID crim zn indus chas nox rm
0 1 0.00632 18.0 2.31 0.0 0.469 6.998
1 2 0.02731 0.0 7.07 0.0 0.469 6.998
2 4 0.03237 0.0 2.18 0.0 0.458 6.998
3 5 0.06905 0.0 2.18 0.0 0.458 7.147
4 7 0.08829 12.5 7.87 0.0 0.524 6.012
5 11 0.22489 12.5 7.87 0.0 0.524 6.377
6 12 0.11747 12.5 7.87 0.0 0.524 5.889
7 13 0.09378 12.5 7.87 0.0 0.524 5.889
8 14 0.62976 0.0 8.14 0.0 0.538 5.949
9 15