我认为数据中的噪声数据可以分为数据缺失和数据噪声(错误)。
数据缺失的原因:
1.信息被遗漏 2.信息暂时无法获取 3.获取信息数据的代价太大。
缺失的类型:
数据集中不含缺失值的变量称为完全变量,数据集中含有缺失值的变量称为不完全变量。
从缺失的分布来将缺失可以分为完全随机缺失,随机缺失和完全非随机缺失。
完全随机缺失(missing completely at random,MCAR):指的是数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性。如家庭地址缺失。
随机缺失(missing at random,MAR):指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量。例如财务数据缺失情况与企业的大小有关。
非随机缺失(missing not at random,MNAR):指的是数据的缺失与不完全变量自身的取值有关。如高收入人群的不原意提供家庭收入。
随机缺失可以通过已知变量对缺失值进行估计;而非随机缺失还没有很好的解决办法。
处理缺失值的主要方法如下:
使用可用特征的均值来填补缺失值
使用特殊值来填补缺失值
忽略有缺失值的样本
使用相似样本的均值填补缺失值
使用另外的机器学习算法预测缺失值
数据噪声:
噪声是一个测量变量中的随机错误或偏差,包括错误值或偏离期望的孤立点值。简单的说数据标签、数据属性可能是错误的,但是数据量较多难以直接发现验证。然后相比缺失数据来说,这种更难发现、对模型的影响较大。
噪声产生原因:
- 标记错误:应该发卡的客户标记成不发卡,或者两个数据相同的客户一个发卡一个不发卡;
- 输入错误:用户的数据本身就有错误,例如年收入少写一个0、性别写反了什么的。
在根据网络流量进行异常流量、恶意流量检测的过程中,会存在一些噪声数据,这类噪声数据主要是协议解析错误,网络拥塞通信环境不佳时会出现一些乱序、重传等包,类似的通信行为和协议和数据包等软件和行为等,木马等恶意软件人为的通信习惯等。
常见的噪声数据的处理方法:分箱;聚类;计算机和人工检查结合;回归。
1.分箱处理方法
分箱的方法:有4种:等深分箱法、等宽分箱法、最小熵法和用户自定义区间法。
等深分箱法:
import random import pandas as pd class Equal_depth_box: def equal_box(list, bin_num): list.sort() list_2 = list.copy() all_num = len(list_2) bin_sep = all_num/bin_num bin_sep = int(bin_sep) bin_list = [] for i in range(1,bin_num): bin_dict = {} bin_dict = i*bin_sep bin_list.append(bin_dict) bin_real_list = [] for i in bin_list: bin_real_dict = {} bin_real_dict = list[i] bin_real_list.append(bin_real_dict) return bin_real_list def replace_box(list_1,replace_list): list_max = max(list_1) list_min = min(list_1) print(list_max) print(list_min) replace_list.insert(0,list_min -1) print(replace_list) replace_list.append(list_max + 1) print(replace_list) list_2 = pd.cut(list_1, bins = replace_list, labels = range(len(replace_list) - 1)).tolist() return list_2 if __name__ == '__main__': list_1 = random.sample(range(1000), 134) replace_list = Equal_depth_box.equal_box(list_1, 10) print(replace_list) list_2 = Equal_depth_box.replace_box(list_1, replace_list) print('encode_list: {}'.format(list_2))
采用均值平滑技术、边界值平滑技术
import numpy as np import math def equrth(x,dep_num): x.sort() row_num=int(x.size/dep_num) depth=x.reshape(row_num,dep_num) mean_depth=np.full([row_num,dep_num],0) for i in range(0,row_num): for j in range(0,dep_num): mean_depth[i][j]=int(depth[i].mean()) print(mean_depth) edgeleft=np.arange(row_num) edgeright=np.arange(row_num) edge_depth=np.full([row_num,dep_num],0) for i in range(0,row_num): edgeleft[i]=depth[i][0] edgeright[i]=depth[i][-1] for j in range(0,dep_num): if(j==0): edge_depth[i][j]=depth[i][0] if(j==dep_num-1): edge_depth[i][j]=depth[i][-1] else: if(math.pow((edgeleft[i]-depth[i][j]),dep_num-1) > math.pow((edgeright[i]-depth[i][j]),dep_num-1)): edge_depth[i][j]=edgeright[i] else: edge_depth[i][j]=edgeleft[i] print(edge_depth) x=np.array([60,65,63,66,67,69,71,72,74,76,77,82,84,87,90]) equrth(x,3)
等框分箱法:
采用均值平滑技术、边界值平滑技术
def equth2(x,bins): x.sort() x_cuts=pd.cut(x,bins,right=False) number=pd.value_counts(x_cuts) rows=number.max() widthlist=np.full([len(bins)-1,rows],0) size=x.size i=0 for j in range(0,len(bins)-1): for a in range(0,number[j]): widthlist[j][a]=x[i] i=i+1 print(widthlist) mean_width = np.full([len(bins)-1,rows],0) for i in range(0,len(bins)-1): for j in range(0,number[i]): mean_width[i][j]=int(widthlist[i].sum()/number[i]) print(mean_width) len1=len(bins)-1 edgeleft=np.arange(len1) edgeright=np.arange(len1) edge_width=np.full([len1,rows],0) for i in range(0,len1): edgeleft[i]=widthlist[i][0] edgeright[i]=widthlist[i][number[i]-1]; for j in range(0,number[i]): if(j==0): edge_width[i][j]=widthlist[i][0] if(j==(number[i]-1)): edge_width[i][j]=widthlist[i][number[i]-1] else: if(math.pow((edgeleft[i]-widthlist[i][j]),2) > math.pow((edgeright[i]-widthlist[i][j]),2)): edge_width[i][j]=edgeright[i] else: edge_width[i][j]=edgeleft[i] print(edge_width) x=np.array([60,65,63,66,67,69,71,72,74,76,77,82,84,87,90]) bins=[60,70,80,90,100] equth2(x,bins)
最小熵法和自定义分箱法,这里就不写代码了!!!!
数据平滑方法
数据平滑方法又可以细分为:平均值平滑、按边界值平滑和按中值平滑。
按平均值平滑
对同一箱值中的数据求平均值,用平均值替代该箱子中的所有数据。
按边界值平滑
用距离较小的边界值替代箱中每一数据。
按中值平滑
取箱子的中值,用来替代箱子中的所有数据。
思考问题,为什么使用分箱的方法可以去除噪声影响尼??
根据字面意思就是把数据按照不同的规则分到不同的箱子里。其实分箱是特征工程的一种,可以理解为一种连续数据变为离散数据的建模方式。
优势:
-
可以减少过拟合的风险,因为分箱相当于对于数据去粗粒度描述
-
增加稀疏数据的概率,减少计算量,因为0的数据变多了
-
减少噪声数据的影响,比如一组数据按照0~100均匀分布,当数据中突然出现一个10000的数据,如果不做分箱的化会对Logistic Regression这种模型的训练造成很大影响
-
方便特征衍生,因为数据离散化后就可以把特征直接相互做内积提升特征维度
-
离散化后可以提升模型的鲁棒性
2.聚类
聚类法就是将抽象的对象进行集合分组,成为不同的集合,找到在集合意外的孤点,这些孤点就是噪声。
观测量(Measurement) = 真实数据(True Data) + 噪声 (Noise):而离群点(Outlier)属于观测量,既有可能是真实数据产生的,也有可能是噪声带来的,但是总的来说是和大部分观测量之间有明显不同的观测值。
数据噪声与离群点有很多相同的地方。之间没有太过明确的定义,主要看应用的场景。如在信用卡诈骗中,我们通常会关注那些少量的异常数据,此时数据是具有探索意义的。而在一般的场景下,离群点和噪声都需要剔除,一般使用的方法也有很多相似之处,如3标准差去噪,dbscan去噪,孤立森林等。
LOF算法、距离聚类。
K-MEANs&层次聚类对离群值非常敏感。改用密度聚类和高斯混合模型。
将孤立点当作噪声数据有什么影响??异常数据与噪声数据的区别??
离群点(Outlier)属于观测量,既有可能是真实数据产生的,也有可能是噪声带来的,但是总的来说是和大部分观测量之间有明显不同的观测值。
噪声可以视作特性较弱的异常值,没有被分析的价值。噪声和异常之间、正常数据和噪声之间的边界都是模糊的。异常值通常具有更高的离群程度分数值,同时也更具有可解释性。这样就能够直接发现噪点,然后进行清除即可。
在处理噪声数据时那会不会处理了异常数据??
噪声数据是没有意义的数据,例如没有关系。异常数据属性之间会存在关系,只是突然变量超出正常区间。所以在噪声处理时选择对应的处理方式然后结合人工验证。
3.pca降噪
降低了维度,丢失了信息,同时也去除了部分噪音。
4.回归
def main(cor_nums): x=np.arange(-3,3,6.0/cor_nums).reshape(-1,1) y_real=x*3+2 y=y_real+np.random.normal(0,2,cor_nums).reshape(-1,1) plt.scatter(x,y) lin_regr=LinearRegression() lin_regr.fit(x,y) y_test=lin_regr.predict(x) plt.plot(x,y_test,color="black") plt.plot(x,y_real,color="red") plt.show() main(100)