版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
大數(shù)據(jù)采集與預(yù)處理技術(shù)*
*項(xiàng)目二圖書(shū)信息數(shù)據(jù)采集與預(yù)處理序號(hào)軟件配置要求1scrapy最新版本2redis最新版本一、項(xiàng)目目標(biāo):1、完成圖書(shū)信息數(shù)據(jù)分布式采集環(huán)境安裝配置;2、完成圖書(shū)信息數(shù)據(jù)采集程序設(shè)計(jì)和數(shù)據(jù)采集;3、完成圖書(shū)信息數(shù)據(jù)預(yù)處理清洗。4、完成圖書(shū)信息數(shù)據(jù)文本標(biāo)注。二、環(huán)境要求:任務(wù)二圖書(shū)信息數(shù)據(jù)預(yù)處理一、任務(wù)目標(biāo)1、理解常見(jiàn)的數(shù)據(jù)清洗方法和原理,根據(jù)模型訓(xùn)練要求,完成圖書(shū)信息數(shù)據(jù)的缺失值、異常值和重復(fù)值處理。2、理解描述性變量轉(zhuǎn)換為數(shù)值型數(shù)據(jù)的方法和用處,并完成圖書(shū)信息數(shù)據(jù)的描述性變量轉(zhuǎn)換。3、掌握數(shù)據(jù)標(biāo)準(zhǔn)化方法,了解文本數(shù)據(jù)訓(xùn)練集、測(cè)試集劃分,完成圖書(shū)信息數(shù)據(jù)的標(biāo)準(zhǔn)化和測(cè)試集劃分。二、重復(fù)值處理pandas提供了一個(gè)名為drop_duplicates的去重方法。該方法只對(duì)DataFrame或者Series類型有效。這種方法不會(huì)改變數(shù)據(jù)原始排列,支持單一或幾個(gè)特征的數(shù)據(jù)去重。pandas.DataFrame(Series).drop_duplicates(self,subset=None,keep='first',inplace=False)參數(shù)名稱參數(shù)說(shuō)明subset接收string或sequence。表示進(jìn)行去重的列。默認(rèn)為None,表示全部列。keep接收特定string。表示重復(fù)時(shí)保留第幾個(gè)數(shù)據(jù)。First:保留第一個(gè)。Last:保留最后一個(gè)。False:只要有重復(fù)都不保留。默認(rèn)為first。inplace接收boolean。表示是否在原表上進(jìn)行操作。默認(rèn)為False。假設(shè)df是dataframe對(duì)象,并且有“book_name”、“book_id”、“book_grade”列,使用drop_duplicates去除重復(fù)數(shù)據(jù)的示例代碼如下所示:#使用dataframe的drop_duplicates方法去重unames=df['book_name'].drop_duplicates()#多個(gè)重復(fù)字段去重,多個(gè)字段值都重復(fù)時(shí)刪除行shapeDet=df.drop_duplicates(subset=['book_id','book_grade']).shapeprint('去重之后表大小為:',shapeDet)#如果兩行數(shù)據(jù)相似度為90%,則認(rèn)為是重復(fù)值并刪除#自定義函數(shù)來(lái)計(jì)算字符串的相似度f(wàn)romdifflibimportSequenceMatcherdefsimilar(a,b):
returnSequenceMatcher(None,a,b).ratio()similarity_threshold=0.90 #設(shè)定相似度閾值rows_to_delete=[] #用于存儲(chǔ)要?jiǎng)h除的行索引#SequenceMatcher是Python標(biāo)準(zhǔn)庫(kù)中difflib模塊的一個(gè)類,它用于比較兩個(gè)序列的相似度。以下是一些常用方法:1、ratio():返回序列之間的相似性比率,范圍從0到1。2、quick_ratio():返回快速計(jì)算出的相似性比率。3、real_quick_ratio():返回更快速計(jì)算的相似性比率。#比較每一對(duì)行,為了計(jì)算速度設(shè)置從第800行開(kāi)始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)三、缺失值處理數(shù)據(jù)中的某個(gè)或某些特征的值是不完整的,這些值稱為缺失值。比如下圖紅框部分顯示沒(méi)有值。Pandas對(duì)應(yīng)的方法: 1)識(shí)別缺失值的方法isnull(),如果對(duì)應(yīng)的值是空,返回True,否則返回False。 2)識(shí)別非缺失值的方法notnull(),isnull和notnull之間結(jié)果正好相反。 print(df.isnull().tail(100))針對(duì)缺失值怎么處理?1、刪除法2、替換法3、插值法1.1刪除缺失值所在的行記錄1.2刪除缺失值所在的列2.1替換為固定值2.4替換為中位數(shù)2.2替換為均值2.5前后數(shù)據(jù)填充2.3替換為眾數(shù)值3.1線性插值3.2多項(xiàng)式插值P:導(dǎo)致大量有效信息的丟失P:填充的數(shù)據(jù)不準(zhǔn)確不處理:有的算法(貝葉斯、神經(jīng)網(wǎng)絡(luò)等)對(duì)缺失值不敏感,或者有些字段對(duì)結(jié)果分析作用不大pandas中提供了簡(jiǎn)便的刪除缺失值的方法dropna,該方法既可以刪除觀測(cè)記錄,亦可以刪除特征。pandas.DataFrame.dropna(self,axis=0,how='any',thresh=None,subset=None,inplace=False)1.刪除法參數(shù)名稱說(shuō)明axis接收0或1。表示軸向,0為刪除觀測(cè)記錄(行),1為刪除特征(列)。默認(rèn)為0。how接收特定string。表示刪除的形式。any表示只要有缺失值存在就執(zhí)行刪除操作。all表示當(dāng)且僅當(dāng)全部為缺失值時(shí)執(zhí)行刪除操作。默認(rèn)為any。subset接收類array數(shù)據(jù)。表示進(jìn)行去重的列∕行。默認(rèn)為None,表示所有列/行。inplace接收boolean。表示是否在原表上進(jìn)行操作。默認(rèn)為False。#書(shū)名book_name、評(píng)分book_score任意一個(gè)是空值的行就刪除df_dropna=df.dropna(axis=0,how="any",subset=["book_name","book_score"])#如果評(píng)論數(shù)book_grade、作者book_author都是空值就刪除對(duì)應(yīng)行df_dropna=df.dropna(axis=0,how="all",subset=["book_grade","book_author"])數(shù)據(jù)量較少時(shí)候,以最可能的值來(lái)插補(bǔ)缺失值,比刪除全部不完全樣本所產(chǎn)生的信息丟失要少。替換法主要有固定值填充、出現(xiàn)最頻繁值填充、中位數(shù)/均值插補(bǔ)、用前后數(shù)據(jù)填充。假設(shè)df是Dataframe對(duì)象,并且有書(shū)名(book_name)、評(píng)分(book_score)、評(píng)論數(shù)(book_grade)、作者(book_author)等字段,則替換空值的示例代碼如下所示:2.替換法#固定值填充,缺失值全部用0插補(bǔ)df=df.fillna(0) #作者列缺失值用固定值插補(bǔ)df['book_author']=data['book_author'].fillna('UNKNOWN')#出現(xiàn)最頻繁值填充,即眾數(shù)插補(bǔ),離散/連續(xù)數(shù)據(jù)都行#mode返回出現(xiàn)最多的數(shù)據(jù),book_score是“評(píng)分”字段freq_port=df.book_score.dropna().mode()[0]#采用出現(xiàn)最頻繁的值插補(bǔ)df['book_score']=df['book_score'].fillna(freq_port)#中位數(shù)/均值插補(bǔ),中位數(shù)填充適用于偏態(tài)分布或者有離群點(diǎn)的分布df['book_score'].fillna(df['book_score'].dropna().median(),inplace=True)#均值插補(bǔ),適用于正態(tài)分布df['book_grade'].fillna(df['book_grade'].dropna().mean(),inplace=True)刪除法簡(jiǎn)單易行,但是會(huì)引起數(shù)據(jù)結(jié)構(gòu)變動(dòng),樣本減少;替換法會(huì)影響數(shù)據(jù)的標(biāo)準(zhǔn)差,導(dǎo)致信息量變動(dòng)。如果要克服上述問(wèn)題可以使用插值法,常用的插值法有線性插值、多項(xiàng)式插值等。線性插值是針對(duì)已知的值求出線性方程,通過(guò)求解線性方程得到缺失值。假設(shè)df是爬蟲(chóng)采集的圖書(shū)信息,有部分評(píng)論數(shù)book_grade字段缺失,這個(gè)字段和書(shū)評(píng)分book_score相關(guān),則使用線性插值填充的示例代碼如下:3.插值法#線性插值fromerpolateimportinterp1ddf_dropna=df.dropna() #先把空值行刪除x=np.array(df_dropna["book_grade"].tolist()) #可以認(rèn)為評(píng)論數(shù)book_grade是自變量y=np.array(df_dropna["book_score"].tolist()) #認(rèn)為書(shū)評(píng)分book_score是因變量LinearInsValue=interp1d(x,y,kind='linear') #線性插值擬合x(chóng),yforiinrange(len(df)): #針對(duì)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]多項(xiàng)式插值是利用已知的值擬合一個(gè)多項(xiàng)式,使得現(xiàn)有的數(shù)據(jù)滿足這個(gè)多項(xiàng)式,再利用這個(gè)多項(xiàng)式求解缺失值,常見(jiàn)的多項(xiàng)式插值法有拉格朗日插值和牛頓插值等,一般針對(duì)有序的數(shù)據(jù),如帶有時(shí)間列的數(shù)據(jù)集,且缺失值為連續(xù)型數(shù)值小批量數(shù)據(jù)。假設(shè)df是爬蟲(chóng)采集的圖書(shū)信息,有部分評(píng)論數(shù)book_grade字段缺失,這個(gè)字段和書(shū)評(píng)分book_score相關(guān),則使用拉格朗日插值填充的示例代碼如下:3.插值法fromerpolateimportlagrangedf_dropna=df.dropna(axis=0,how="any")x=np.array(df_dropna["book_score"].tolist()) #認(rèn)為書(shū)評(píng)分book_score是自變量,與線性插值相反y=np.array(df_dropna["book_grade"].tolist()) #可以認(rèn)為評(píng)論數(shù)book_grade是因變量LargeInsValue=lagrange(x[0:100],y[0:100]) #用前100條數(shù)據(jù)擬合拉格朗日插多項(xiàng)式foriinrange(len(df)): #針對(duì)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])#注意獲取數(shù)據(jù)索引位置表達(dá)方法
df.iloc[i,df.columns.get_loc('book_grade')]=g_value[0]四、異常值處理這兩張圖像上哪些點(diǎn)可能是異常值?異常值是指樣本中的個(gè)別值明顯偏離它所屬樣本的其余觀測(cè)值。如果計(jì)算分析過(guò)程的數(shù)據(jù)有異常值,會(huì)對(duì)結(jié)果會(huì)產(chǎn)生不良影響。檢測(cè)異常值就是檢驗(yàn)數(shù)據(jù)中是否有錄入錯(cuò)誤以及是否含有不合理的數(shù)據(jù)。常用方法:1)描述性統(tǒng)計(jì)法2)三西格瑪法3)箱型圖4)聚類、近鄰度四、異常值處理1)描述性統(tǒng)計(jì)法描述性統(tǒng)計(jì)法是指找到與業(yè)務(wù)或者基本認(rèn)知不符的數(shù)據(jù),如書(shū)的評(píng)分為負(fù)數(shù)、人的年齡是大于200歲、物品售價(jià)小于0等,這些數(shù)值明顯存在異常,但是是否是異常值,有時(shí)候需要根據(jù)應(yīng)用場(chǎng)景確定。#與業(yè)務(wù)或者基本認(rèn)知不符的數(shù)據(jù),如年齡為負(fù)數(shù),刪除對(duì)應(yīng)行foriinrange(len(df)):ifdf.iloc[i]['age']<0:
df.drop(i)#把提成senior、銷售額sell_counts小于10000的記錄對(duì)應(yīng)置為10000columns_list=["senior","sell_counts"]foritemincolumns_list:ifdf.iloc[i]['senior']<10000:df.iloc[i,df.columns.get_loc('senior')]=10000
2)三西格瑪法該法則先假設(shè)一組檢測(cè)數(shù)據(jù)只含有隨機(jī)誤差,對(duì)原始數(shù)據(jù)進(jìn)行計(jì)算處理得到標(biāo)準(zhǔn)差,按一定的概率確定一個(gè)區(qū)間,認(rèn)為誤差超過(guò)這個(gè)區(qū)間的就屬于異常值。這種判別處理方法僅適用于對(duì)正態(tài)或近似正態(tài)分布的樣本數(shù)據(jù)進(jìn)行處理,如下表所示,其中σ代表標(biāo)準(zhǔn)差,μ代表均值,x=μ為圖形的對(duì)稱軸。數(shù)據(jù)的數(shù)值分布幾乎全部集中在區(qū)間(μ-3σ,μ+3σ)內(nèi),超出這個(gè)范圍的數(shù)據(jù)僅占不到0.3%。故根據(jù)小概率原理,可以認(rèn)為超出3σ的部分?jǐn)?shù)據(jù)為異常數(shù)據(jù)。三西格瑪數(shù)值分布如下表所示:數(shù)值分布在數(shù)據(jù)中的占比(μ-σ,μ+σ)0.6827(μ-2σ,μ+2σ)0.9545(μ-3σ,μ+3σ)0.9973假設(shè)df是爬蟲(chóng)采集的圖書(shū)信息,對(duì)圖書(shū)評(píng)論數(shù)book_grade、評(píng)分book_score進(jìn)行異常值查找,如果是異常值就進(jìn)行刪除,示例代碼如下所示:neg_list=['book_grade','book_score']#當(dāng)數(shù)值超出這個(gè)距離,可以認(rèn)為它是異常值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)+'行數(shù)據(jù)')print(item+'中有'+str(z_abnormal.sum())+'個(gè)異常值')3)箱型圖法箱型圖提供了識(shí)別異常值的一個(gè)標(biāo)準(zhǔn),即異常值通常被定義為小于QL-1.5IQR或大于QU+1.5IQR的值。QL稱為下四分位數(shù),表示全部觀察值中有四分之一的數(shù)據(jù)取值比它小。QU稱為上四分位數(shù),表示全部觀察值中有四分之一的數(shù)據(jù)取值比它大。IQR稱為四分位數(shù)間距,是上四分位數(shù)QU與下四分位數(shù)QL之差,其間包含了全部觀察值的一半。#要檢查的列,一般只能是數(shù)值類型字段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())+'個(gè)異常值')4)機(jī)器學(xué)習(xí)算法機(jī)器學(xué)習(xí)算法可以自動(dòng)檢測(cè)出異常數(shù)據(jù)點(diǎn),常用的算法包括孤立森林、局部異常因子、One-ClassSVM等算法。孤立森林是一種基于樹(shù)的無(wú)監(jiān)督學(xué)習(xí)算法,通過(guò)隨機(jī)劃分特征空間,異常值在少數(shù)分割步驟中就會(huì)被孤立。局部異常因子通過(guò)計(jì)算數(shù)據(jù)點(diǎn)的局部密度與其鄰居的密度比較,來(lái)識(shí)別異常值。One-ClassSVM嘗試在高維空間中找到一個(gè)邊界,區(qū)分正常點(diǎn)和異常點(diǎn)。下面以O(shè)ne-ClassSVM為例介紹圖書(shū)數(shù)據(jù)df的異常值檢測(cè)。提前安裝sklearn依賴庫(kù)可以使用pip命令,命令如下所示:pipinstallscikit-learn針對(duì)book_grade和book_scroe列異常值示例代碼如下所示: fromsklearn.svmimportOneClassSVM#創(chuàng)建One-ClassSVM模型svm=OneClassSVM(nu=0.05,kernel="rbf",gamma=0.1)#nu參數(shù)控制異常值比例#訓(xùn)練模型svm.fit(df[['book_score','book_grade']])#預(yù)測(cè)異常值,返回1為正常點(diǎn),-1為異常點(diǎn)df['outliers']=svm.predict(df[['book_score','book_grade']]])#篩選異常值outliers=df[df['outliers']==-1]print(outliers)五、描述性變量轉(zhuǎn)換
數(shù)據(jù)分析模型中有相當(dāng)一部分的算法模型都要求輸入的特征為數(shù)值型,但實(shí)際數(shù)據(jù)中特征的類型不一定只有數(shù)值型,還會(huì)存在相當(dāng)一部分的類別型,這部分的特征需要經(jīng)過(guò)啞變量處理才可以放入模型之中。啞變量處理的原理示例如圖。Python中可以利用pandas庫(kù)中的get_dummies函數(shù)對(duì)類別型特征進(jìn)行啞變量處理。pandas.get_dummies(data,prefix=None,prefix_sep='_',dummy_na=False,columns=None,sparse=False,drop_first=False)參數(shù)名稱說(shuō)明data接收array、DataFrame或者Series。表示需要啞變量處理的數(shù)據(jù)。無(wú)默認(rèn)。prefix接收string、string的列表或者string的dict。表示啞變量化后列名的前綴。默認(rèn)為None。prefix_sep接收string。表示前綴的連接符。默認(rèn)為‘_’。dummy_na接收boolean。表示是否為Nan值添加一列。默認(rèn)為False。columns接收類似list的數(shù)據(jù)。表示DataFrame中需要編碼的列名。默認(rèn)為None,表示對(duì)所有object和category類型進(jìn)行編碼。sparse接收boolean。表示虛擬列是否是稀疏的。默認(rèn)為False。drop_first接收boolean。表示是否通過(guò)從k個(gè)分類級(jí)別中刪除第一級(jí)來(lái)獲得k-1個(gè)分類級(jí)別。默認(rèn)為False。六、訓(xùn)練集測(cè)試集劃分
在訓(xùn)練模型前大多需要對(duì)數(shù)據(jù)進(jìn)行訓(xùn)練集和測(cè)試集劃分,直接調(diào)用大部分機(jī)器學(xué)習(xí)庫(kù)的train_test_split函數(shù),也可以隨機(jī)抽樣選擇。#方法一、直接調(diào)用train_test_split函數(shù)fromsklearn.model_selectionimporttrain_test_splitX=data.drop('標(biāo)簽列',axis=1) #X是特征列y=data['標(biāo)簽列'] #y是標(biāo)簽列X_train,X_test,y_train,y_test=train_test_split(X,y,tes
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 桂林醫(yī)學(xué)院桂林醫(yī)科大學(xué)2026年人才招聘?jìng)淇碱}庫(kù)含答案詳解
- 2025年河南醫(yī)學(xué)高等??茖W(xué)校公開(kāi)招聘高層次人才備考題庫(kù)及1套完整答案詳解
- 2025年博羅縣惠博小學(xué)音樂(lè)教師招聘?jìng)淇碱}庫(kù)及一套答案詳解
- 2025年莆田市國(guó)睿產(chǎn)業(yè)園區(qū)運(yùn)營(yíng)管理有限公司公開(kāi)招聘企業(yè)員工的備考題庫(kù)及答案詳解一套
- 幼兒園數(shù)學(xué)活動(dòng)中情景教學(xué)法的應(yīng)用效果觀察課題報(bào)告教學(xué)研究課題報(bào)告
- 2025年人民交通出版社股份有限公司校園招聘13人備考題庫(kù)完整參考答案詳解
- 2025年汝陽(yáng)縣審計(jì)局輔助性崗位公開(kāi)招聘勞務(wù)派遣工作人員實(shí)施備考題庫(kù)完整答案詳解
- 2026年上海市黃浦區(qū)教育系統(tǒng)實(shí)驗(yàn)及衛(wèi)生系列專技崗位工作人員招聘13人備考題庫(kù)完整參考答案詳解
- 2025年中國(guó)海洋大學(xué)環(huán)境科學(xué)與工程學(xué)院實(shí)驗(yàn)技術(shù)人員招聘?jìng)淇碱}庫(kù)及參考答案詳解1套
- 中國(guó)鐵路濟(jì)南局集團(tuán)有限公司2026年度招聘普通高校本科及以上學(xué)歷畢業(yè)生232人備考題庫(kù)及參考答案詳解1套
- 肩袖損傷中醫(yī)診療指南-
- 江蘇省無(wú)錫市2023-2024學(xué)年高一下學(xué)期期末考試物理試題(解析版)
- 基于51單片機(jī)的智能車畢業(yè)設(shè)計(jì)(論文)
- X學(xué)校生活飲用水涉水產(chǎn)品及消毒產(chǎn)品索證制度
- 公司員工管理制度
- 【MOOC】制藥分離工程-鄭州大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 中級(jí)微觀經(jīng)濟(jì)學(xué)復(fù)習(xí)試題和答案解析
- 酒店行業(yè)的信息安全培訓(xùn)方法
- 青島版二年級(jí)上冊(cè)除法單元復(fù)習(xí)課ppt
- 2023屆高考專題復(fù)習(xí):小說(shuō)專題訓(xùn)練群體形象與個(gè)體形象(含答案)
- 等腰三角形復(fù)習(xí)課教案
評(píng)論
0/150
提交評(píng)論