importpandasaspdimportnumpyasnpiportrandomasrndimportseabornassnsimportmatplotlib.pyplotasplt%matplotlibinlineimportwarnings.filterwarnings('ignore')importmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=[u'SimHei']plt.rcParams['axes.unicode_minus']=False在数据挖掘中,有很多不完整(有缺失值),不一致和异常的数据会严重影响数据挖掘建模的执行效率,甚至可能导致挖掘结果出现偏差。因此,数据清洗显得尤为重要。数据清洗完成后,进行数据整合、转换、规范等一系列处理,这个过程就是数据预处理。数据预处理的目的:提高数据质量,使数据更好地适应特定的挖掘技术或工具。数据预处理的主要内容包括数据清洗、数据集成、数据转换和数据规范。数据清洗数据清洗主要是删除原始数据集中不相关的数据和重复数据,平滑噪声数据,滤除与挖掘主题无关的数据,处理缺失值、异常值等缺失值处理缺失值的处理主要包括删除缺失记录、数据插补、不处理三种方法。常用的插补方法均值/中值/众数插值:根据属性类型,取属性的均值/中值/众数进行插补。固定值插补:用常量替换缺失的属性值。例如广州某工厂普通农民工“基本工资”属性的空缺值,可以使用广州普通农民工工资标准,即1895元/月。Nearestneighborimputation:查找记录中与缺失样本最接近的样本的属性值插补。回归法:利用现有数据对存在缺失值的属性进行回归预测,利用模型预测值对缺失值进行插值。插值法:利用样本点建立插值函数$f(x)$,未知值由对应的$f(x)$给出。拉格朗日插值法根据泰勒定理,任何函数都可以用阶数足够高的多项式来逼近,即$$f(x)=\sum_{i=0}^na_ix^i$$插值法是利用某个自变量(通常是index或ordinal)计算另一个属性的缺失值$$y_j=f(x_j)$$因此需要求解插值函数$f(x)$的表达式,即,求解$a_i,i=0,1,...,n$,需要$n+1$个样本点$(x_j,y_j),j=1,2,...,n+1$,并将样本点代入上述等式$$a_0+a_1x_1+a_2x_1^2+...+a_nx_1^n=y_1$$$$a_0+a_1x_2+a_2x_2^2+...+a_nx_2^n=y_2$$$$...$$$$a_0+a_1x_{n+1}+a_2x_{n+1}^2+...+a_nx_{n+1}^n=y_{n+1}$$显然,上述线性方程的系数矩阵是范德蒙矩阵,所以,存在唯一解,即存在唯一的$f(x)$。在实际计算中,直接求解上述矩阵比较复杂。拉格朗日插值法应运而生。拉格朗日插值法其实就是$f(x)$的一种计算方法:$$f(x)=\sum_{i=1}^{n+1}y_i\prod_{j\neqi}\frac{(x-x_j)}{(x_i-x_j)}$$观察上式,可以发现这是x的n次多项式,所有$(x_m,y_m)$,即上式为你想要什么。插值示例df=pd.read_excel('Python数据分析与挖掘实践/chapter3/demo/data/catering_sale.xls')df.head(3)datesales02015-03-0151.012015-02-282618.222015-02-272608.4df.isnull().sum()date0sales1dtype:int64Value,然后对每一列的缺失值进行插值,插值的自变量为缺失值前后k数据的索引.来自scipy.interpolateimportlagrangedf['Sales'][(df['Sales']<400)|(df['Sales']>5000)]=None#过滤离群值并转为空值deflagrange_(s,n,k=4):"""s:要插值的列n:索引缺失值k的:插值前后k个数据"""l=list(range(n-k,n))+list(range(n+1,n+1+k))y=s[[iforiinlifi>=0]]#取出y=y前后k项数据的值[y.notnull()]#消除null值returnlagrange(y.index,list(y))(j)#插入整个数据帧foriindf.columns:forjinrange(len(df)):ifdf[i].isnull()[j]:df[i][j]=lagrange_(df[i],j)df.to_excel('outputfile.xlsx')异常值处理异常值处理方法方法说明删除包含异常值的记录直接删除包含异常值的记录删除记录视为缺失值。异常值视为缺失值,采用缺失值处理的方法进行处理。平均值可以用前后两次观测值的平均值来修正。在有离群值的数据集中不直接处理离群值。数据集成是合并多个数据源并将它们存储在一致的数据存储(例如数据仓库)中的过程。数据挖掘所需要的数据往往分布在不同的数据源中,此时就需要进行数据集成。在数据集成过程中,来自多个数据源的现实世界实体的表达是不同的,可能不匹配。必须考虑实体识别和属性冗余,使源数据在最底层进行转换和细化。和整合。实体识别实体识别:识别来自不同数据源的真实世界实体。它的任务是统一不同源数据的矛盾。常见形式如下:同名异义:数据源A中的属性ID和数据源B中的属性ID属性ID分别描述了菜号和订单号,即描述了不同的实体。不同名称的同义词:数据源A中的sales__dt和数据源B中的sales_date都描述了销售日期,即A.sales__dt=B.sales_date。单位不统一:国际单位和中国繁体计量单位用于描述同一个实体。检测和解决这些冲突是实体识别的任务。冗余属性识别数据集成往往会导致数据冗余,例如:同一个属性出现多次;相同——不一致的属性命名会导致重复。仔细整合来自不同来源的数据可以减少甚至避免数据冗余和不一致,从而提高数据挖掘的速度和质量。冗余属性应先进行分析,检测后删除。一些冗余属性可以通过相关性分析来检测。给定两个数值属性A和B,根据它们的属性值,使用相关系数来衡量一个属性暗示另一个属性的程度。数据转换数据转换主要是对数据进行标准化处理,将数据转换成一种“合适”的形式,以满足挖掘任务和算法的需要。简单函数变换简单函数变换就是对原始数据进行一些数学函数变换。常用的变换有平方、平方根、对数、差分运算等,即:$$x'=x^2$$$$x'=\sqrtx$$$$x'=logx$$$$x'=f(x_{k+1})-f(x_{k})$$归一化数据归一化(normalization):对数据进行标准化处理,将数据按比例缩放,使其落入一个具体区域,便于综合分析。规范化处理是数据挖掘的一项基础工作。不同的评价指标往往有不同的维度,数值之间的差异可能会非常大。不进行处理可能会影响数据分析的结果。为了消除指标间维度和取值范围差异的影响,需要进行归一化。例如,将工资收入属性值映射到[-1,1]或[0,1]。数据规范化对于基于距离的挖掘算法尤为重要。Min-Max归一化(MinMaxScaler)$$x'=\frac{x-x_{min}}{x_{max}-x_{min}}$$fromsklearn.preprocessingimportMinMaxScalerdata=pd.read_excel('Python数据分析实战挖矿/chapter4/demo/data/normalization_data.xls',header=None)data012307852160228631144-600-5212245295-457468-12833695966951054419052769120515101403470248761464134134352571sualer=minmaxscaler()。fit(data)pd.dataframe(scaler.transform(data)012330300.07443800.1195650.8133220.00000030.0000001.0000001.0000000.56367641.0000000.9423080.9967110.80414950.2644630.8386290.8149670.90931060.6363640.8469900.7861840.929571零均值归一化(StandardScaler)$$x'=\frac{x-\mu}{\sigma}$$还是用上面的数据:来自sklearnStarnportimcalder(dataScalpprocessingd)。DataFrame(scaler.transform(data))01230-0.9779260.6868110.5017510.86209910.653127-1.714885-2.3688910.3989872-0.557806-1.4085130.159216-2.2447983-1.2003420.8474950.739480-0.49351541.7899220.6996660.7292550.2536095-0.4095290.4340010.1643290.58033560.7025530.4554250.0748610.643283连续变量的离散化一些数据挖掘算法,特别是一些分类算法(如ID3算法、Apriori分类等),需要数据经常需要将连续变量、分类变量转化为分类变量即对连续变量进行离散化。离散化的基本方法zation离散化的基本方法是将连续变量的取值区间划分为若干个区间,用不同的符号表示不同区间内的值。常用的离散化方法是等宽分组:将取值范围划分为等宽的区间,区间的个数由用户指定,类似于制作频数分布表。下面将“肝郁证型系数”的数据分为4类。data=pd.read_excel('Python数据分析与挖掘实践/chapter4/demo/data/discretization_data.xls')data.head(3)肝郁证候系数00.05610.48820.107k=4r=pd.cut(data['肝郁证候系数'],k,labels=range(k))foriinrange(4):plt.plot(data[r==i],[i]*(data[r==i].count()['肝郁证候系数']),'o')p=plt.title('等宽分组结果')等频分组:分组后,每个区间的数据量是一样的。r=pd.qcut(data['肝郁证候系数'],k,labels=range(k))foriinrange(k):plt.plot(data[r==i],[i]*(data[r==i].count()['肝郁证候系数']),'o')p=plt.title('等频分组结果')聚类与分组:使用聚类分组算法。fromsklearn.clusterimportKMeansKM=KMeans(n_clusters=k).fit(data['肝郁证候系数'].values.reshape(len(data['肝郁证候系数'].values),1))r=KM.labels_foriinrange(k):plt.plot(data[r==i],[i]*(data[r==i].count()['系数肝郁证']),'o')p=plt.title('等频分组结果')属性构建在数据挖掘过程中,为了提取更多有用信息,挖掘更深层次的模式,提高为了挖掘结果的准确性,我们需要利用现有的一些属性集构造新的属性,并将其添加到现有的属性集中。例如,在进行防盗漏电诊断建模时,已有的属性包括电源和供电量(线路上主要用户用电量的总和)。从理论上讲,功率输入和输出功率应该相等,但由于传输过程中的功率损耗,功率输入略大于功率输出。这使得输入功率明显大于输出功率。为了判断大用户是否存在窃电行为,可以构建一个新的指标——线损率,这个过程就是构建属性。新建属性线损率按照以下公式计算。$$线损率=\frac{供电电源-供电功率}{供电功率}\times100\%$$线损率的正常范围一般为3%~15%,如果远超出这个范围,可以相信该线路的大用户很可能存在盗电、漏电等异常用电行为。数据缩减?对大数据集进行复杂的数据分析和挖掘需要??很长时间。数据缩减产生更小但保持原始数据完整性的新数据集。对缩减后的数据集进行分析和挖掘会更有效率。数据规范的意义在于:减少无效和错误数据对建模的影响,提高建模的准确性;少量有代表性的数据会大大减少数据挖掘所需的时间;降低存储数据的成本。FeaturereductionFeaturereduction通过合并特征创建新的特征,或者通过删除不相关的特征(维度)直接降低数据维度,从而提高数据挖掘效率,降低计算成本。特征约简的目标是找到最小的特征子集,保证新数据子集的概率分布尽可能接近原数据集的概率分布。特征约简有合并特征、前向选择、后向删除、主成分分析等方法。简单来说,特征缩减就是减少数据列的数量。主成分分析的python实现逐步向前选择,逐步向后删除和决策树归纳属于直接删除不相关属性(维度)的方法。主成分分析是一种针对连续属性的数据降维方法。它构造原始数据的正交变换。新空间的基去除了原空间基下数据的相关性。只使用了几个新变量。可以解释原始数据中的大部分变异。在应用中,通常是选取几个小于原变量且能解释数据中大部分变量的新变量,即所谓的主成分,来代替原变量进行建模。data=pd.read_excel('Python数据分析与挖掘实践/chapter4/demo/data/principal_component.xls',header=None)data.head(3)01234567040.424.77.26.18.38.72.44220.0125.012.711.211.012.920.23.5429.1213.23.33.94.34.45.50.5783.6data.shape(14,8)从sklearn.decomposition导入pCApca=pdata(n=3)3.33.94.34.45.50.5783.6.sum()(array([[8.19133694,16.90402785,3.90991029],[0.28527403,-6.48074989,-4.62870368],[-23.70739074,-2.85245701,-0.4965231],[-14.43202637,2.29917325,-1.50272151],[5.4304568,10.00704077,9.52086923],[24.15955898,-9.36428589,0.72657857],[-3.66134607,-7.60198615,-2.36439873],[13.96761214,13.89123979,-6.44917778],[40.88093588,-13.25685287,4.16539368],[-1.74887665,-4.23112299,-0.58980995],[-21.94321959,-2.36645883,1.33203832],[-36.70868069,-6.00536554,3.97183515],[3.28750663,4.86380886,1.00424688],[5.99885871,4.19398863,-8.59953736]]),0.9737201283709646)可以看出原始数据从8维降为3维,包含了97%的原始数据。小数据减少数据量,包括参数方法和非参数方法两类。参数方法使用模型来评估数据,只需要存储参数而不是实际数据,例如回归(线性回归和多元回归)和对数线性模型(近似离散属性集中的多维概率分布)。非参数方法需要存储实际数据,例如直方图、聚类、抽样(sampling)。比如采样、分箱等都是数值约简的方法。``
