大数据采集与预处理技术(微课版)课件 5.2 图书信息数据预处理-数据清洗常见方法_第1页
大数据采集与预处理技术(微课版)课件 5.2 图书信息数据预处理-数据清洗常见方法_第2页
大数据采集与预处理技术(微课版)课件 5.2 图书信息数据预处理-数据清洗常见方法_第3页
大数据采集与预处理技术(微课版)课件 5.2 图书信息数据预处理-数据清洗常见方法_第4页
大数据采集与预处理技术(微课版)课件 5.2 图书信息数据预处理-数据清洗常见方法_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大数据采集与预处理技术*

*项目二图书信息数据采集与预处理序号软件配置要求1scrapy最新版本2redis最新版本一、项目目标:1、完成图书信息数据分布式采集环境安装配置;2、完成图书信息数据采集程序设计和数据采集;3、完成图书信息数据预处理清洗。4、完成图书信息数据文本标注。二、环境要求:任务二图书信息数据预处理一、任务目标1、理解常见的数据清洗方法和原理,根据模型训练要求,完成图书信息数据的缺失值、异常值和重复值处理。2、理解描述性变量转换为数值型数据的方法和用处,并完成图书信息数据的描述性变量转换。3、掌握数据标准化方法,了解文本数据训练集、测试集划分,完成图书信息数据的标准化和测试集划分。二、重复值处理pandas提供了一个名为drop_duplicates的去重方法。该方法只对DataFrame或者Series类型有效。这种方法不会改变数据原始排列,支持单一或几个特征的数据去重。pandas.DataFrame(Series).drop_duplicates(self,subset=None,keep='first',inplace=False)参数名称参数说明subset接收string或sequence。表示进行去重的列。默认为None,表示全部列。keep接收特定string。表示重复时保留第几个数据。First:保留第一个。Last:保留最后一个。False:只要有重复都不保留。默认为first。inplace接收boolean。表示是否在原表上进行操作。默认为False。假设df是dataframe对象,并且有“book_name”、“book_id”、“book_grade”列,使用drop_duplicates去除重复数据的示例代码如下所示:#使用dataframe的drop_duplicates方法去重unames=df['book_name'].drop_duplicates()#多个重复字段去重,多个字段值都重复时删除行shapeDet=df.drop_duplicates(subset=['book_id','book_grade']).shapeprint('去重之后表大小为:',shapeDet)#如果两行数据相似度为90%,则认为是重复值并删除#自定义函数来计算字符串的相似度fromdifflibimportSequenceMatcherdefsimilar(a,b):

returnSequenceMatcher(None,a,b).ratio()similarity_threshold=0.90 #设定相似度阈值rows_to_delete=[] #用于存储要删除的行索引#SequenceMatcher是Python标准库中difflib模块的一个类,它用于比较两个序列的相似度。以下是一些常用方法:1、ratio():返回序列之间的相似性比率,范围从0到1。2、quick_ratio():返回快速计算出的相似性比率。3、real_quick_ratio():返回更快速计算的相似性比率。#比较每一对行,为了计算速度设置从第800行开始foriinrange(800,len(df)):ifiinrows_to_delete:continueforjinrange(i+1,len(df)):ifsimilar(df.loc[i],df.loc[j])>=similarity_threshold:

