iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 7
1
AI & Data

Python機器學習介紹與實戰系列 第 7

DAY[7]-數據前處理(2) 補值與EDA(1)

EDA是什麼?

EDA是探索式資料分析(Explore Data Analysis)的簡稱,主要邏輯是利用分群、圖片等等的技巧,觀察資料之間的關係(相關係數、分布狀況)等等,是機器學習相當重要的一個步驟,今天我們就延續昨天的diabete資料集來觀察一下資料狀況吧!

匯入視覺化套件

import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno # 將遺失值視覺化

延續昨日的資料繼續實作,我們已經將性別資料先處理至我們希望的1、0兩種,在此處我們並不急著實作昨日所提到的ont-hot enconing,因為最後可以把所有類別量尺同時執行這個操作。

這裡我會先執行的是補值操作,由於玩具資料集完全沒有缺失值,我會先隨機刪除部分的資料來模擬有缺失值的狀況,

sample = df.sample(50) # 抽樣50筆
random = np.random.randint(2,10,50) # 行抽樣
for i,j in enumerate(random): 
  df.iloc[sample.index[i],j] = np.nan # 取代資料成nan

缺失值
由於刪除過程是全隨機的,因此不用在意缺失狀況與教學的答案有所不同。

接著使用missingno套件來觀察缺失值的狀況

msno.matrix(df)

缺失值2

缺失值的3種處理

  1. 直接刪除該筆資料(不推薦)
    適用資料較多缺失值較少,並且補值困難的數據集。
  2. 補值
    適用大多數狀況,但補值不夠精確容易導致資料的特徵被扭曲。
  3. 直接不使用該行(column)
    在行數較多的時候可以選擇使用,通常用於行中有著大量缺失值的狀況,但會減少特徵數量,使用上仍需要注意。

從上圖可以看到缺失值的狀況較為分散,因此在處理上我們可以選擇前兩種方式,但是此資料集僅有442筆數據,我們會希望盡量保留更多的特徵因此選擇補值。

實務上補值非常沒有規則,補平均、0、中位數都可以說是合理的,在這個資料集中示範的補值在不同場合會失效,這部分需要讀者多多觀察不同的資料集,並且了解該行的特徵屬性才能精確的補到適當的數值。

df.fillna(0) # 僅回傳補完0的df但並沒有真的修改值!
df.loc[:,"bmi"] = df.loc[:,"bmi"].fillna(df.loc[:,"bmi"].median()) # 將bmi空值補bmi的中位數
df = df.fillna(0) # 將df所有空值補值並指派

接著我們可以使用pandas內建的相關係數計算以及seaborn結合,來繪製出相關係數矩陣的熱度圖(heatmap)。

corr = df.corr() # 產生相關係數矩陣
sns.heatmap(corr)

熱度圖
由熱度圖我們可以很快速地察覺出不同變數之間的關係,尤其在s3有著最明顯的負相關,快速的預覽資料可以幫助我們挑選特徵,我們將預測目標加入之後再看一次相關係數。

df2 = df.join(pd.Series(data.target,name="answer")) #為了避免動到原始資料 新建df2
corr2 = df2.corr()
plt.figure(figsize=(10,8)) # 調整圖片大小
sns.heatmap(corr2,cmap="PuOr") # 繪製熱度圖並將顏色設定為PuOr

熱度圖2

我們可以看到bmi與s3對於預測目標是較有關係的,性別在此處由於尚未執行one-hot encoding,並不能當作正常的數值參考。

在此例中因為特徵數量較少,我們並不會做特徵的刪除,但在實務使用上可能會有些特徵相關性為0,可以視情況調整掉特徵數量加速模型的收斂。


上一篇
DAY[6]-數據前處理(1) 資料類型與資料操作
下一篇
DAY[8]-數據前處理(2) 補值與EDA(2)
系列文
Python機器學習介紹與實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言