python数据分析新手入门课程学习——(五)特征工程概述(数据预处理)(来源:慕课网)
機(jī)器學(xué)習(xí):計(jì)算機(jī)根據(jù)經(jīng)驗(yàn)(數(shù)據(jù))自動(dòng)化做出決策的過(guò)程最終機(jī)器學(xué)習(xí)達(dá)到一種狀態(tài),是當(dāng)我們輸入數(shù)據(jù)后,他能根據(jù)我們之前的訓(xùn)練或我們定義的目標(biāo)輸出我們想要的結(jié)果,這個(gè)過(guò)程其實(shí)就像一個(gè)函數(shù)一樣。我們數(shù)據(jù)或者需求就是機(jī)器學(xué)習(xí)主體的輸入,而這個(gè)主體的輸出就是我們想要的結(jié)果。我們把學(xué)習(xí)機(jī)器主體叫做數(shù)據(jù)模型。數(shù)據(jù)模型是個(gè)函數(shù),也是機(jī)器學(xué)習(xí)學(xué)習(xí)狀態(tài)的體現(xiàn)。數(shù)據(jù)模型并不是由人搭建起來(lái)的系統(tǒng),它來(lái)源于數(shù)據(jù),由數(shù)據(jù)構(gòu)造。
數(shù)據(jù)模型的作用:根據(jù)我們上面講到的輸入得到一組我們狀語(yǔ)從句:期待的輸入側(cè)相關(guān)的映射我們通過(guò)一些模型框架,也就是算法,如決策樹(shù),SVM等把數(shù)據(jù)組織起來(lái)就可以形成數(shù)據(jù)模型。即便使用同樣的模型框架算法,在不同的數(shù)據(jù)集的參與下,也會(huì)形成各種不同的模型。同樣的道理,同樣的數(shù)據(jù),在不同的框架算法下,也有著不同的表現(xiàn)。因此數(shù)據(jù)模型的英文數(shù)據(jù)框架算法狀語(yǔ)從句:數(shù)據(jù)共同。作用英文的查詢(xún)查詢(xún)結(jié)果經(jīng)驗(yàn)表明,數(shù)據(jù)集的質(zhì)和量的大小于數(shù)據(jù)模型的復(fù)雜度是呈負(fù)相關(guān)關(guān)系的數(shù)據(jù)集越大,數(shù)據(jù)集越好,數(shù)據(jù)模型的復(fù)雜度就越低。反之亦然。有時(shí)候數(shù)據(jù)集質(zhì)和量差到一定程度,根本無(wú)法建立起真正反應(yīng)真實(shí)數(shù)據(jù)關(guān)系的模型的。
如:有一張128×128的圖,我們要構(gòu)建個(gè)數(shù)據(jù)模型來(lái)判斷圖片里到底是貓還是狗,或者什么都不是最簡(jiǎn)單的模型就是把全世界所有情況貓和狗的128×128可能出現(xiàn)的影像全部都做個(gè)映射,一旦一張圖片出現(xiàn)了,我們立刻就知道,哪個(gè)是貓,哪個(gè)是狗,這是因?yàn)樗呀?jīng)提前映射好了。那如果我們只給出了寥寥幾張圖,這個(gè)時(shí)候要構(gòu)建模型就會(huì)非常復(fù)雜。如果這個(gè)時(shí)候新來(lái)了張圖,是一張之前提供的,沒(méi)有的顏色,的貓,那模型的辨識(shí)程度就很難讓人滿(mǎn)意,而且一個(gè)模型最終的形態(tài)是什么樣子的,起決定作用的就是數(shù)據(jù)。數(shù)據(jù)質(zhì)量的好壞直接影響著模型的好壞和功能。數(shù)據(jù)的數(shù)量和質(zhì)量要比算法重要的多。
因?yàn)橛辛烁鞣N不同的模型算法,對(duì)數(shù)據(jù)就有了不同的要求,我們可以直接使用數(shù)據(jù),也可以提取這些數(shù)據(jù)的特征進(jìn)行使用。特征怎么提取,怎么使用,這是個(gè)非常浩大的工程例如:一個(gè)三位數(shù),我們能提取出哪些特征呢?其中這里面有非常多的特征。這個(gè)三位數(shù)的個(gè),十,百位,是不是等差數(shù)列,是不是等比數(shù)列,三位數(shù)是不是都一樣,是不是這個(gè)數(shù)字可以和哪個(gè)節(jié)日相重合。甚至有幾個(gè)1,有幾個(gè)2都是它的特征。哪些特征有用,哪些沒(méi)用,往往和我們建模的目的是有關(guān)系的。有種說(shuō)法,說(shuō)是在中國(guó)的股市上,股票代碼里,4這個(gè)數(shù)字特別多的股票一般都是被低估的股票;而6和8多的股票都是被高估的股票還有像車(chē)牌號(hào),手機(jī)號(hào),有錢(qián)人喜歡用連號(hào)等,通過(guò)這些特征我們也能大概判斷出這些人的經(jīng)濟(jì)水平。剛才說(shuō)到的這些特征都蘊(yùn)含在數(shù)據(jù)里,也極其 明顯的。要提取這些特征需要我們有著比較豐富的社會(huì)經(jīng)驗(yàn),也需要我們善于觀(guān)察,總結(jié)和歸納。一個(gè)三位數(shù)字就已經(jīng)有非常多的特征了,更別說(shuō)圖片,文字之類(lèi)的數(shù)據(jù)了。所以,面對(duì)數(shù)據(jù)我們需要一條一條地多看的情況下,尤其要結(jié)合探索性數(shù)據(jù)的分析方法,宏觀(guān)地分析每個(gè)情況。總結(jié)歸納相關(guān)的特征,極端些,可以羅列出所有我們想不到的,想得到的,可能有用的,甚至我們看起來(lái)沒(méi)用的所有特征,有用就用,沒(méi)用就放著;更極端些,我們可以把每條數(shù)據(jù)當(dāng)作一個(gè)特征,最終建立起一對(duì)一的映射關(guān)系,除了必要的特征,我們有時(shí)還需要對(duì)這些特征進(jìn)行相應(yīng)的轉(zhuǎn)化,才能在特定的數(shù)據(jù)模型算法得到最佳的效果。上面我們說(shuō)到的所有關(guān)于特征的含義,提取,處理等內(nèi)容,都是特征工程的內(nèi)容(如下)。
?一,特征使用:確定數(shù)據(jù)源
?二,特征獲取:確定與存儲(chǔ)數(shù)據(jù)的過(guò)程
三,特征處理(重點(diǎn))
特征預(yù)處理,目的是指數(shù)據(jù)屬性和特征能盡可能大的發(fā)揮作用,體現(xiàn)差別。
1.數(shù)據(jù)清洗
(1)數(shù)據(jù)樣本抽樣:
?
1)樣本要具有代表性:樣本各個(gè)特征的比例應(yīng)該與整體的比例保持一致;
2)比如:研究人們?nèi)粘o嬍沉?xí)慣,但所有被研究人員男女比例失調(diào),達(dá)到了極其失真的比例7:1,樣本比例較人類(lèi)這個(gè)整體不是很平衡,我們就需要通過(guò)一定的手段使樣本平衡。我們可以在充分考慮代表性的前提下,少取些男性樣本的數(shù)量,使男女樣本接近于1,這樣的抽樣雖然相較于被研究的整體有失代表性,但相對(duì)于人群的總體,更具有代表性;
3)只有在量大維度廣的數(shù)據(jù)中我們才能獲得最為準(zhǔn)確的結(jié)論。當(dāng)然利用手頭工具可能不能處理全量數(shù)據(jù),但如果我們的目的是為了得到更準(zhǔn)確的結(jié)論,建立更準(zhǔn)確的模型,那就非常有必要考慮使用更合適的工具,如Hadoop的等大數(shù)據(jù)工具。
(2)異常值(空值)處理:
?
(1)空值,重復(fù)值,超出1.5倍上下四分位間距的值,實(shí)際情況下不允許出現(xiàn)的值。這些值可用函數(shù)處理,也可以自己添加規(guī)則進(jìn)行識(shí)別。
(2)異常值較多,可以考慮用新值代替異常值;或用判斷這個(gè)屬性是否是異常值的判斷結(jié)果代替異常值;還可以考慮用集中值(除異常值之外的均值,中位數(shù),眾數(shù)等)進(jìn)行指代;
(3)連續(xù)數(shù)據(jù)中,用四分位間距確定的上下邊界來(lái)確定超過(guò)上下邊界的數(shù),連續(xù)性的數(shù)還可以用插值的方法來(lái)填充異常值。
2.特征預(yù)處理
? ?(1)特征選擇:剔除與標(biāo)注不相關(guān)或冗余的特征,減少特征的個(gè)數(shù)。
(帶來(lái)的效果是減少了模型訓(xùn)練的時(shí)間。尤其是當(dāng)數(shù)據(jù)特征比較多的時(shí)候(成千上萬(wàn)個(gè)),有時(shí)還會(huì)有效地減少過(guò)擬合,甚至提升模型的準(zhǔn)確度。我們前面講過(guò)PCA,奇異值變換等通過(guò)變換的方式降維的方法,這些對(duì)特征降維的處理方式,我們叫做特征提取。既然叫特征提取,那就少不了變換。)
而特征選擇則依靠研究技術(shù)調(diào)查技術(shù)方法,或者數(shù)據(jù)模型,機(jī)器學(xué)習(xí)模型本身的特征進(jìn)行與標(biāo)注影響大小的排序后,剔除排序靠后的特征,實(shí)現(xiàn)降維。特征選擇可以放在對(duì)特征處理之前進(jìn)行,也可以在“ 特征變換”后進(jìn)行。總之,還是要結(jié)合屬性本身的特征和任務(wù)的需求進(jìn)行選擇。特征選擇需要重復(fù)迭代,不嫌麻煩多次驗(yàn)證。有時(shí)可能我們自己認(rèn)為特征選擇已經(jīng)做的足夠好了,但實(shí)際模型中訓(xùn)練并不太好,所以每次特征選擇都要使用模型去驗(yàn)證,最終的目的是獲取能訓(xùn)練出更好模型的數(shù)據(jù)。
數(shù)據(jù)科學(xué)中,有個(gè)比較常見(jiàn)的概念 - 數(shù)據(jù)歸約。特征選擇就是數(shù)據(jù)規(guī)約的一種處理方式(另一種是抽樣)。
# 引入線(xiàn)性回歸器 from sklearn.svm import SVR # 引入決策樹(shù)回歸器 from sklearn.tree import DecisionTreeRegressor# 確定特征X和標(biāo)注Y # 獲取某列數(shù)據(jù)最直接的方式是df.[列標(biāo)簽],但是當(dāng)列標(biāo)簽未知時(shí)可以通過(guò)loc獲取列數(shù)據(jù)。 X=df.loc[:,["A","B","C"]] Y=df.loc[:,"D"] # 引入幾個(gè)特征選擇思路的主要方法(SelectKBest——過(guò)濾,RFE——包裹,SelectFromModel——嵌入) from sklearn.feature_selection import SelectKBest,RFE,SelectFromModel?
數(shù)據(jù)選擇有三個(gè)切入思路。
1)過(guò)濾思想:。直接評(píng)價(jià)某個(gè)特征與標(biāo)注相關(guān)性的特征如果相關(guān)性小,就去掉表中我們的標(biāo)注無(wú)疑會(huì)落入連續(xù)值或者離散值的范疇,而把特征進(jìn)行比較粗的分類(lèi),也可以分為離散值或連續(xù)值,于是我們就可以在這張表中找到標(biāo)注對(duì)應(yīng)的類(lèi)型與特征對(duì)應(yīng)的類(lèi)型關(guān)聯(lián)性對(duì)應(yīng)的評(píng)價(jià)方法進(jìn)行評(píng)價(jià)。當(dāng)然這里的閾值設(shè)置可能比較靈活。大伙可以在特征比較多的時(shí)候,閾值設(shè)得高些;特征少時(shí),閾值低些;或直接根據(jù)任務(wù)需求,經(jīng)驗(yàn)進(jìn)行設(shè)置。
?
skb =SelectKBest(k=2) # 擬合 # (function f_classif:離散值和連續(xù)值用的function可能不一樣, # 所以處理時(shí)一張表可能通過(guò)不同的方法進(jìn)行篩選) skb.fit(X,Y) # C列相關(guān)性不高,被去掉了 skb.transform(X)2)包裹思想:包裹即包裝,包括的意思假設(shè)所有特征是個(gè)集合X,最佳的特征是它的一個(gè)子集,我們的任務(wù)就是找到這個(gè)子集我們需要先確定個(gè)評(píng)價(jià)指標(biāo),比如正確率于是我們可以遍歷特征子集,找到正確率評(píng)價(jià)下最佳的子集;也可以一步步進(jìn)行迭代,比如我們先拆分成幾個(gè)大點(diǎn)兒的子集,如果這個(gè)時(shí)候確定了最優(yōu)的特征子集,就針對(duì)這個(gè)特征子集進(jìn)行接下來(lái)的拆分,直到我們的評(píng)價(jià)指標(biāo)下降過(guò)快或低于閾值時(shí),整個(gè)過(guò)程結(jié)束。
?這個(gè)思想下有個(gè)比較常用的方法:RFE算法
? # RFE需要指定estimator:這里我們用線(xiàn)性回歸器(復(fù)雜度不高)# step:表示每迭代一步去掉幾個(gè)特征 rfe =RFE(estimator=SVR(kernel="linear"),n_features_to_select=2,step=1) # sklearn中這些類(lèi)型實(shí)體,尤其是數(shù)據(jù)轉(zhuǎn)化的類(lèi)型實(shí)體,他們的操作是有共通性的(都有fit、fit_transform) # 擬合過(guò)后再進(jìn)行變換 rfe.fit_transform(X,Y) # 這個(gè)輸出結(jié)果是"A"和"C",與上個(gè)結(jié)果不一致??
?3 )嵌入思想:嵌入的主體是特征,被嵌入的實(shí)體是個(gè)簡(jiǎn)單的模型。也就是說(shuō)根據(jù)個(gè)簡(jiǎn)單的模型分析特征的重要性。最常見(jiàn)的方式,是用正則化的方式來(lái)做特征選擇。
如:我們這里有?個(gè)特征,通過(guò)個(gè)回歸模型對(duì)標(biāo)注進(jìn)行回歸,回歸可以是線(xiàn)性回歸,也可以是邏輯回歸等最后得到一些瓦特系數(shù),然后對(duì)這些瓦特系數(shù),進(jìn)行正則化或正規(guī)化(正則化方式之后講,這里可認(rèn)為把它轉(zhuǎn)化成個(gè)0-1之間的數(shù))。此時(shí),這些系數(shù)就反應(yīng)了這些特征的分量和重要程度,如果有的系數(shù)比較小(像W_2),我們就可以把這個(gè)特征去掉。
嵌入思想實(shí)際上是有風(fēng)險(xiǎn)的,如有時(shí)模型選擇不當(dāng),會(huì)導(dǎo)致重要屬性被丟棄,所以,這里在嵌入思想選擇的模型最好是和最終做預(yù)測(cè)的模型有比較強(qiáng)的關(guān)聯(lián)如:都用線(xiàn)性模型或都用同樣分布形式的(也就是函數(shù)圖像一致的)非線(xiàn)性函數(shù)。
?
# threshold表示它重要性因子的那個(gè)數(shù),低于多少得去掉。 # threshold設(shè)置得太高,去掉的屬性也越多 # threshold設(shè)置得太低,屬性則都被保留# 為什么不直接用estimator呢,為什么還要進(jìn)行特征選擇呢? # 因?yàn)閿?shù)據(jù)量可能會(huì)非常大,而進(jìn)行特征選擇我們要快速地選出有用的特征。 # 所以我們可以對(duì)一部分樣本進(jìn)行簡(jiǎn)單的評(píng)測(cè),簡(jiǎn)單地用SelectFromModel,或其他的評(píng)測(cè)方法, # 而評(píng)測(cè)通過(guò)的話(huà),我們就可以用estimator中指定的方法進(jìn)行建模了。 #特征選擇中我們可能用的是一些樣本,而在正式建模中我們用的是全量數(shù)據(jù) sfm =SelectFromModel(estimator=DecisionTreeRegressor(),threshold=0.001) sfm.fit_transform(X,Y)?
我們想預(yù)測(cè)接下來(lái)幾個(gè)小時(shí)會(huì)不會(huì)下雨,我們可以拿到歷史數(shù)據(jù)包括以下屬性,這些屬性中和我們目的直接相關(guān)的只有一個(gè)(“下雨?不下雨?”),它就是標(biāo)簽,機(jī)器學(xué)習(xí)的建模是為了建立其他屬性與我們目的之間的關(guān)系。
標(biāo)注:反應(yīng)目的的屬性(我們關(guān)注的,又不容易獲得的,但可以存在些屬性和它有關(guān)系,并且這些有關(guān)系的屬性是容易獲取到的)其他屬性就是我們接下來(lái)要研究的特征。?
拿HR表來(lái)說(shuō),它也需要個(gè)標(biāo)簽,它的目的是預(yù)測(cè)員工是否會(huì)離職,故此標(biāo)簽為離職率。
?(2)特征變換:根據(jù)特征的特性進(jìn)行一定方式的轉(zhuǎn)換,使特征能發(fā)揮出它的特點(diǎn)。
接下來(lái)我們看幾個(gè)比較常用的特征變換的方法:
(1)對(duì)指化:就是對(duì)數(shù)據(jù)進(jìn)行對(duì)數(shù)化和指數(shù)化的過(guò)程我們分別看下對(duì)數(shù)化和指數(shù)化的過(guò)程。
指數(shù)化:就是將一個(gè)數(shù)進(jìn)行指數(shù)變化的過(guò)程指數(shù)的底數(shù)一般情況下取自然底數(shù)?指數(shù)化的é是什么呢從圖上看,自然指數(shù)的底數(shù)函數(shù)中,在大于0的部分,橫軸表示自變量有很小一段變化,在縱軸上會(huì)有比橫軸尺度更大的變化。也就是說(shuō),原來(lái)的大于0的范圍內(nèi),數(shù)據(jù)與數(shù)據(jù)間的差異很小,而經(jīng)過(guò)指數(shù)變換,數(shù)據(jù)與數(shù)據(jù)間的差距變大了如:我們計(jì)算出某特征數(shù)據(jù)屬于Y1,Y2,Y3的概率,進(jìn)行指數(shù)化(他們的差距從0.1變成0.14),再進(jìn)行歸一化(差距變小了0.1變成了0.04)。這個(gè)過(guò)程叫SOFTMAX(在監(jiān)督學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)中有非常廣泛的應(yīng)用)。
對(duì)數(shù)化:底數(shù)可以取2,10,例如如果一個(gè)數(shù)遠(yuǎn)大于1,橫軸變化很大的時(shí)候,縱軸的變化也不會(huì)很大這樣可以將一個(gè)非常大的數(shù)縮放到一個(gè)容易與方便計(jì)算的范圍內(nèi)如:收入數(shù)據(jù)。
(2)離散化:將連續(xù)數(shù)據(jù)變成離散數(shù)據(jù)的離散化操作。
數(shù)據(jù)需要被離散化的原因如下:
第一,連續(xù)數(shù)據(jù)的信息很多,但其中也有可能存在些我們意想不到的噪聲如:我們想通過(guò)收入分析國(guó)企,私企和外企哪個(gè)待遇好如果我們可以獲得員工的收入流水,基本可以確定和比較收入情況了。但如果有員工會(huì)通過(guò)接私活的方式賺取外快,或工資的一部分被公司扣去用作其他用途,那流水就有噪聲,不能直接反應(yīng)收入情況。如果有合適的方法將數(shù)據(jù)離散化,直接對(duì)比離散值的分布屬性就有可能得出更令人信服的結(jié)論;第二,某些算法要求數(shù)據(jù)必須是離散的,如:樸素貝葉斯。第三,數(shù)據(jù)的非線(xiàn)數(shù)據(jù)映射的需求;如:拿某些數(shù)據(jù)的分布來(lái)看,分布可能會(huì)有明顯的拐點(diǎn)或拐角點(diǎn)連續(xù)數(shù)值在不同的區(qū)間內(nèi)可能代表著不同的含義。
離散化的方法:
自因變量?jī)?yōu)化:就是根據(jù)自變量,因變量的有序分布,找到拐點(diǎn),特殊變化點(diǎn)進(jìn)行離散化(詳見(jiàn)探索性數(shù)據(jù)分析);等頻分箱又叫等深分箱(如下圖);等距分箱又叫等寬分箱(67-6 = 61,平均分成3分,分成3個(gè)區(qū)間)。接下來(lái)我們著重分析分箱技術(shù):數(shù)據(jù)在分箱前一定要進(jìn)行排序。既然是個(gè)箱子,就有它的深度和寬度。
import numpy as np import pandas as pd lst= [6,8,10,15,16,24,25,40,67] # 等深分箱 pd.qcut(lst,q=3,labels=["low","medium","high"]) # 等寬分箱 pd.cut(lst,bins=3,labels=["low","medium","high"])(3)歸一化:最小化,最大化的一種特殊形式,將數(shù)據(jù)所觸及的范圍縮放到指定大小范圍內(nèi)所謂歸一化,是將數(shù)據(jù)轉(zhuǎn)換到0-1范圍的內(nèi)這樣處理起來(lái)會(huì)更方便些一方面,可以觀(guān)察單個(gè)數(shù)據(jù)相對(duì)于數(shù)據(jù)整體情況的比例;另一方面,如果遇到不同樣綱的數(shù)據(jù)特征,可以方便地建立起這些數(shù)據(jù)特征之間進(jìn)行合適地距離度量方法。(如:特征甲:0-10,特征B:0-100,將他們都進(jìn)行歸一化,他們的范圍都是0-1,這樣對(duì)比數(shù)據(jù)就比較科學(xué))
?
import numpy as np import pandas as pd # 導(dǎo)入歸一化和標(biāo)準(zhǔn)化需要用的包 from sklearn.preprocessing import MinMaxScaler,StandardScaler # 歸一化 # reshape(-1,1)表示不指定有多少行,但一定要有1列 MinMaxScaler().fit_transform(np.array([1,4,10,15,21]).reshape(-1,1))(4)標(biāo)準(zhǔn)化:將數(shù)據(jù)轉(zhuǎn)換成一個(gè)標(biāo)準(zhǔn)的形式歸一化也可以說(shuō)是種標(biāo)準(zhǔn)化這里的標(biāo)準(zhǔn)化是指將數(shù)據(jù)縮放到均值為0,標(biāo)注差為1的尺度上。
標(biāo)準(zhǔn)化的意義:體現(xiàn)一個(gè)數(shù)據(jù)與該特征下其他數(shù)據(jù)相對(duì)大小的差距關(guān)系(如:你180,其他同學(xué)都是160,你就會(huì)覺(jué)得你很高;但是全班一半人都是180,其他都是160,你就不會(huì)覺(jué)得自己有多高了。)? ?
# 標(biāo)準(zhǔn)化 # 先f(wàn)it再transform也是可以的 StandardScaler().fit_transform(np.array([1,1,1,1,0,0,0,0]).reshape(-1,1)) StandardScaler().fit_transform(np.array([1,0,0,0,0,0,0,0]).reshape(-1,1))?
?(5)數(shù)值化:把非數(shù)值數(shù)據(jù)(處理起來(lái)不方便)轉(zhuǎn)化為數(shù)值數(shù)據(jù)的過(guò)程。
import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder,OneHotEncoder我們回顧下數(shù)據(jù)的四種類(lèi)型:前三類(lèi)數(shù)據(jù)在使用時(shí),要根據(jù)是否進(jìn)行相關(guān)的運(yùn)算進(jìn)行轉(zhuǎn)換。
定序數(shù)據(jù)的數(shù)值化,可以考慮使用標(biāo)簽化的處理方式。(用0,1,2等值代替原來(lái)的數(shù)據(jù)屬性。各個(gè)值之間相差多大并不重要。有時(shí),定序數(shù)據(jù)都不需要特殊化的處理,都可以交給參數(shù)去做)。也可以使用獨(dú)熱方法進(jìn)行編碼(當(dāng)沒(méi)有相對(duì)大小關(guān)系的時(shí)候)。??
?
# 標(biāo)簽化 LabelEncoder().fit_transform(np.array(["Down","Up","Up","Down"]).reshape(-1,1)) LabelEncoder().fit_transform(np.array(["Low","Medium","High","Medium","Low"]).reshape(-1,1))定位數(shù)據(jù)(沒(méi)有相對(duì)大小關(guān)系的)的處理(麻煩些):直接進(jìn)行標(biāo)簽化,會(huì)有額外的擾動(dòng)這些信息有可能會(huì)影響之后建立模型的準(zhǔn)確性定位數(shù)據(jù)中每種不同的數(shù)值,相互差別應(yīng)該是一致的。將數(shù)據(jù)特征進(jìn)行擴(kuò)維,原來(lái)的?維屬性由?維向量來(lái)表示。這個(gè)向量只有一位是1,其他都是0。
# 在one-hot之前必須先把它label_encoding lb_encoder =LabelEncoder() # 傳入一個(gè)數(shù)組 lb_tran_f = lb_encoder.fit_transform(np.array(["Red","Yellow","Blue","Green"])) # label_encoding的結(jié)果傳入 oht_encoder = OneHotEncoder().fit(lb_tran_f.reshape(-1, 1)) oht_encoder.transform(lb_encoder.transform(np.array(["Yellow","Blue","Green","Green","Red"])).reshape(-1,1)).toarray()?
??(6)正規(guī)化:本質(zhì)是將一個(gè)向量的長(zhǎng)度正規(guī)到單位1。
import numpy as np import pandas as pd from sklearn.preprocessing import Normalizer如果距離的尺度用L1距離,那就是L1正規(guī)化。分子保持向量的分量不變,分母為各個(gè)分量絕對(duì)值的和。
如果使用L2距離(歐式距離),那就是L2正則化。分母是向量的歐式長(zhǎng)度。
例如:
?數(shù)據(jù)處理中正規(guī)化的用法:第一個(gè)用的少;第二個(gè)可以體現(xiàn)出一個(gè)對(duì)象特征影響的相對(duì)關(guān)系特點(diǎn);第三個(gè),可用到線(xiàn)性回歸,邏輯回歸等,可用L2正則化可以表示每個(gè)特征對(duì)于標(biāo)注的影響占比比較大,哪個(gè)比較小。?
# 注意:默認(rèn)是對(duì)行進(jìn)行正則化 Normalizer(norm="l1").fit_transform(np.array([[1,1,3,-1,2]])) Normalizer(norm="l2").fit_transform(np.array([[1,1,3,-1,2]]))?
?
?(3)特征降維?
PCA,奇異值分解都沒(méi)有考慮到標(biāo)注,而是讓特征與特征之間的相關(guān)性強(qiáng)弱來(lái)決定降維后的分布形態(tài),是一種無(wú)監(jiān)督的降維方法。
使用到標(biāo)注的降維方法:?
LDA處理過(guò)程:一個(gè)特征矩陣,特征有X_0-X_m共米個(gè)特征,Y是它的標(biāo)注我們以二分類(lèi)為例,這里的?取0/1同時(shí)這個(gè)特征矩陣有?行,對(duì)應(yīng)于?個(gè)對(duì)象。
特征抽出來(lái)形成個(gè)特征矩陣:
我們把這個(gè)矩陣根據(jù)行進(jìn)行切分,可以分成兩個(gè)子矩陣,一個(gè)矩陣的標(biāo)注都是0,另一個(gè)都是1:
針對(duì)這兩個(gè)子矩陣做線(xiàn)性變換(標(biāo)注y并不參與計(jì)算):
?LDA的核心是標(biāo)注間距離盡可能大,同一標(biāo)注內(nèi)距離盡可能小。所以我們分成兩部分進(jìn)行衡量。
針對(duì)兩個(gè)矩陣可能出現(xiàn)的行列數(shù)據(jù)不匹配的情況,我們可以最大化一個(gè)函數(shù)如下:
用數(shù)學(xué)的方法整理下整個(gè)過(guò)程:我們先計(jì)算每個(gè)標(biāo)注下,每個(gè)特征的均值(是為了運(yùn)算方便);然后最大化一個(gè)函數(shù),這個(gè)函數(shù)要求的變量就是參數(shù)W,其他值都是根據(jù)數(shù)據(jù)指定的,是已知的函數(shù)的分子是兩個(gè)標(biāo)注的子矩陣減均值后再用參數(shù)做變換,然后取平方,再取范數(shù)將其標(biāo)量化;而分母是兩個(gè)新的子矩陣的平方和,然后取范數(shù),可等效(減少運(yùn)算量,并解決兩個(gè)子矩陣尺寸大小不一致的情況【即行不一致,樣本數(shù)量不一致,但特征數(shù)量一致,就保證了中間兩個(gè)矩陣是可以相乘的】)如下形式。
?分子也等效得:
簡(jiǎn)化后如下,最終結(jié)果就是求它取最大時(shí),W的值求出.W,就確定了新的空間下分離程度最大的方向。
例如:右圖為最佳的轉(zhuǎn)化,W確定了中間這條分離線(xiàn)的方向,我們可以對(duì)Wˉˉ進(jìn)行正規(guī)化處理,把正規(guī)化后比較小的W ^表示的分量去掉,保留最大的,最能代表原來(lái)信息的一個(gè)或一些分量,這樣就可以達(dá)到降維的目的。
import numpy as np import pandas as pd from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # X是二維數(shù)組 X=np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]]) # Y是標(biāo)注 Y=np.array([1,1,1,2,2,2]) # n_components=1降成1維 LinearDiscriminantAnalysis(n_components=1).fit_transform(X,Y)# 其實(shí)LDA降維以后我們也可以把它當(dāng)個(gè)判別器(fisher_classifer判別器)來(lái)用 # 賦值到一個(gè)分類(lèi)器上 clf=LinearDiscriminantAnalysis(n_components=1).fit(X,Y) # 輸入的數(shù)據(jù)也一定是二維的 clf.predict([[0.8,1]]) # 我們得到個(gè)分類(lèi)?
(4)特征衍生:現(xiàn)有特征進(jìn)行某些組合,生成新的具有含義的特征。
我們通常采集到的數(shù)據(jù)的特征維度不會(huì)很大,而且直接采集到的特征并不一定能完全體現(xiàn)數(shù)據(jù)的全部信息,需要通過(guò)已有的數(shù)據(jù)組合發(fā)現(xiàn)新的含義。
常用方法:第一,可以求時(shí)間差等;第三,經(jīng)常會(huì)進(jìn)入常識(shí)性特征因素。
例如:某電商網(wǎng)站用戶(hù)購(gòu)買(mǎi)產(chǎn)品的列表
?通過(guò)衍生可以建立起用戶(hù)與商品的一些關(guān)系,這個(gè)思路也是推薦系統(tǒng)中擴(kuò)維的一種主要方法。
?
四,特征監(jiān)控
如果我們建立的模型需要長(zhǎng)期使用,隨著時(shí)間的流逝,可用的數(shù)據(jù)集會(huì)越來(lái)越多,同時(shí)在更多未知情況下,模型的效果可能會(huì)有變化,參數(shù)也可能需要重新矯正,這就需要我們對(duì)模型,對(duì)特征的契合程度進(jìn)行不斷地監(jiān)控。
(1)現(xiàn)有特征:是不是依然對(duì)我們的數(shù)據(jù)任務(wù)有積極的作用。?
(2)新特征:探索新特征是不是有助于對(duì)提高效果或者更能代表我們的數(shù)據(jù)任務(wù)目標(biāo)。
總結(jié):不同的模型需要不同的處理方式。同樣,數(shù)據(jù)分布、數(shù)據(jù)特點(diǎn)不同,不同的處理方式,表現(xiàn)出的效果不同。要多次嘗試,根據(jù)經(jīng)驗(yàn),使用些針對(duì)某些領(lǐng)域比較常用的模型和算法。
?
總結(jié)
以上是生活随笔為你收集整理的python数据分析新手入门课程学习——(五)特征工程概述(数据预处理)(来源:慕课网)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 职场纵横:IT职位全面解析(计算机类要找
- 下一篇: python3 练习题 day02