rows_to_delete.append(j)print(j)#删除相似的行df_cleaned=df.drop(rows_to_delete)print(df_cleaned)三、缺失值处理数据中的某个或某些特征的值是不完整的,这些值称为缺失值。比如下图红框部分显示没有值。Pandas对应的方法: 1)识别缺失值的方法isnull(),如果对应的值是空,返回True,否则返回False。 2)识别非缺失值的方法notnull(),isnull和notnull之间结果正好相反。 print(df.isnull().tail(100))针对缺失值怎么处理?1、删除法2、替换法3、插值法1.1删除缺失值所在的行记录1.2删除缺失值所在的列2.1替换为固定值2.4替换为中位数2.2替换为均值2.5前后数据填充2.3替换为众数值3.1线性插值3.2多项式插值P:导致大量有效信息的丢失P:填充的数据不准确不处理:有的算法(贝叶斯、神经网络等)对缺失值不敏感,或者有些字段对结果分析作用不大pandas中提供了简便的删除缺失值的方法dropna,该方法既可以删除观测记录,亦可以删除特征。pandas.DataFrame.dropna(self,axis=0,how='any',thresh=None,subset=None,inplace=False)1.删除法参数名称说明axis接收0或1。表示轴向,0为删除观测记录(行),1为删除特征(列)。默认为0。how接收特定string。表示删除的形式。any表示只要有缺失值存在就执行删除操作。all表示当且仅当全部为缺失值时执行删除操作。默认为any。subset接收类array数据。表示进行去重的列∕行。默认为None,表示所有列/行。inplace接收boolean。表示是否在原表上进行操作。默认为False。#书名book_name、评分book_score任意一个是空值的行就删除df_dropna=df.dropna(axis=0,how="any",subset=["book_name","book_score"])#如果评论数book_grade、作者book_author都是空值就删除对应行df_dropna=df.dropna(axis=0,how="all",subset=["book_grade","book_author"])数据量较少时候,以最可能的值来插补缺失值,比删除全部不完全样本所产生的信息丢失要少。替换法主要有固定值填充、出现最频繁值填充、中位数/均值插补、用前后数据填充。假设df是Dataframe对象,并且有书名(book_name)、评分(book_score)、评论数(book_grade)、作者(book_author)等字段,则替换空值的示例代码如下所示:2.替换法#固定值填充,缺失值全部用0插补df=df.fillna(0) #作者列缺失值用固定值插补df['book_author']=data['book_author'].fillna('UNKNOWN')#出现最频繁值填充,即众数插补,离散/连续数据都行#mode返回出现最多的数据,book_score是“评分”字段freq_port=df.book_score.dropna().mode()[0]#采用出现最频繁的值插补df['book_score']=df['book_score'].fillna(freq_port)#中位数/均值插补,中位数填充适用于偏态分布或者有离群点的分布df['book_score'].fillna(df['book_score'].dropna().median(),inplace=True)#均值插补,适用于正态分布df['book_grade'].fillna(df['book_grade'].dropna().mean(),inplace=True)删除法简单易行,但是会引起数据结构变动,样本减少;替换法会影响数据的标准差,导致信息量变动。如果要克服上述问题可以使用插值法,常用的插值法有线性插值、多项式插值等。线性插值是针对已知的值求出线性方程,通过求解线性方程得到缺失值。假设df是爬虫采集的图书信息,有部分评论数book_grade字段缺失,这个字段和书评分book_score相关,则使用线性插值填充的示例代码如下:3.插值法#线性插值fromerpolateimportinterp1ddf_dropna=df.dropna() #先把空值行删除x=np.array(df_dropna["book_grade"].tolist()) #可以认为评论数book_grade是自变量y=np.array(df_dropna["book_score"].tolist()) #认为书评分book_score是因变量LinearInsValue=interp1d(x,y,kind='linear') #线性插值拟合x,yforiinrange(len(df)): #针对book_score值为空的记录找出其book_grade值ifpd.isna(df.iloc[i]['book_score']):g_value=df.iloc[i]['book_grade']s_value=LinearInsValue([g_value])df.iloc[i,df.columns.get_loc('book_score')]=s_value[0]多项式插值是利用已知的值拟合一个多项式,使得现有的数据满足这个多项式,再利用这个多项式求解缺失值,常见的多项式插值法有拉格朗日插值和牛顿插值等,一般针对有序的数据,如带有时间列的数据集,且缺失值为连续型数值小批量数据。假设df是爬虫采集的图书信息,有部分评论数book_grade字段缺失,这个字段和书评分book_score相关,则使用拉格朗日插值填充的示例代码如下:3.插值法fromerpolateimportlagrangedf_dropna=df.dropna(axis=0,how="any")x=np.array(df_dropna["book_score"].tolist()) #认为书评分book_score是自变量,与线性插值相反y=np.array(df_dropna["book_grade"].tolist()) #可以认为评论数book_grade是因变量LargeInsValue=lagrange(x[0:100],y[0:100]) #用前100条数据拟合拉格朗日插多项式foriinrange(len(df)): #针对book_score值为空的记录找出其book_grade值ifpd.isna(df.iloc[i]['book_grade'])andpd.notna(df.iloc[i]['book_score']):s_value=df.iloc[i]['book_score']g_value=LargeInsValue([s_value])#注意获取数据索引位置表达方法

df.iloc[i,df.columns.get_loc('book_grade')]=g_value[0]四、异常值处理这两张图像上哪些点可能是异常值?异常值是指样本中的个别值明显偏离它所属样本的其余观测值。如果计算分析过程的数据有异常值,会对结果会产生不良影响。检测异常值就是检验数据中是否有录入错误以及是否含有不合理的数据。常用方法:1)描述性统计法2)三西格玛法3)箱型图4)聚类、近邻度四、异常值处理1)描述性统计法描述性统计法是指找到与业务或者基本认知不符的数据,如书的评分为负数、人的年龄是大于200岁、物品售价小于0等,这些数值明显存在异常,但是是否是异常值,有时候需要根据应用场景确定。#与业务或者基本认知不符的数据,如年龄为负数,删除对应行foriinrange(len(df)):ifdf.iloc[i]['age']<0:

df.drop(i)#把提成senior、销售额sell_counts小于10000的记录对应置为10000columns_list=["senior","sell_counts"]foritemincolumns_list:ifdf.iloc[i]['senior']<10000:df.iloc[i,df.columns.get_loc('senior')]=10000

