目录 | |||||||||||||||||||||||||||||||||||||||||||||||||
4. 数据预处理数据清洗、数据集成、数据交换、数据规约 à 提高信号质量。在整个建模过程中占比很长 60%~80%。 4.1数据清洗:删除无关重复数据,平滑噪声,筛选掉无关数据,处理缺失值异常值 4.1.1 缺失值处理:删除缺失记录、补插、不处理删除:最有效、但是局限性很大(通过减少历史数据来增加数据的完备性 à 浪费资源和隐藏的信息,可能影响客观性和准确性) 补插:
与拉格朗日插值最终的结果相同,python中只提供了拉格朗日插值法;如果要使用牛顿插值法需要自己编写代码。 牛顿插值法:迭代阶差商公式
代码:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
If you want to identify and remove duplicate rows in a DataFrame, there are two methods that will help: duplicated and drop_duplicates. Each takes as an argument the columns to use to identify duplicated rows.
D.duplicated() returns a boolean vector whose length is the number of rows, and which indicates whether a row is duplicated. D.drop_duplicates() removes duplicate rows. By default, the first observed row of a duplicate set is considered unique, but each method has a keep parameter to specify targets to be kept.
keep='first' (default): mark / drop duplicates except for the first occurrence. keep='last': mark / drop duplicates except for the last occurrence. keep=False: mark / drop all duplicates.
Set / Reset Index¶ Occasionally you will load or create a data set into a DataFrame and want to add an index after you’ve already done so. There are a couple of different ways. Set an index¶ DataFrame has a set_index method which takes a column name (for a regular Index) or a list of column names (for a MultiIndex), to create a new, indexed DataFrame:
In [324]: data Out[324]: a b c d 0 bar one z 1.0 1 bar two y 2.0 2 foo one x 3.0 3 foo two w 4.0
In [325]: indexed1 = data.set_index('c') In [326]: indexed1 Out[326]: a b d c z bar one 1.0 y bar two 2.0 x foo one 3.0 w foo two 4.0 In [327]: indexed2 = data.set_index(['a', 'b']) In [328]: indexed2 Out[328]: c d a b bar one z 1.0 two y 2.0 foo one x 3.0 two w 4.0 The append keyword option allow you to keep the existing index and append the given columns to a MultiIndex: In [329]: frame = data.set_index('c', drop=False) In [330]: frame = frame.set_index(['a', 'b'], append=True) In [331]: frame Out[331]: c d c a b z bar one z 1.0 y bar two y 2.0 x foo one x 3.0 w foo two w 4.0 Other options in set_index allow you not drop the index columns or to add the index in-place (without creating a new object): In [332]: data.set_index('c', drop=False) Out[332]: a b c d c z bar one z 1.0 y bar two y 2.0 x foo one x 3.0 w foo two w 4.0 In [333]: data.set_index(['a', 'b'], inplace=True) In [334]: data Out[334]: c d a b bar one z 1.0 two y 2.0 foo one x 3.0 two w 4.0 Reset the index¶ As a convenience, there is a new function on DataFrame called reset_index which transfers the index values into the DataFrame’s columns and sets a simple integer index. This is the inverse operation to set_index In [335]: data Out[335]: c d a b bar one z 1.0 two y 2.0 foo one x 3.0 two w 4.0 In [336]: data.reset_index() Out[336]: a b c d 0 bar one z 1.0 1 bar two y 2.0 2 foo one x 3.0 3 foo two w 4.0 The output is more similar to a SQL table or a record array. The names for the columns derived from the index are the ones stored in the names attribute. You can use the level keyword to remove only a portion of the index: In [337]: frame Out[337]: c d c a b z bar one z 1.0 y bar two y 2.0 x foo one x 3.0 w foo two w 4.0
In [338]: frame.reset_index(level=1) Out[338]: a c d c b z one bar z 1.0 y two bar y 2.0 x one foo x 3.0 w two foo w 4.0 reset_index takes an optional parameter drop which if true simply discards the index, instead of putting index values in the DataFrame’s columns. Note The reset_index method used to be called delevel which is now deprecated. 4.1.2 异常值处理
| |||||||||||||||||||||||||||||||||||||||||||||||||
4.2 数据集成多个数据源合并 à 一个数据库中 à 表达形式不一样,不匹配,属性冗余 à 转换、提炼、集成 实体识别:同名异意,异名同义,单位不统一 冗余识别:同一属性多次出现,同一属性命名不同 à 避免数据不一致 à 提高挖掘速度与质量(参见3.2.6 相关性分析 person相关系数,spearman相关系数,判定系数) | |||||||||||||||||||||||||||||||||||||||||||||||||
4.3数据变换对数据规范化处理,便于程序和挖掘分析。 4.3.1 简单函数变换:(开方,平方 ,取对数,差分): (非正态分布-> 正态分布) (非平稳序列->平稳序列(时间序列分析,有时通过简单的差分和对数运算即可完成)) 4.3.2 规范化(标准化)通过比例缩放,消除同一属性不同量纲、不同属性之间数值差异比较大的情况 1. 最小最大标准化(离差标准化):
(注意:若是遇到属性值超出【min,max】范围会出错,需要重新确定max和min) 2. 零-均值标准化(标准差标准化):
3. 小数定标标准化: 移动属性值的小数位数 讲属性值映射到 [-1,1]之间
| |||||||||||||||||||||||||||||||||||||||||||||||||
# -*- coding: utf-8 -*- """ Created on Fri Feb 9 11:53:37 2018 @author: 康宁 """ import pandas as pd path='D:\迅雷下载\《Python数据分析与挖掘实战》\图书配套数据、代码\chapter4\demo\data\normalization_data.xls' data=pd.read_excel(path)
data_max=data.max() data_min=data.min() data_mean=data.mean() data_std=data.std()
data_normal_min_max=(data-data_min)/(data_max-data_min) data_mornal_mean_std=(data-data_mean)/(data_std)
#data.abs().max() #np.log10(data.abs().max()) k=np.ceil(np.log10(data.abs().max())) data_10=data*10**(-k) | |||||||||||||||||||||||||||||||||||||||||||||||||
4.3.3 连续属性离散化分类算法(ID3,Apiroi)要求数据是分类属性形式 à 要求将连续属性 转换为分类属性 任务: 1. 确定分类数,分类点; (等宽法:对离群值敏感,各个区间分布不均匀,甚至极少,损坏决策模型; 等频法:避免等宽法缺点; 聚类分析法) 2. 将连续属性映射到分类属性 分类区间 不同符号数值代表不同区间上的连续属性值
| |||||||||||||||||||||||||||||||||||||||||||||||||
#---------------------------------------------------------------------------------------------------------- import pandas as pd import numpy as np
k=5 #组数 path='D:\迅雷下载\《Python数据分析与挖掘实战》\图书配套数据、代码\chapter4\demo\data\discretization_data.xls' data=pd.read_excel(path) data=data[u'肝气郁结证型系数'] #等宽分布 d1=pd.cut(data,bins=k,labels=range(k)) #pd.cut(实现连续值到离散区间之间的切分,labels默认为None,此时返回的标签是分组的区间,retbins 设置是否返回分割点)
#等频分布 w=np.linspace(0,1,k+1) l=data.describe(percentiles=w)[4:].drop(['max']) if k%2==1: l=l.drop(['50%']) #利用D.describe()计算分位数实现等频分布,percentiles为分位数列表 l[0]=l[0]*(1-1e-2) l[-1]=l[-1]*(1+1e-2) #扩大区间,防止边界值的标签为None d_efreq=pd.cut(data,bins=l,labels=range(k),retbins=False)
from sklearn.cluster import KMeans if __name__=='__main__':
kmodel=KMeans(n_clusters=k,n_jobs=1,random_state=123) kmodel.fit(data.reshape(-1,1)) cent=pd.DataFrame(kmodel.cluster_centers_,columns=['position']).sort_values(by='position',axis=0) #输出聚类中心,并且排序(默认是随机序的) d_kmeans=kmodel.labels_ d_kmeans_boundary=list(pd.rolling_mean(cent,window=2 )['position'])+[data.max()] d_kmeans_boundary[0]=data.reshape(-1,1).min()
import matplotlib.pyplot as plt import matplotlib as mpl plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
def cluster_plot(d,k): plt.figure() for i in range(k): plt.plot(data[d==i],i*np.ones(data[d==i].count()),'o') plt.show() return plt cluster_plot(d1,k) cluster_plot(d_efreq,k) cluster_plot(d_kmeans,k)
| |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
4.3.4 属性构造利用已有属性构造新的属性 --> 加入到现有属性集
4.3.5小波变换新型数据分析工具:信号处理、图像处理、语音处理、模式识别、量子物理 特点:多分辨率(在信号时域和频域均有表征信号局部特征的能力) 伸缩和平移变换 多出都聚焦分析 –> 非平稳信号的时域分析手段
将信号 分解 表达不同层次,不同频带信息的数据序列 --> 就是 小波系数
方法:
小波基函数 小波变换 基于小波变换的多尺度空间能量分布特征提取方法
小波分析这里没有看懂,后面需要仔细补足这里的理论知识
| |||||||||||||||||||||||||||||||||||||||||||||||||
4.4数据规约产生更小的保持源数据完整性的 新数据集 --> 后续的挖掘&分析更高效
4.4.1属性规约属性合并&删除不相关属性(同时确保新属性集的概率分布尽可能和原分布相同) à 减少数据维数 à 降低计算成本 方法:
主成分分析PCA:
分析流程:
βi=[β11, β21, β31, … βni]T
from sklearn.decomposition import PCA #PCA 参数说明:
4.4.2数值规约替代的、较小的数据 减少数据量 有参数:线性回归,多元回归,对数线性模型(近似离散属性的集中的多维概率分布) 无参数:存放实际数据,如:直方图、聚类(将对象归为簇,用数据的簇替换实际的数据)、抽样(有放回抽样,无放回抽样,聚类抽样(总共M个簇,抽出S个簇出来),分层抽样) | |||||||||||||||||||||||||||||||||||||||||||||||||
4.5 python主要数据预处理函数
from Scipy.interpolate import * f=lagrange(x,y) f(new_x)
D.unique(); #D是Pandas的Series对象
D.isnull()/D.notnull() D[D.isnull()]/D[D.notnull()]
np.random.randn(k,m,n) #生成(k,m,n)的随机矩阵,数值服从标准正太分布(0,1)
from sklearn.decomposition import PCA model=PCA() model.fit() modle.n_components_ model.explained_variance_ratio_ | |||||||||||||||||||||||||||||||||||||||||||||||||
《数据分析与挖掘实战》总结及代码练习---chap4 数据预处理
最新推荐文章于 2023-12-18 11:02:59 发布