《數(shù)據(jù)挖掘原理、算法與應(yīng)用(Python語(yǔ)言描述)》課件 【第三章】數(shù)據(jù)預(yù)處理_第1頁(yè)
《數(shù)據(jù)挖掘原理、算法與應(yīng)用(Python語(yǔ)言描述)》課件 【第三章】數(shù)據(jù)預(yù)處理_第2頁(yè)
《數(shù)據(jù)挖掘原理、算法與應(yīng)用(Python語(yǔ)言描述)》課件 【第三章】數(shù)據(jù)預(yù)處理_第3頁(yè)
《數(shù)據(jù)挖掘原理、算法與應(yīng)用(Python語(yǔ)言描述)》課件 【第三章】數(shù)據(jù)預(yù)處理_第4頁(yè)
《數(shù)據(jù)挖掘原理、算法與應(yīng)用(Python語(yǔ)言描述)》課件 【第三章】數(shù)據(jù)預(yù)處理_第5頁(yè)
已閱讀5頁(yè),還剩89頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ù)據(jù)挖掘原理、算法與應(yīng)用(Python語(yǔ)言描述)學(xué)習(xí)目標(biāo)(1)掌握數(shù)據(jù)缺失值的處理方法。(2)掌握數(shù)據(jù)標(biāo)準(zhǔn)化的方法。(3)掌握特征編碼的方法。(4)掌握離群值的檢測(cè)與處理方法。數(shù)據(jù)預(yù)處理的重要性模型輸入數(shù)據(jù)質(zhì)量直接影響建模效果在正式構(gòu)建模型之前往往需要對(duì)數(shù)據(jù)進(jìn)行恰當(dāng)?shù)念A(yù)處理GarbageinGarbageout常見的預(yù)處理方法缺失值處理:真實(shí)的數(shù)據(jù)往往因?yàn)楦鞣N原因存在缺失值,需要用刪除法或填補(bǔ)法來(lái)得到一個(gè)完整的數(shù)據(jù)子集。離群值檢測(cè)和處理:檢測(cè)數(shù)據(jù)集中那些明顯偏離數(shù)據(jù)集中的其他樣本,為數(shù)據(jù)分析提供高質(zhì)量的數(shù)據(jù)。標(biāo)準(zhǔn)化:數(shù)據(jù)分析及建模過(guò)程中,偏差。許多機(jī)器學(xué)習(xí)算法需要其輸入特征為標(biāo)準(zhǔn)化形式;若樣本的特征之間的量綱差異太大,樣本之間相似度評(píng)估結(jié)果將存在特征編碼:模型輸入的特征通常需要是數(shù)值型的,所以需要將非數(shù)值型特征轉(zhuǎn)換為數(shù)值特征。離散化:在數(shù)據(jù)信息損失盡量少的前提下,盡可能減少元數(shù)。目錄缺失值處理填補(bǔ)法刪除法數(shù)據(jù)標(biāo)準(zhǔn)化特征編碼離群值檢測(cè)案例:加拿大輕型汽車二氧化碳排放量數(shù)據(jù)集預(yù)處理對(duì)于有缺失值的數(shù)據(jù)集,不能直接用于模型的訓(xùn)練,需要對(duì)缺失的數(shù)據(jù)進(jìn)行刪除或填充處理。填補(bǔ)法可獲得完整的數(shù)據(jù)集,對(duì)于連續(xù)型數(shù)據(jù)通常采用均值填充,離散型數(shù)據(jù)則采用眾數(shù)或中位數(shù)填充。刪除法是根據(jù)具體情況刪除樣本(行)或特征(列)得到一個(gè)完整的數(shù)據(jù)子集。3.1缺失值處理3.1缺失值處理表3-1為某高校20名學(xué)生身高體重?cái)?shù)據(jù)集,部分?jǐn)?shù)據(jù)缺失,如其中學(xué)號(hào)為20230002學(xué)生的身高缺失、學(xué)號(hào)為20230003學(xué)生的姓名、體重與性別信息缺失。其中姓名、性別為非數(shù)值數(shù)據(jù),身高、體重為數(shù)值數(shù)據(jù)。importpandasaspd#導(dǎo)包data_=pd.read_execel("./eg311.excel")#讀入數(shù)據(jù),存放在data_中。對(duì)于連續(xù)型數(shù)據(jù),使用平均值填充缺失值,如表中學(xué)生信息收集過(guò)程中少數(shù)樣本的體重、身高缺失。但要注意的是均值填補(bǔ)會(huì)使得相應(yīng)特征的方差變小。對(duì)于離散型數(shù)據(jù),可以使用眾數(shù)填充,如表中學(xué)生信息中少數(shù)樣本的性別缺失,可以考慮使用數(shù)據(jù)表中樣本性別的眾數(shù)來(lái)填充。但這會(huì)加重類別的不平衡。3.1.1填補(bǔ)法Scikit-learn中缺失值填補(bǔ)函數(shù)用法:

