机器学习之数据清洗
1. 创建数据集
为了方便测试,随机创建以下1维数据集
[ 129. 1106. 190. 235. 280. 213. 489. 687. nan 707. 434. 752. 474. 191. 626. 283. 347. 293. 455. 298. 184. 367. 541. 337. 437. nan nan 421. nan 160. 447. 481. 409. 366. 574. 282. 432. 390. 330. 715. 419. 311. 202. 202. 311. 420. nan 312. 195. 375.]
2. 分析数据
分析数据的方法常有:观察,描述性统计,各种图表分析
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。(1)描述性统计,比如sum,mean,var,std,corr,cov,skew,kurt,describe,pandas库提供了各种方法
print('查看数据集描述性信息') print(test_data.describe())
(2)查看缺失值情况,这里以nan进行说明
print('查看NaN数据') print(test_data[test_data.isnull()])
(3)查看重复性数据
print('查看重复性数据') print(test_data[test_data.duplicated()])
(4)各种图表显示(直方图、点图、箱体图、Q-Q图)
print('绘制点图') fig = plt.figure() ax1 = fig.add_subplot(2,2,1) ax1.plot(test_data.index,test_data.values,'ro') print('绘制直方图') ax2 = fig.add_subplot(2,2,2) n,pin,patches = ax2.hist(test_data.values,bins=20) print('绘制箱型图') ax3 = fig.add_subplot(2,2,3) ax3.bar(test_data.index,test_data.values) plt.show()
注:在画直方图和条状图的时候需要将NaN数据用值替换
3. 缺失值处理
缺失值的处理要根据不同的数据场景采取不同的策略,常有以下几种方法处理:
(1)直接删除
适合缺失值数量较小,并且是随机出现的,删除它们对整体数据影响不大的情况
(2)使用均值或中位数代替
优点:不会减少样本信息,处理简单
缺点:当缺失数据不是随机数据时会产生偏差,对于正常分布的数据可以使用均值代替,如果数据是倾斜的,使用中位数可能更好
(3)插补法
随机插补法 --->从总体中随机抽取某个样本代替缺失样本
多重插补法 --->通过变量之间的关系对缺失数据进行预测,利用蒙特卡洛方法生成多个完整的数据集,在对这些数据集进行分析,最后对分析结果进行汇总处理
热平台插补 --->指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。 优点:简单易行,准去率较高 缺点:变量数量较多时,通常很难找到与需要插补样本完全相同的样本。但我们可以按照某些变量将数据分层,在层中对缺失值实用均值插补 (4)sklearn.preprocessing.imptation包的Imputer类提供了三种处理缺失值方法strategy : string, optional (default="mean") The imputation strategy. - If "mean", then replace missing values using the mean along the axis. - If "median", then replace missing values using the median along the axis. - If "most_frequent", then replace missing using the most frequent value along the axis.
DataFrame中提供了dropna(),drop()和fillna()方法进行删除和填充操作
下例使用sklearn中的均值填充法
imputer = Imputer(missing_values='NaN',strategy='mean',axis=0) test_data_dataframe = test_data.to_frame() imputer.fit(test_data_dataframe) print(imputer.statistics_) #statistics_存放均值 print(test_data.mean()) test_data1 = imputer.transform(test_data_dataframe)
4. 异常值处理
异常值我们通常也称为“离群点”,异常值分析常用方法
(1)统计分析
(2)画图
(3)3∂原则
如果数据服从正态分布,在3∂原则下,异常值为一组测定值中与平均值的偏差超过3倍标准差的值。如果数据服从正态分布,距离平均值3∂之外的值出现的概率为P(|x-u| > 3∂) <= 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述
(4)箱型图分析
箱型图提供了识别异常值的一个标准:如果一个值小于QL01.5IQR或大于OU-1.5IQR的值,则被称为异常值。QL为下四分位数,表示全部观察值中有四分之一的数据取值比它小;QU为上四分位数,表示全部观察值中有四分之一的数据取值比它大;IQR为四分位数间距,是上四分位数QU与下四分位数QL的差值,包含了全部观察值的一半。箱型图判断异常值的方法以四分位数和四分位距为基础,四分位数具有鲁棒性:25%的数据可以变得任意远并且不会干扰四分位数,所以异常值不能对这个标准施加影响。因此箱型图识别异常值比较客观,在识别异常值时有一定的优越性
(5)基于模型检测
首先建立一个数据模型,异常是那些同模型不能完美拟合的对象;如果模型是簇的集合,则异常是不显著属于任何簇的对象;在使用回归模型时,异常是相对远离预测值的对象
优缺点:
1.有坚实的统计学理论基础,当存在充分的数据和所用的检验类型的知识时,这些检验可能非常有效;
2.对于多元数据,可用的选择少一些,并且对于高维数据,这些检测可能性很差
(6)基于距离
当一个点的局部密度显著低于它的大部分近邻时才将其分类为离群点。适合非均匀分布的数据。
优缺点:
1.给出了对象是离群点的定量度量,并且即使数据具有不同的区域也能够很好的处理;
2.与基于距离的方法一样,这些方法必然具有O(m2)的时间复杂度。对于低维数据使用特定的数据结构可以达到O(mlogm);
3.参数选择困难。虽然算法通过观察不同的k值,取得最大离群点得分来处理该问题,但是,仍然需要选择这些值的上下界
(7)基于聚类
基于聚类的离群点:一个对象是基于聚类的离群点,如果该对象不强属于任何簇。离群点对初始聚类的影响:如果通过聚类检测离群点,则由于离群点影响聚类,存在一个问题:结构是否有效。为了处理该问题,可以使用如下方法:对象聚类,删除离群点,对象再次聚类(这个不能保证产生最优结果)。
优缺点:1.基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点可能是高度有效的;
2.簇的定义通常是离群点的补,因此可能同时发现簇和离群点;
3.产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性;4.聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大
异常值处理方法:
(1)删除异常值
明显看出是异常且数量较少可以直接删除
(2)不处理
如果算法对异常值不敏感则可以不处理,但如果算法对异常值敏感,则最好不要用,如基于距离计算的一些算法,包括kmeans,knn之类的
(3)平均值替代
损失信息小,简单高效
(4)视为缺失值