2)三西格玛法该法则先假设一组检测数据只含有随机误差,对原始数据进行计算处理得到标准差,按一定的概率确定一个区间,认为误差超过这个区间的就属于异常值。这种判别处理方法仅适用于对正态或近似正态分布的样本数据进行处理,如下表所示,其中σ代表标准差,μ代表均值,x=μ为图形的对称轴。数据的数值分布几乎全部集中在区间(μ-3σ,μ+3σ)内,超出这个范围的数据仅占不到0.3%。故根据小概率原理,可以认为超出3σ的部分数据为异常数据。三西格玛数值分布如下表所示:数值分布在数据中的占比(μ-σ,μ+σ)0.6827(μ-2σ,μ+2σ)0.9545(μ-3σ,μ+3σ)0.9973假设df是爬虫采集的图书信息,对图书评论数book_grade、评分book_score进行异常值查找,如果是异常值就进行删除,示例代码如下所示:neg_list=['book_grade','book_score']#当数值超出这个距离,可以认为它是异常值foriteminneg_list: df[item+'_zscore']=(df[item]-df[item].mean())/df[item].std() z_abnormal=abs(df[item+'_zscore'])>3foriinrange(len(z_abnormal)):ifz_abnormal[i]==True:df.drop(i)print("删除了第"+str(i)+'行数据')print(item+'中有'+str(z_abnormal.sum())+'个异常值')3)箱型图法箱型图提供了识别异常值的一个标准,即异常值通常被定义为小于QL-1.5IQR或大于QU+1.5IQR的值。QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小。QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大。IQR称为四分位数间距,是上四分位数QU与下四分位数QL之差,其间包含了全部观察值的一半。#要检查的列,一般只能是数值类型字段columns_list=["book_grade","book_score"]foritemincolumns_list: IQR=df[item].quantile(0.75)-df[item].quantile(0.25) #定义下界

q_abnormal_L=df[item]<df[item].quantile(0.25)-1.5*IQR #定义上界

q_abnormal_U=df[item]>df[item].quantile(0.75)+1.5*IQR print(item+'中有'+str(q_abnormal_L.sum()+q_abnormal_U.sum())+'个异常值')4)机器学习算法机器学习算法可以自动检测出异常数据点,常用的算法包括孤立森林、局部异常因子、One-ClassSVM等算法。孤立森林是一种基于树的无监督学习算法,通过随机划分特征空间,异常值在少数分割步骤中就会被孤立。局部异常因子通过计算数据点的局部密度与其邻居的密度比较,来识别异常值。One-ClassSVM尝试在高维空间中找到一个边界,区分正常点和异常点。下面以One-ClassSVM为例介绍图书数据df的异常值检测。提前安装sklearn依赖库可以使用pip命令,命令如下所示:pipinstallscikit-learn针对book_grade和book_scroe列异常值示例代码如下所示: fromsklearn.svmimportOneClassSVM#创建One-ClassSVM模型svm=OneClassSVM(nu=0.05,kernel="rbf",gamma=0.1)#nu参数控制异常值比例#训练模型svm.fit(df[['book_score','book_grade']])#预测异常值,返回1为正常点,-1为异常点df['outliers']=svm.predict(df[['book_score','book_grade']]])#筛选异常值outliers=df[df['outliers']==-1]print(outliers)五、描述性变量转换

数据分析模型中有相当一部分的算法模型都要求输入的特征为数值型,但实际数据中特征的类型不一定只有数值型,还会存在相当一部分的类别型,这部分的特征需要经过哑变量处理才可以放入模型之中。哑变量处理的原理示例如图。Python中可以利用pandas库中的get_dummies函数对类别型特征进行哑变量处理。pandas.get_dummies(data,prefix=None,prefix_sep='_',dummy_na=False,columns=None,sparse=False,drop_first=False)参数名称说明data接收array、DataFrame或者Series。表示需要哑变量处理的数据。无默认。prefix接收string、string的列表或者string的dict。表示哑变量化后列名的前缀。默认为None。prefix_sep接收string。表示前缀的连接符。默认为‘_’。dummy_na接收boolean。表示是否为Nan值添加一列。默认为False。columns接收类似list的数据。表示DataFrame中需要编码的列名。默认为None,表示对所有object和category类型进行编码。sparse接收boolean。表示虚拟列是否是稀疏的。默认为False。drop_first接收boolean。表示是否通过从k个分类级别中删除第一级来获得k-1个分类级别。默认为False。六、训练集测试集划分

在训练模型前大多需要对数据进行训练集和测试集划分,直接调用大部分机器学习库的train_test_split函数,也可以随机抽样选择。#方法一、直接调用train_test_split函数fromsklearn.model_selectionimporttrain_test_splitX=data.drop('标签列',axis=1) #X是特征列y=data['标签列'] #y是标签列X_train,X_test,y_train,y_test=train_test_split(X,y,tes

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论