SimpleImputer(missing_values=np.nan,#缺失值的占位符strategy=‘mean’,#填補(bǔ)策略fill_value=None,#策略"constant"的常數(shù)verbose=0,#控制Imputer的詳細(xì)程度copy=True#True,將創(chuàng)建X的副本;False,填補(bǔ)將在X上進(jìn)行,有例外。)strategy:如果是“mean”,則使用沿軸的平均值替換缺失值。如果是“median”,則使用沿軸的中位數(shù)替換缺失值。如果是“most_frequent”,則使用沿軸的最頻繁值替換缺失。如果是“constant”,表示使用指定的常數(shù)填充缺失值,可用于離散型和連續(xù)型的特征。3.1.1填補(bǔ)法Imputer方法方法功能fit(X[,y])擬合用于X的填補(bǔ)參數(shù)。fit_transform(X[,y])擬合數(shù)據(jù),然后轉(zhuǎn)換。transform(X)在X中計(jì)算所有缺失的值。例3-2缺失值處理-SimpleImputer

fromsklearn.imputeimportSimpleImputerimp_mean=SimpleImputer(missing_values=np.nan,strategy='mean')#實(shí)例化對(duì)象,采用均值填充。imp_mean.fit(data[["體重(Kg)","身高(米)"]])#擬合計(jì)算體重與身高的均值data[["體重(Kg)","身高(米)"]]=imp_mean.transform(data[["體重(Kg)","身高(米)"]])#用均值填充data#輸出輸出均值填充后的數(shù)據(jù)集,如所示,僅截取部數(shù)據(jù)。其中缺失的體重與身高已用均值填充。3.1.1填補(bǔ)法3.1.1填補(bǔ)法imp_most_frequent=SimpleImputer(missing_values=np.nan,strategy='most_frequent')##實(shí)例化對(duì)象,采用眾數(shù)填充。data[["性別"]]=imp_most_frequent.fit(data[["性別"]]).transform(data[["性別"]])Data采用眾數(shù)填充后的數(shù)據(jù)集如圖3-2所示。其中缺失的性別已用眾數(shù)“男”填充。Pandas缺失值處理缺失值處理:缺失數(shù)據(jù)通常用NaN(notanumber)表示,它是一個(gè)可以被檢測(cè)出來(lái)的標(biāo)記。默認(rèn)在所有的統(tǒng)計(jì)描述中都排除缺失數(shù)據(jù)。

方法描述dropna()根據(jù)各標(biāo)簽的值中是否存在缺失數(shù)據(jù)對(duì)軸標(biāo)簽進(jìn)行過(guò)濾,可通過(guò)閾值調(diào)節(jié)對(duì)缺失值的容忍度f(wàn)illna()用指定值或插值方法填充缺失數(shù)據(jù)isnull()返回一個(gè)含有布爾值的對(duì)象,這些布爾值表示哪些值是缺失值NA,該對(duì)象的類型與源類型一樣notnull()isnull的否定式dropna(axis=0,how='any',thresh=None,subset=None,inplace=False)fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,)

method:'backfill','bfill','pad','ffill',Nonesubset:array-like,optional#新版本不再采用fillna(),直接使用ffill()、bfill()其他填補(bǔ)方法

刪除法通過(guò)刪除包含缺失值的數(shù)據(jù),來(lái)得到一個(gè)完整的數(shù)據(jù)子集。

數(shù)據(jù)的刪除既可以從樣本的角度進(jìn)行,也可以從特征的角度進(jìn)行。刪除特征:當(dāng)某個(gè)特征缺失值較多,且該特征對(duì)數(shù)據(jù)分析的目標(biāo)影響不大時(shí),可以將該特征刪除。刪除樣本:刪除存在數(shù)據(jù)缺失的樣本。

該方法適合某些樣本有多個(gè)特征存在缺失值,且存在缺失值的樣本占整個(gè)數(shù)據(jù)集樣本數(shù)量的比例不高的情形。3.1.2刪除法pandas對(duì)象的方法dropna可實(shí)現(xiàn)樣本或特征的刪除。dropna(axis=0,how=‘a(chǎn)ny’,thresh=None,inplace=False)其中:how通常用于特征的刪除。當(dāng)how=“any”時(shí),用thresh參數(shù)指定不被刪除的特征的最少有效樣本數(shù)。how='all'時(shí),當(dāng)某列或行數(shù)據(jù)全部缺失時(shí)刪除該列或行。inplace為True時(shí)直接修改原始數(shù)據(jù),否則不修改原始數(shù)據(jù),函數(shù)返回修改后的數(shù)據(jù)。axis參數(shù)同樣是表示沿行還是列。3.1.2刪除法3.1.2刪除法例3-4刪除法處理缺失值data=data_.copy()#恢復(fù)原始數(shù)據(jù)data.dropna(axis=1,thresh=8,inplace=True)#刪除缺失值較多的特征姓名。Thresh指定特征的非缺失值的最低數(shù)量,axis=1指定刪除特征。data=data.dropna()#刪除有缺失值的樣本data_2=data.copy()data#輸出刪除缺失值后數(shù)據(jù)集如圖3-4所示。其中有缺失值的樣本,如1、2已被刪除,缺失值較多的姓名特征也被刪除。注:先刪除缺失值較多的特征,再刪除有缺失值的樣本,以保留最多的樣本數(shù)。目錄缺失值處理數(shù)據(jù)標(biāo)準(zhǔn)化Z-Score標(biāo)準(zhǔn)化Min-Max標(biāo)準(zhǔn)化考慮離群值的標(biāo)準(zhǔn)化Sklearn中標(biāo)準(zhǔn)化對(duì)象方法特征編碼離群值檢測(cè)案例:加拿大輕型汽車二氧化碳排放量數(shù)據(jù)集預(yù)處理

3.2數(shù)據(jù)標(biāo)準(zhǔn)化

3.2.1Z-Score標(biāo)準(zhǔn)化SklearnStandardScalerScikit-learn中Z-Score標(biāo)準(zhǔn)化函數(shù)用法:

