Python机器学习--KNN归一化、距离的惩罚
1. 歸一化
1.1 距離類模型歸一化的需求
什么是歸一化呢?我們把X放到數(shù)據(jù)框中來(lái)看一一眼, 你是否觀察到,每個(gè)特征的均值差異很大?有的特征數(shù)值很大。有的特征數(shù)值很小,這種現(xiàn)象在機(jī)器學(xué)習(xí)中被稱為"星綱不統(tǒng)一"。 NN是距離類模型,歐氏距離的計(jì)算公式中存在若特征上的平方和:
試想看看,如果某個(gè)特征x的取值非常大,其他特征的取值和它比起來(lái)都不算什么,那距離的大小很大程度上都會(huì)由這個(gè)巨大特征x來(lái)決定,其他的特征之間的距離可能就無(wú)法對(duì)d(A,B) 的大小產(chǎn)生什么影響了,這種現(xiàn)象會(huì)讓KNN這樣的距離類模型的效果大打折扣。然而在實(shí)際分析情景當(dāng)中,絕大多數(shù)數(shù)據(jù)集都會(huì)存在各特征值量綱不同的情況,此時(shí)若要使用KNN分類器,則需要先對(duì)數(shù)據(jù)集進(jìn)行歸一化處理, 即是將所有的數(shù)據(jù)壓縮都同一個(gè)范圍內(nèi)。
1.2 preprocessing.MinMaxScaler
當(dāng)數(shù)據(jù)(x) 按照最小值中心化后,再按極差(最大值最小值)縮放,數(shù)據(jù)移動(dòng)了最小值個(gè)單位,并且會(huì)被收斂到[0,1]之間,而這個(gè)過(guò)程,就稱作數(shù)據(jù)歸一化(Normalization, 又稱Min-Max Scaling)
在sklear當(dāng)中,我們使用preprocessing.MinMaxScaler來(lái)實(shí)現(xiàn)這個(gè)功能。MinMaxScaler有 一個(gè) 重要參數(shù),feature. range, 控制我們希望把數(shù)據(jù)壓縮到的范圍,默認(rèn)是[0, 1]。
1.3 先分?jǐn)?shù)據(jù)集,再做歸一化!
最初的時(shí)候,為了讓大家能夠最快地看到模型的效果變化,這里直接在全數(shù)據(jù)集X上進(jìn)行了歸一化,然后放入交叉驗(yàn)證繪制學(xué)習(xí)曲線,這種做法是錯(cuò)誤的,只是為了教學(xué)目的方便才這樣操作。真正正確的方式是,先分訓(xùn)練集和測(cè)試集,再歸一化!
為什么呢?想想看歸一化的處理手段, 我們是使用數(shù)據(jù)中的最小值和極差在對(duì)數(shù)據(jù)進(jìn)行壓縮處理,如果我們?cè)谌珨?shù)據(jù)集上進(jìn)行歸一化,那最小值和極差的選取是會(huì)參考測(cè)試集中的數(shù)據(jù)的狀況的。因此,當(dāng)我們歸一化后,無(wú)論我們?nèi)绾畏指顢?shù)據(jù),都會(huì)由一部分測(cè)試集的信息被"泄露”給訓(xùn)練集(當(dāng)然,也有部分訓(xùn)練集的信息被泄露給了測(cè)試集,但我們不關(guān)心這個(gè)), 這會(huì)使得我們的模型效果被高估。在現(xiàn)實(shí)業(yè)務(wù)中,我們只知道訓(xùn)練集的數(shù)據(jù),不了解測(cè)試集究竟會(huì)長(zhǎng)什么樣,所以我們要利用訓(xùn)練集.上的最小值和極差
來(lái)歸一化測(cè)試集。
1.4 實(shí)現(xiàn)歸一化
# 歸一化 from sklearn.preprocessing import MinMaxScaler data = [[-1,2],[-0.5,6],[0,10],[1,18]] # 如果換成表是什么樣子? d = pd.DataFrame(data) d # 實(shí)現(xiàn)歸一化 scaler = MinMaxScaler() scaler.fit(d) scaler.transform(d)
或者
2.距離的懲罰
2.1 以距離作為懲罰因子的優(yōu)化
用最近鄰點(diǎn)距離遠(yuǎn)近修正在對(duì)未知分類過(guò)程中,“- 點(diǎn)一票”的規(guī)則是KNN模型優(yōu)化的一個(gè)重要步驟。也就是說(shuō),對(duì)于原始分類模型而言,在選取最近的k個(gè)元素之后,將參考這些點(diǎn)的所屬類別,并對(duì)其進(jìn)行簡(jiǎn)單計(jì)數(shù),而在計(jì)數(shù)的過(guò)程中這些點(diǎn)“一 點(diǎn)-票”,這些點(diǎn)每個(gè)點(diǎn)對(duì)分類目標(biāo)點(diǎn)的分類過(guò)程中影響效力相同。但這實(shí)際上是不公平的,就算是最近鄰的k個(gè)點(diǎn),每個(gè)點(diǎn)的分類目標(biāo)點(diǎn)的距離仍然有遠(yuǎn)近之別,而近的點(diǎn)往往和目標(biāo)分類點(diǎn)有更大的可能性屬于同一類別(該假設(shè)也是KNN分類模型的基本假設(shè))。因此,我們可以選擇合適的懲罰因子,讓入選的k個(gè)點(diǎn)在最終判別目標(biāo)點(diǎn)屬于某類別過(guò)程發(fā)揮的作用不相同,即讓相對(duì)較遠(yuǎn)的點(diǎn)判別效力更弱,而相對(duì)較近的點(diǎn)判別效力更強(qiáng)。這一點(diǎn)也可以減少KNN算法對(duì)k取值的敏感度。
2.2 重要參數(shù): weights
關(guān)于懲罰因子的選取有很多種方法,最常用的就是根據(jù)每個(gè)最近鄰x;距離的不同對(duì)其作加權(quán),加權(quán)方法為設(shè)置w;權(quán)
重,該權(quán)重計(jì)算公式為:
這里需要注意的是,關(guān)于模型的優(yōu)化方法只是在理論上而言進(jìn)行優(yōu)化會(huì)提升模型判別效力,但實(shí)際應(yīng)用過(guò)程中最終能否發(fā)揮作用,本質(zhì)上還是取決于優(yōu)化方法和實(shí)際數(shù)據(jù)情況的契合程度,如果數(shù)據(jù)本身存在大量異常值點(diǎn),則采用距離遠(yuǎn)近作為懲罰因子則會(huì)有較好的效果,反之則不然。因此在實(shí)際我們進(jìn)行模型優(yōu)化的過(guò)程當(dāng)中,是否起到優(yōu)化效果還是要以最終模型運(yùn)行結(jié)果為準(zhǔn)。
在sklearn中,我們可以通過(guò)參數(shù)weights來(lái)控制是否適用距離作為懲罰因子。
結(jié)果
12 0.9648657040832169總結(jié)
以上是生活随笔為你收集整理的Python机器学习--KNN归一化、距离的惩罚的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python的scikit-learn算
- 下一篇: Python机器学习---KNN模型评价