[機器學習]-[數據預處理]-中心化 縮放 KNN(一)

據預處理是總稱,涵蓋了數據分析師使用它將數據轉處理成想要的數據的一系列操做。例如,對某個網站進行分析的時候,可能會去掉 html 標籤,空格,縮進以及提取相關關鍵字。分析空間數據的時候,通常會把帶單位(米、公里)的數據轉換爲「單元性數據」,這樣,在算法的時候,就不須要考慮具體的單位。數據預處理不是憑空想象出來的。換句話說,預處理是達到某種目的的手段,而且沒有硬性規則,通常會跟根據我的經驗會造成一套預處理的模型,預處理通常是整個結果流程中的一個環節,而且預處理的結果好壞須要放到到整個流程中再進行評估。html

本次,只使用縮放數值數據來講明預處理的重要性,數值數據:值包含數字,縮放:使用基本的運算來改變數據的範圍。最後,將會使用真實的數據來演示縮放預處理提高告終果。
首先,簡單說一下機器學習和 KNN(k-Nearest Neighblors)的分類問題,分類問題是他們裏面最簡單的算法。爲了體現縮放數據的重要性,還會介紹模型評估方式和訓練集、測試集的概念。這些概念和操做都會在分類紅酒質量的時演示。演示的時候會看到預處理先後對結果的影響。

機器學習分類問題簡介

分類和標記問題是一個們古老的藝術。好比,亞里士多德構建的生物分類系統。如今,分類通常都是做爲機器任務任務的一個通用框架,特別是監督學習。監督學習的基本概念也不復雜,這樣的數據中包含預測參數和預測目標結果,監督學習的目標是構建善於經過給出的預測參參數預測目標結果的模型。若是目標結果包含分類信息(如,‘good’,'bad'),這就是所說分類學習任務。若是目標結果是不斷變化的,這就是一個迴歸任務。
介紹一個有用的數據集:心臟病數據集,其中有 75 個預測參數,如,‘age’,‘sex’以及目標結果,心臟病患病機率範圍是0(無病)-4。對這個數據集的大部分分析集中在預測是否出現心臟病。這就是一個分類任務。若是是預測0-4的實際值,那麼,就是迴歸問題。之後再討論迴歸問題。此次主要討論分類任務重最簡單的算法,KNN。

機器學習的 KNN 分類

假設已經有一些標記好的數據,例如,包含紅酒特徵的數據,預測參數:alcohol content, density, amount of citric acid, pH,目標結果:Quality(good,bad)。而後,使用特徵的新數據,沒有標記結果,分類任務就是去預測結果 Quality。若是全部的預測參數都是數值,咱們就能夠想象一個 n 爲空間,每行/紅酒做爲空間中的一個點。KNN 是概念和計算都很簡單的分類方法,咱們計算這些沒有標記的數據行,在 n 維空間中,最近的 K 個已經標記過的鄰居。而後,根據這 K 個鄰居的標籤,good 或 bad,再將命中率最高(佔比最高)的標籤值給新的預測數據(例如,若是 K=10,其中 7 個 good,3 個 bad,結果就是 good)。注意,這裏沒有 fit 參數。
   

圖說 K 鄰近

下面是 KNN 的一個 2D 圖。思考一下,中間綠色問好的點應該如何分類。若是 K = 5,分類就是藍色,,若是 k = 10 ,結果又如何呢?
 
 
Scikit Learn KNN
咱們接下來看一下 KNN 的例子。咱們將紅酒質量數據集加載到 pandas 的 DataFrame 中,而後經過直方圖看下數據基本信息
咱們看下這兩個預測變量,free sulfur dioxide 的範圍 1-72,volatile acidity 的範圍是 0.12-1.58。簡單的說就是,前一個的的範圍和數量級都比後一個大不少。像 KNN 這樣的算法,關心的是兩個數據點之間的距離,所以,算法可能會將關注點直接放在範圍更範圍的變量上,這樣就會對範圍小的變量不公平,像 free sulfur dioxide 可能還會有噪點,這樣的數據必然會致使結果準確度有所下降。這就是爲何要縮放咱們即將使用的數據。
如今目標結果就是紅酒的‘Quality’率,它的範圍是 3 到 8。簡單起見,將這個範圍轉換爲二分類,大於 5 -> good,小於等於 5 -> bad。下面用直方圖說明一下二分類先後目標結果的變化:
 
接下來咱們就準備執行 KNN。咱們本次的目的是比較咱們的模型在有無縮放處理的狀況下的結果優劣,既然要區分結果的優劣咱們就須要一個評價標準。
 

如何評價 KNN 結果

有不少對分類的評價方式/指標,最終重要的是,要認識到方式/指標的選擇是一個頗有深度的領域,而且須要具體問題具體分析。對於平衡類(目標結果,要麼是是,要麼是否)數據集,一般將準確性做爲評價標準。事實上,在 scikit learn 中 KNN 和邏輯迴歸默認評分方法就是精度。那麼,什麼是精度呢?它就是正確預測的數量除以預測的總數:
Accuracy = 正確預測數量/預測總數
 

KNN 的使用和訓練測試的分割

咱們就使用上面介紹的江都做爲衡量的標準,若是咱們把先有的數據都做爲訓練模型用,咱們應該用什麼數據集來做爲計算精度的數據呢?咱們須要一個能很好推廣到新數據的模型。也就是說,若是咱們在數據集 A 上訓練模型,也使用數據集 A 計算精度,那麼得出的結果遠遠好於實際結果。這就是咱們常說的過擬合。爲了解決這個問題,一般會選取數據集中的一部分做爲訓練集,而後,在訓練集上訓練模型,再使用剩下的數據集進行評估。咱們也是要這麼作的。通常的經驗規則是使用大約 80% 的數據用於訓練,剩下 20% 的數據用於測試。如今咱們就能夠分析紅酒質量數據了:
 
如今我構建 KNN 模型,對測試集進行預測,爲了評估模型,咱們須要對比預測值和真實值:
在 scikit learn 中精度是 KNN 的默認評分方法,精度的結果是 61%,這個結果並很差,但對於沒有任何預處理的結果來講,也並非太壞。
 
預告 [數據預處理]-中心化 縮放 KNN(二)
使用其餘的評估方法(reacll,f1)從新評估結果
使用預處理將精度結果再提升 10% 左右
完整的代碼
 
 
最後謝謝  @K戰神 反饋關於圖裂的問題,現已經編輯好
相關文章
相關標籤/搜索