StandardScaler(copy=True,#為False,嘗試避免復(fù)制并改為直接替換with_mean=False,#為True,則在縮放之前將數(shù)據(jù)居中with_std=False#為True,則將數(shù)據(jù)縮放為單位方差(或單位標(biāo)準(zhǔn)差))StandardScaler的fit()方法實(shí)現(xiàn)均值與方差的計(jì)算。Transform()方法實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)化(按公式3-1)。3.2.1Z-Score標(biāo)準(zhǔn)化例3-5Z-Score標(biāo)準(zhǔn)化data=data_2.copy()#獲取已進(jìn)行缺失值處理的數(shù)據(jù)fromsklearn.preprocessingimportStandardScaler#導(dǎo)包Std_Z=StandardScaler()#實(shí)例化data[["體重(Kg)","身高(米)"]]

=

Std_Z.fit_transform(data[["體重(Kg)","身高(米)"]])#標(biāo)準(zhǔn)化data_2[["體重(Kg)","身高(米)"]].describe()#輸出未標(biāo)準(zhǔn)化"體重(Kg)","身高(米)"的統(tǒng)計(jì)信息

3.2.2Min-Max標(biāo)準(zhǔn)化SklearnMinMaxScalerScikit-learn中Min-Max標(biāo)準(zhǔn)化函數(shù)用法:preprocessing.MinMaxScaler(feature_range=(0,

1),

#期望的轉(zhuǎn)換數(shù)據(jù)范圍copy=True#設(shè)置為False以執(zhí)行就地標(biāo)準(zhǔn)化并避免復(fù)制)

實(shí)現(xiàn)相同功能的函數(shù)還有minmax_scaleMinMaxScaler方法方法功能fit(X[,y])計(jì)算最大值和最小值用于后續(xù)標(biāo)準(zhǔn)化。fit_transform(X[,y])擬合數(shù)據(jù),然后轉(zhuǎn)換。inverse_transform(X[,copy])將數(shù)據(jù)重置為原始表示。partial_fit(X[,y])在線計(jì)算X上的最小值和最大值以便后續(xù)標(biāo)準(zhǔn)化。transform(X[,y,copy])通過(guò)居中和縮放執(zhí)行標(biāo)準(zhǔn)化。例3-6Min-Max標(biāo)準(zhǔn)化data=data_2.copy()#獲取已進(jìn)行缺失值處理的數(shù)據(jù)fromsklearn.preprocessingimportMinMaxScaler#導(dǎo)包Std_MM=MinMaxScaler(feature_range=(0,1))#實(shí)例化data[["體重(Kg)","身高(米)"]]=Std_MM.fit_transform(data[["體重(Kg)","身高(米)"]])#標(biāo)準(zhǔn)化data[["體重(Kg)","身高(米)"]].describe()3.2.2Min-Max標(biāo)準(zhǔn)化當(dāng)特征的取值中存在離群值,標(biāo)準(zhǔn)化后的效果較差,如某中學(xué)生的年齡錯(cuò)誤輸入為1600,這樣會(huì)導(dǎo)致分母過(guò)大,標(biāo)準(zhǔn)化的值整體靠近小的一端;如果年齡有1的離群值,又會(huì)導(dǎo)致標(biāo)準(zhǔn)化的值整體靠近大的一端。此種情況下,使用中位數(shù)和分位數(shù)間距進(jìn)行縮放會(huì)更有效。標(biāo)準(zhǔn)化公式:其中:median為中位數(shù),分母部分由參數(shù)“quantile_range”確定。缺省為IQR:3/4分位數(shù)-1/4分位數(shù)。3.2.3考慮離群值的標(biāo)準(zhǔn)化采用sklearn.preprocessing中的RobustScaler類來(lái)實(shí)現(xiàn)。RobustScaler常用參數(shù)說(shuō)明:RobustScaler(with_centering=False,#如果為True,則在標(biāo)準(zhǔn)化之前將數(shù)據(jù)居中with_scaling=False,#如果為True,則將數(shù)據(jù)縮放到四分位數(shù)范圍quantile_range=(25.0,75.0),#用于計(jì)算scale_的分位數(shù)范圍copy=True#如果為False,嘗試避免復(fù)制并改為直接替換)根據(jù)分位數(shù)范圍(默認(rèn)為IQR:InterquartileRange)減去中位數(shù)并縮放數(shù)據(jù)。IQR是第1個(gè)四分位數(shù)(第25個(gè)分位數(shù))和第3個(gè)四分位數(shù)(第75個(gè)分位數(shù))之間的范圍。3.2.3考慮離群值的標(biāo)準(zhǔn)化3.2.3考慮離群值的標(biāo)準(zhǔn)化例3-7考慮離群值的標(biāo)準(zhǔn)化data=data_2.copy()##獲取已進(jìn)行缺失值處理的數(shù)據(jù)fromsklearn.preprocessingimportRobustScaler#導(dǎo)包Std_R=RobustScaler()#實(shí)例化data[["體重(Kg)","身高(米)"]]=Std_R.fit_transform(data[["體重(Kg)","身高(米)"]])#標(biāo)準(zhǔn)化data[["體重(Kg)","身高(米)"]].describe()#輸出標(biāo)準(zhǔn)化的結(jié)果RobustScaler標(biāo)準(zhǔn)化標(biāo)準(zhǔn)化后數(shù)據(jù)集的相關(guān)統(tǒng)計(jì)信息圖3-8所示。圖3-8RobustScaler標(biāo)準(zhǔn)化標(biāo)準(zhǔn)化后數(shù)據(jù)集的相關(guān)統(tǒng)計(jì)信息方法功能fit(X[,y])計(jì)算中值和分位數(shù)用于后續(xù)標(biāo)準(zhǔn)化。fit_transform(X[,y])擬合數(shù)據(jù),然后轉(zhuǎn)換。inverse_transform(X)將數(shù)據(jù)縮減為原始表示。transform(X)通過(guò)居中和縮放執(zhí)行標(biāo)準(zhǔn)化。3.2.4sklearn中標(biāo)準(zhǔn)化對(duì)象方法目錄缺失值處理數(shù)據(jù)標(biāo)準(zhǔn)化特征編碼Map函數(shù)標(biāo)簽編碼獨(dú)熱編碼啞元編碼離散化離群值檢測(cè)案例:加拿大輕型汽車二氧化碳排放量數(shù)據(jù)集預(yù)處理模型輸入的特征通常需要是數(shù)值型的,所以需要將非數(shù)值型特征轉(zhuǎn)換為數(shù)值特征如性別、職業(yè)、收入水平、國(guó)家、汽車使用品牌包括數(shù)字編碼、One-Hot編碼、啞變量編碼方法數(shù)字編碼原特征gender={“M”,“F”和“unknown”}編碼后gender={0,1,2}缺點(diǎn):引入了次序關(guān)系3.3特征編碼常用的編碼方法有map函數(shù)、LabelEncoder、獨(dú)熱編碼、get_dummies。3.3.1map函數(shù)除了采用以上專用的編碼類對(duì)特征編碼,還可以使用map函數(shù)來(lái)進(jìn)行編碼。如對(duì)data數(shù)據(jù)集的‘gender’屬性進(jìn)行編碼,M編為1,F(xiàn)編為2。采用map具有更好的靈活性,但使用相對(duì)復(fù)雜。例3-8map函數(shù)編碼性別data=data_2.copy()data["gender"]=data["gender"].map({"男":1,"女":2})data[["gender"]]標(biāo)簽編碼(LabelEncoder)將包含k個(gè)取值的離散型特征轉(zhuǎn)換成0到k-1的數(shù)值,經(jīng)過(guò)LabelEncoder編碼之后,使特征的取值有了大小分別,如對(duì)性別采用編碼后,男女分別對(duì)應(yīng)0或1,男女本無(wú)大小區(qū)別,但編碼后1明顯大于0。LabelEncoder編碼通過(guò)sklearn.preprocessing中的LabelEncoder類來(lái)實(shí)現(xiàn)。LabelEncoder()

沒(méi)有參數(shù)。3.3.2標(biāo)簽編碼方法功能fit(y)擬合標(biāo)簽編碼器。fit_transform(y)擬合標(biāo)簽編碼器并返回編碼標(biāo)簽。inverse_transform(Y[,threshold])將標(biāo)簽轉(zhuǎn)換回原始編碼。transform(y)將標(biāo)簽轉(zhuǎn)換為規(guī)范化編碼。3.3.2標(biāo)簽編碼3.3.2標(biāo)簽編碼例3-9對(duì)數(shù)據(jù)集性別進(jìn)行標(biāo)簽編碼data=data_2.copy()fromsklearn.preprocessingimportLabelEncoderLbE=LabelEncoder()data[["性別"]]=LbE.fit_transform(data[["性別"]])data

3.3.3獨(dú)熱編碼One-Hot編碼通過(guò)sklearn.preprocessing中的OneHotEncoder類來(lái)實(shí)現(xiàn)。OneHotEncoder常用參數(shù)說(shuō)明:OneHotEncoder(categories=‘a(chǎn)uto’,#指定類別數(shù)量drop=“first”,#指定刪除的特征dtype=<class‘numpy.float64’>,#期望的輸出類型。sparse=True,#如果設(shè)置為True將返回稀疏矩陣,否則將返回一個(gè)數(shù)組。handle_unknown=‘error’#若轉(zhuǎn)換期間存在未知的分類特征,引發(fā)錯(cuò)誤還是忽略。)其中:Drop參數(shù)用于指定One-Hot編碼后,刪除一列,消除特征的相關(guān)性。如取“男”、“女”二值的“性別”特征使用One-Hot編碼后,原來(lái)的一個(gè)特征變成兩個(gè)特征,“性別_男”和“性別_女”,刪除后保留一列,“性別_男”,男性樣本取值1,女性樣本取值0。3.3.3獨(dú)熱編碼3.3.3獨(dú)熱編碼例3-10獨(dú)熱編碼fromsklearn.preprocessingimportOneHotEncoderOHE=OneHotEncoder(sparse=False)OHE.fit_transform(data[["性別"]])編碼結(jié)果如圖3-11所示。由圖3-11可見,男編碼為[0,1],女編碼為[1,0]。如下代碼將編碼結(jié)果加入到原數(shù)據(jù)集。data=data.join(pd.DataFrame(OHE.fit_transform(data[["性別"]]),columns=OHE.categories_))Pandas實(shí)現(xiàn)啞元編碼get_dummies常用參數(shù)說(shuō)明:pd.get_dummies(data,#輸入的數(shù)據(jù)prefix=None,#指定輸出的列添加前綴prefix_sep=’_’,#設(shè)置前綴與分類的分隔符sepration,默認(rèn)是下劃線"_"dummy_na=False,columns=None,#指定需要實(shí)現(xiàn)類別轉(zhuǎn)換的列名sparse=False,#增加一列表示空缺值,如果False就忽略空缺值drop_first=False,#獲得k中的k-1個(gè)類別值,去除第一個(gè)dtype=None,)啞元編碼(get_dummies)只能對(duì)離散型變量進(jìn)行編碼,與One-Hot編碼相似,但啞變量編碼之后生成的新特征數(shù)比對(duì)應(yīng)特征的取值個(gè)數(shù)K少1。3.3.4啞元編碼3.3.4啞元編碼例3-11get_dummies編碼性別data=data_2.copy()data=pd.get_dummies(data)編碼結(jié)果如圖3-12所示。離散化是將連續(xù)的數(shù)值數(shù)據(jù)轉(zhuǎn)化為非連續(xù)的離散值,對(duì)數(shù)值數(shù)據(jù)離散化可以提高模型的性能、減少存儲(chǔ),也可以對(duì)標(biāo)簽離散化,將回歸問(wèn)題轉(zhuǎn)化為分類問(wèn)題。如工資的收入由原始的連續(xù)數(shù)據(jù)編碼為“高”、“中”、“低”。Pandas提供等距、等頻離散化方法。3.3.5離散化1.等距離散化根據(jù)連續(xù)型特征的取值,將其均勻地劃分成??個(gè)區(qū)間,每個(gè)區(qū)間的寬度均相等,然后將特征的取值劃入對(duì)應(yīng)的區(qū)間從而完成特征離散化。如年齡取值應(yīng)分布在[0,90],確定離散化后的區(qū)間段個(gè)數(shù)為5。等距離散化對(duì)輸入數(shù)據(jù)質(zhì)量要求高,無(wú)法解決特征存在離群值的問(wèn)題。若存在離群值150,則切分點(diǎn)將嚴(yán)重偏移。3.3.5離散化例3-12等距離散化data=data_2.copy()pd.cut(data["體重(Kg)"],3,labels=range(3))#對(duì)體重進(jìn)行等距離散化,按距離3等分,標(biāo)簽圍毆0,1,2data[["體重(Kg)"]]3.3.5離散化2.等頻離散化不要求區(qū)間段的寬度始終保持一致,而是盡量使得離散化后每一個(gè)區(qū)間內(nèi)的樣本量均衡根據(jù)連續(xù)型特征的總個(gè)數(shù),將其均勻地劃分成??個(gè)區(qū)間段,使得每個(gè)區(qū)間段中的樣本數(shù)相同,然后每一份數(shù)據(jù)的取值范圍即是對(duì)應(yīng)的特征離散化區(qū)間3.3.5離散化3.3.5離散化2.等頻離散化例3-13等頻離散化data=data_2.copy()data[["體重(Kg)"]]=pd.qcut(data["體重(Kg)"],3,labels=range(3))data[["體重(Kg)"]]Pandasqcut實(shí)現(xiàn)等頻率離散化pandas.qcut(x,

#1維ndarray或Seriesq,

#分位數(shù)。10為十分位數(shù),4為四分位數(shù)等labels=None,

#指定返回的bin的標(biāo)簽。必須與生成的bin長(zhǎng)度相同。retbins=False,

#是否返回(bins,標(biāo)簽)。precision=3#存儲(chǔ)和顯示bin標(biāo)簽的精度。)3.二值化根據(jù)閾值將數(shù)據(jù)二值化(將特征值設(shè)置為0或1):大于閾值的值映射為1,而小于或等于閾值的值映射為0。默認(rèn)閾值為0時(shí),只有正值映射到1。

3.3.5離散化3.3.5離散化3.二值化例3-14二值化data=data_2.copy()fromsklearn.preprocessingimportBinarizerT_B=Binarizer(threshold=50)#閾值指定為50,大于50的二值化為1,小于等于50的二值化為0。T_B.fit_transform(data[["體重(Kg)"]])#擬合轉(zhuǎn)換數(shù)據(jù)體重以50為閾值二值化結(jié)果如圖3-15所示圖3-15體重二值化結(jié)果目錄缺失值處理數(shù)據(jù)標(biāo)準(zhǔn)化特征編碼離群值檢測(cè)3σ法箱線圖基于近鄰判斷離群值聚類法基于模型檢測(cè)離群值處理案例:加拿大輕型汽車二氧化碳排放量數(shù)據(jù)集預(yù)處理離群值指一個(gè)數(shù)據(jù)集中那些明顯偏離數(shù)據(jù)集中的其他樣本一種帶有統(tǒng)計(jì)學(xué)味道的定義是:一個(gè)觀測(cè)與其他觀測(cè)偏離太多以致于值得懷疑它是由不同的機(jī)制所產(chǎn)生的產(chǎn)生原因:自然變異、數(shù)據(jù)測(cè)量和收集的誤差以及人工操作失誤等離群值檢測(cè)可以作為數(shù)據(jù)預(yù)處理的一個(gè)步驟,為數(shù)據(jù)分析提供高質(zhì)量的數(shù)據(jù)離群值檢測(cè)也可以直接用來(lái)解決很多應(yīng)用問(wèn)題:信用欺詐檢測(cè)電信欺詐檢測(cè)疾病分析計(jì)算機(jī)安全診斷等離群值的影響3.4離群值檢測(cè)離群值是指數(shù)據(jù)集中那些明顯偏離數(shù)據(jù)集中其他樣本的樣本,如中學(xué)生的年齡取值大都在11-16間,但某個(gè)樣本的年齡取值為30,這就是一個(gè)離群值。檢測(cè)離群值為數(shù)據(jù)分析與建模提供高質(zhì)量的數(shù)據(jù),可有效改善模型的性能。離群值的檢測(cè)主要有

3σ法、箱線圖、基于近鄰判斷離群值以及回歸法等。3.4.13σ法當(dāng)樣本的取值符合正態(tài)分布時(shí)可以采用3σ法判斷離群值。樣本x和樣本均值μ之間的距離可以以標(biāo)準(zhǔn)差σ為單位進(jìn)行計(jì)算,其公式為3-5所示。Z-score(x)=(x-μ)/σ(3-5)得到樣本的Z-score值后,通常將不滿足條件公式3-6的樣本視為離群值。|Z-score(x)|<3(3-6)3σ法也廣泛應(yīng)用于對(duì)模型的殘差分析,找出離群值。3.4.13σ法例3-153σ法檢測(cè)離群值data=data_2.copy()mean_=data["身高(米)"].mean()#計(jì)算均值std_=data["身高(米)"].std()#計(jì)算標(biāo)準(zhǔn)差#提取不含離群值的樣本data_n3=data[(data["身高(米)"]<mean_+3*std_)&(data["身高(米)"]>mean_-3*std_)]#提取離群值data_out=data[(data["身高(米)"]>mean_+3*std_)|(data["身高(米)"]<mean_-3*std_)]data_out#查看包含離群值的樣本3σ法檢測(cè)的離群值如圖3-16所示。3.4.2箱線圖箱線圖是檢驗(yàn)樣本數(shù)據(jù)中異常值的常用方法,既可以用作服從正態(tài)分布樣本數(shù)據(jù)異常值判斷,也可以用作不服從正態(tài)分布樣本數(shù)據(jù)異常值判斷,適用范圍廣。K分位數(shù):令x是一個(gè)值,如果在數(shù)據(jù)集中,百分之K的數(shù)據(jù)的值都不大于x,則稱x為該數(shù)據(jù)集的K分位數(shù)。分位數(shù):Q1(25thpercentile),Q3(75thpercentile)中間分位數(shù)范圍:IQR=Q3-Q1方差(Variance)和標(biāo)準(zhǔn)差(Standarddeviation)方差:

3.4.2箱線圖最大非離群值上四分位數(shù)(Q3)中位數(shù)(Q2)下四分位數(shù)(Q1)最小非離群值離群值IQR3.4.2箱線圖例3-16箱線圖檢測(cè)離群值data=data_2.copy()importmatplotlib.pyplotaspltplt.rcParams["font.sans-serif"]=["SimHei"]plt.rcParams["axes.unicode_minus"]=Falsedata[["身高(米"]].plot(kind="box",figsize=[3,6])data.plot(kind="box")箱線圖如圖3-17所示。3.4.2箱線圖由圖3-17可見,身高7米以上的為離群值。data_desc=data[["身高(米)"]].describe().T#提取身高統(tǒng)計(jì)信息IQR=data_desc["75%"].values-data_desc["25%"].values#計(jì)算IQRmax=data_desc["75%"].values+1.5*IQR#計(jì)算最大非離群值min=data_desc["25%"].values-1.5*IQR#計(jì)算最小非離群值data=data[(data["身高(米)"]<max[0])&(data["身高(米)"]>min[0])]data_out=data[(data["身高(米)"]>max[0])|(data["身高(米)"]<min[0])]data_out#輸出離群值箱線圖檢測(cè)的離群值如圖3-18所示。局部異常因子算法(LOF算法,LocalOutlierFactor)基本想法:通過(guò)比較每個(gè)點(diǎn)??和其鄰域點(diǎn)的密度來(lái)判斷該點(diǎn)是否為異常點(diǎn),點(diǎn)??的密度越低,越可能被認(rèn)定是異常點(diǎn)密度通過(guò)點(diǎn)之間的距離來(lái)計(jì)算,點(diǎn)之間距離越遠(yuǎn),密度越低,距離越近,密度越高3.4.3基于近鄰判斷離群值3.4.3基于近鄰判斷離群值具體方法:(1)對(duì)樣本的離群程度進(jìn)行量化,量化分?jǐn)?shù)由它與K個(gè)最近鄰的距離決定,取值范圍為[0,+∞];(2)計(jì)算每一個(gè)樣本與其最近的K個(gè)近鄰樣本的距離,放到集合C中;(3)對(duì)C中的所有元素進(jìn)行降序排列;(4)根據(jù)給定的距離閾值,選取C中大于給定閾值距離所對(duì)應(yīng)的樣本作為離群值。3.4.3基于近鄰判斷離群值LocalOutlierFactor常用參數(shù)說(shuō)明:neighbors.LocalOutlierFactor(n_neighbors=10,#用于kneighbors查詢的鄰域數(shù)algorithm="auto",#{"auto","ball_tree","kd_tree","brute"},可選leaf_size=20,#傳遞給BallTree或KDTree的葉子大小metric="minkowski",#用于距離計(jì)算的度量p=2,#p=1時(shí),manhattan_distance(l1);p=2,euclidean_distance(l2)metric_params=None,contamination=0.1,#數(shù)據(jù)集中異常值的最高比例n_jobs=6#為鄰域搜索運(yùn)行的并行作業(yè)數(shù))LocalOutlierFactor方法方法功能fit(X[,y])使用X作為訓(xùn)練數(shù)據(jù)擬合模型。fit_predict(X[,y])使模型適合訓(xùn)練集X并返回標(biāo)簽。kneighbors([X,n_neighbors,return_distance])找到一個(gè)點(diǎn)的K鄰域。kneighbors_graph([X,n_neighbors,mode])計(jì)算X中點(diǎn)的k-鄰域的(加權(quán))圖。3.4.3基于近鄰判斷離群值例3-17LocalOutlierFactor檢測(cè)離群值data=data_2.copy()fromsklearn.neighborsimportLocalOutlierFactorlout=LocalOutlierFactor(n_neighbors=3)#實(shí)例化lout.fit(data[["身高(米)"]])

#擬合data["LO"]=lout.predict(data[["身高(米)"]])#檢測(cè)離群值data[data["LO"]==-1]#輸出LocalOutlierFactor檢測(cè)的離群值如圖3-19所示。3.4.4聚類法基于聚類的離群點(diǎn),是采用聚類的方法,如果一個(gè)樣本不屬于任何簇,那么該樣本就是離群點(diǎn)。具體的代碼如例3-18所示,聚類算法在聚類章節(jié)詳細(xì)介紹。例3-18聚類法檢測(cè)離群值data=data_2.copy()fromsklearn.clusterimportDBSCANDBS=DBSCAN()data["LOF_DBS"]=DBS.fit_predict(data[["身高(米)"]])#檢測(cè)離群值data[data["LOF_DBS"]==-1]#輸出離群值檢測(cè)的離群值如圖3-20所示。3.4.5基于模型檢測(cè)這種方法一般會(huì)構(gòu)建一個(gè)概率分布模型,并計(jì)算對(duì)象符合該模型的概率,把具有低概率的對(duì)象視為異常點(diǎn)。當(dāng)模型是聚類模型時(shí),則異常樣本是不顯著屬于任何簇的樣本;當(dāng)模型是回歸模型時(shí),異常樣本是相對(duì)遠(yuǎn)離預(yù)測(cè)值的樣本。3.4.6離群值處理離群值檢測(cè)出來(lái)后,通常把離群值當(dāng)缺失值處理,采用缺失值的處理方法來(lái)處理離群值。3.5案例:加拿大輕型汽車二氧化碳排放量數(shù)據(jù)集預(yù)處理3.5.1目標(biāo)對(duì)加拿大零售的新型輕型汽車特定車型燃料消耗等級(jí)和估計(jì)的二氧化碳排放量數(shù)據(jù)集進(jìn)行探索性分析以及預(yù)處理。3.5.2數(shù)據(jù)集介紹數(shù)據(jù)集來(lái)源:/datasets/rinichristy/2022-fuel-consumption-ratings數(shù)據(jù)集介紹:數(shù)據(jù)集提供了2022年在加拿大零售的新型輕型汽車的特定車型燃料消耗等級(jí)和估計(jì)的二氧化碳排放量。3.5.2數(shù)據(jù)集介紹數(shù)據(jù)集特征:ModelYear:車型年份Make:制造商Model:車型VehicleClass:車型類別EngineSize(L):排量Cylinders:氣缸數(shù)Transmission:變速箱FuelType:燃油類型Fuelconsumption:油耗CO2emissions:CO2排放量CO2rating:CO2等級(jí),從1(最差)到10(最好)等級(jí)的尾氣排放二氧化碳Smograting:煙霧等級(jí),形成煙霧的污染物的尾氣排放量,等級(jí)從1(最差)到10(最好)該數(shù)據(jù)集為無(wú)標(biāo)簽數(shù)據(jù)集。3.5.3實(shí)現(xiàn)代碼1.導(dǎo)包導(dǎo)入必要的數(shù)據(jù)包importpandasaspdimportnumpyasnpfrompandasimportcut#導(dǎo)入等距離散化包frompandasimportqcut#導(dǎo)入等頻離散化包fromsklearn.preprocessingimportBinarizer#導(dǎo)入二值化包fromsklearn.imputeimportSimpleImputer#導(dǎo)入缺失值處理包fromsklearn.neighborsimportLocalOutlierFactor#導(dǎo)入離群處理包fromsklearn.preprocessingimportStandardScaler#導(dǎo)入Z-score標(biāo)準(zhǔn)化包fromsklearn.preprocessingimportMinMaxScaler#導(dǎo)入MinMaxScaler標(biāo)準(zhǔn)化包fromsklearn.preprocessingimportRobustScaler#導(dǎo)入標(biāo)準(zhǔn)化-離群值包fromsklearn.preprocessingimportOneHotEncoder#導(dǎo)入特征編碼包fromsklearn.preprocessingimportLabelEncoder#導(dǎo)入標(biāo)簽編碼包importmatplotlib.pyplotasplt#導(dǎo)入畫圖工具包importwarningswarnings.filterwarnings("ignore")#不顯示warning3.5.3

實(shí)現(xiàn)代碼2.讀入數(shù)據(jù)data=pd.read_csv("d:/datasets/MY2022FuelConsumptionRatings.csv")#燃料消耗等級(jí)數(shù)據(jù)集data1=data.copy()#備份數(shù)據(jù)集,不同方法練習(xí)需要3.探索性分析data.head()#查看數(shù)據(jù)集的前5個(gè)樣本輸出結(jié)果如下:3.5.3

實(shí)現(xiàn)代碼其中第二行RangeIndex顯示數(shù)據(jù)集數(shù)據(jù)的總的樣本數(shù)946。第三行顯示數(shù)據(jù)集共包含15列。接下來(lái)顯示每列的名稱,每列的非空數(shù)據(jù)量,數(shù)據(jù)類型。根據(jù)非空數(shù)據(jù)量可以判斷數(shù)據(jù)是否有缺失,VehiceClass列只有621個(gè)數(shù)據(jù),缺失較多。根據(jù)數(shù)據(jù)類型找到非數(shù)值型數(shù)據(jù),數(shù)據(jù)預(yù)處理需要對(duì)其編碼。data.describe()顯示數(shù)值類型列的統(tǒng)計(jì)特征(樣本數(shù)、均值、標(biāo)準(zhǔn)差、最小、最大、分位數(shù))。輸出結(jié)果如左:缺省非數(shù)值類型不顯示,但如果特征全部為非數(shù)值型數(shù)據(jù),顯示特征不同取值的個(gè)數(shù),以及最多取值的個(gè)數(shù)。#單獨(dú)取出object類型數(shù)據(jù)data.describe(include="object")3.5.3實(shí)現(xiàn)代碼注:value_counts()顯示非數(shù)值型特征的取值以及各值的個(gè)數(shù)。上例中顯示FuelType特征有458個(gè)樣本取值Z;有446個(gè)樣本取值X;有28個(gè)樣本取值D;14個(gè)樣本取值E。3.5.3實(shí)現(xiàn)代碼4.缺失值處理(1)刪除特征特征有效樣本數(shù)少或?qū)Y(jié)果的影響很小可以考慮刪除特征。如:當(dāng)其缺失值個(gè)數(shù)大于數(shù)據(jù)集樣本總數(shù)的10%時(shí),刪除特征。data_new=data.dropna(axis=1,thresh=len(data)*.9)data_()查看刪除后的數(shù)據(jù)情況。輸出結(jié)果如下:可以看到原VehiceClass列沒(méi)有出現(xiàn)在新的數(shù)據(jù)集中。因?yàn)樵摿兄挥?21個(gè)數(shù)據(jù),不到總數(shù)的90%,被刪除。3.5.3實(shí)現(xiàn)代碼(2)刪除樣本對(duì)于缺失值比較少的,如FuelType,可以考慮刪除對(duì)應(yīng)的樣本。data_new=data.dropna()#刪除有缺失值的樣本data_()查看刪除后的數(shù)據(jù)集情況。輸出結(jié)果如下:可以看到在新的數(shù)據(jù)集中樣本總數(shù)減少到614,有缺失值的樣本已經(jīng)被刪除。3.5.3實(shí)現(xiàn)代碼(3)填充對(duì)數(shù)值型數(shù)據(jù)采用均值填充。imp_mean=SimpleImputer(missing_values=np.nan,strategy="mean")#實(shí)例化SimpleImputer對(duì)象,均值填充。data["FuelConsumption(Hwy(L/100km))"]=imp_mean.fit_transform(data[["FuelConsumption(Hwy(L/100km))"]])#擬合填充,更新原數(shù)據(jù)列()#查看輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼FuelConsumption(Hwy(L/100km))列已填充。對(duì)非數(shù)值型數(shù)據(jù)采用眾數(shù)填充。imp_mode=SimpleImputer(missing_values=np.nan,strategy="most_frequent")#實(shí)例化SimpleImputer對(duì)象,眾數(shù)填充data["FuelType"]=imp_mode.fit_transform(data[["FuelType"]])#擬合填充,更新原數(shù)據(jù)列()#查看輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼FuelType列已填充。對(duì)VehicleClass采用pandas的方法填充。data_new_2=data.fillna(method="bfill")data_new_2.info()輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼5.離群值檢測(cè)與處理(1)3σ法mean_=data["FuelConsumption(Hwy(L/100km))"].mean()#計(jì)算均值std_=data["FuelConsumption(Hwy(L/100km))"].std()#計(jì)算標(biāo)準(zhǔn)差data_n3=data[data["FuelConsumption(Hwy(L/100km))"]<mean_+3*std_][data["FuelConsumption(Hwy(L/100km))"]>mean_-3*std_]#保留3西格瑪內(nèi)的樣本查看處理結(jié)果data.describe()輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼(1)3σ法mean_=data["FuelConsumption(Hwy(L/100km))"].mean()#計(jì)算均值std_=data["FuelConsumption(Hwy(L/100km))"].std()#計(jì)算標(biāo)準(zhǔn)差data_n3=data[data["FuelConsumption(Hwy(L/100km))"]<mean_+3*std_][data["FuelConsumption(Hwy(L/100km))"]>mean_-3*std_]#保留3西格瑪內(nèi)的樣本查看處理結(jié)果data.describe()輸出結(jié)果如下:被刪除的8個(gè)樣本,不在3西格瑪內(nèi)。3.5.3實(shí)現(xiàn)代碼(2)箱線圖data[["FuelConsumption(Hwy(L/100km))"]].plot(kind="box",figsize=(5,6))輸出箱線圖如下:可以看到FuelConsumption(Hwy(L/100km))的值有部分離群。3.5.3實(shí)現(xiàn)代碼(3)LocalOutlierFactorfromsklearn.neighborsimportLocalOutlierFactorlout=LocalOutlierFactor(n_neighbors=30,algorithm="auto",#auto,ball_treekd_treebruteleaf_size=20,metric="minkowski",p=2,metric_params=None,contamination=0.1,n_jobs=1,novelty=True)#實(shí)例化lout.fit(data[["FuelConsumption(Hwy(L/100km))"]])data["fc"]=lout.predict(data[["FuelConsumption(Hwy(L/100km))"]])data[["fc"]].value_counts()#查看離群值數(shù)量data["nof"]=-lout.negative_outlier_factor_#保存離群因子data[["nof","FuelConsumption(Hwy(L/100km))","fc"]][data["nof"]>1].sample(10)#刪除LOF>1.5的所有行rows=[xforxindata.indexifdata.loc[x]['nof']>1.5]data2=data.drop(rows,axis=0)(),輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼6.標(biāo)準(zhǔn)化(1)Z分?jǐn)?shù)標(biāo)準(zhǔn)化fromsklearn.preprocessingimportStandardScaler#Z分?jǐn)?shù)標(biāo)準(zhǔn)化scaler1=StandardScaler(copy=True)#實(shí)例化scaler1.fit(data[["Cylinders"]])data["Cylinders_Zstd"]=scaler.transform(data[["Cylinders"]])importseabornassnssns.distplot(data["Cylinders"])#未標(biāo)準(zhǔn)化的Cylinders數(shù)量分布圖輸出結(jié)果如下:sns.distplot(data["Cylinders_StandardScaled"])#標(biāo)準(zhǔn)化后Cylinders數(shù)量分布圖輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼(2)MinMaxScaler標(biāo)準(zhǔn)化fromsklearn.preprocessingimportMinMaxScalerfiltered_columns=["Cylinders"]scaler=MinMaxScaler(copy=False)#實(shí)例化scaler.fit(data[["Cylinders"]])data["Cylinders_MM"]=scaler.transform(data[["Cylinders"]])sns.distplot(data["Cylinders_MM"])#標(biāo)準(zhǔn)化后Cylinders數(shù)量分布圖輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼(3)RobustScaler標(biāo)準(zhǔn)化fromsklearn.preprocessingimportRobustScalerrob=RobustScaler(with_centering=True,#如果為True,則在標(biāo)準(zhǔn)化之前將數(shù)據(jù)居中with_scaling=True,#如果為True,則將數(shù)據(jù)縮放到分位數(shù)范圍quantile_range=(25.0,75.0),#用于計(jì)算scale_的分位數(shù)范圍copy=True#如果為False,請(qǐng)嘗試避免復(fù)制并改為直接替換)#實(shí)例化rob.fit(data[["Cylinders"]])data["Cylinders_rob"]=rob.transform(data[["Cylinders"]])sns.distplot(data["Cylinders_rob"])#標(biāo)準(zhǔn)化后Cylinders數(shù)量分布輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼7.編碼(1)Map函數(shù)編碼data=data1.copy()data[["FuelType"]].value_counts()#查看FuelType取值輸出結(jié)果如下:FuelTypeZ458X439D28E14dtype:int64可見燃油類型有4個(gè)取值,分別為:Z、X、D、E。data["FuelType"]=data["FuelType"].map({"Z":0,"X":1,"D":2,"E":3})#編碼data[["FuelType"]].sample(5)#隨機(jī)查看5個(gè)樣本的編碼結(jié)果輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼(2)LabelEncoder編碼data=data1.copy().dropna()fromsklearn.preprocessingimportLabelEncoderle=LabelEncoder()data["FuelType_le"]=le.fit_transform(data["FuelType"])#編碼data[["FuelType_le"]].sample(5)#隨機(jī)查看5個(gè)樣本的編碼結(jié)果62輸出結(jié)果如下:(3)get_dummy編碼data=data1.copy().dropna()df=pd.get_dummies(data[['FuelType']],columns=['FuelType'])#對(duì)data[['FuelType']]編碼df_a=pd.get_dummies(data,columns=['FuelType'])#對(duì)'FuelType'編碼,結(jié)果并入原數(shù)據(jù)集df.sample(5)#隨機(jī)查看5個(gè)樣本的編碼結(jié)果輸出結(jié)果如下:3.5.3實(shí)現(xiàn)代碼(4)One

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論