2019年4月24日 星期三

機器學習 百日馬拉松 - Day 4. EDA: 欄位的資料類型介紹及處理

Day 4 開始 pandas 的稍為進階操作,還有練習 pandas 的 one-hot-encodiing。
Day4 作業:可參考 my Github - Day_004_HW.ipynb ,內容算是輕鬆的一天!!
以下練習 Pandas 對於 data type 的類型操作:
同 Day 2 Kaggle 上的題目 Home Credit Default Risk 來練習資料的操作。
import os import numpy as np import pandas as pd
# 設定 data_path dir_data = './data/' f_app_train = os.path.join(dir_data, 'application_train.csv') f_app_test = os.path.join(dir_data, 'application_test.csv') app_train = pd.read_csv(f_app_train) app_test = pd.read_csv(f_app_test)
檢視資料中各個欄位類型的數量,透過 pd.info()
app_train.info(memory_usage='deep')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 307511 entries, 0 to 307510
Columns: 122 entries, SK_ID_CURR to AMT_REQ_CREDIT_BUREAU_YEAR
dtypes: float64(65), int64(41), object(16)
memory usage: 540.2 MB
float64 型態的資料有 65 個,int64 型態的資料有 41 個,object 型態的資料有 16 個
記憶體用量為 540.2 MB 。
接著可以透過 value_counts() 可以對 Series 裡面的每個值進行計數並且排序。
app_train.dtypes.value_counts()
float64    65
int64      41
object     16
dtype: int64
可以透過 select_dtypes() 將 DateFrame 裡面有的 dtype 挑出來處理,比如我們現在想針對 “object” 型態的資料處理,如下:
app_train.select_dtypes(include=["object"]).apply(pd.Series.nunique, axis = 0)
NAME_CONTRACT_TYPE             2
CODE_GENDER                    3
FLAG_OWN_CAR                   2
FLAG_OWN_REALTY                2
NAME_TYPE_SUITE                7
NAME_INCOME_TYPE               8
NAME_EDUCATION_TYPE            5
NAME_FAMILY_STATUS             6
NAME_HOUSING_TYPE              6
OCCUPATION_TYPE               18
WEEKDAY_APPR_PROCESS_START     7
ORGANIZATION_TYPE             58
FONDKAPREMONT_MODE             4
HOUSETYPE_MODE                 3
WALLSMATERIAL_MODE             7
EMERGENCYSTATE_MODE            2
dtype: int64
代碼其中的 apply() 可以說是 Pandas 最好用的函數之一,雖然我還不太會用,但是可以看出其自由度很高。
DataFrame.apply(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=(), **kwds)
該函數最有用的是第一個參數,這個參數是函數,相當於 C/C++ 的函數指針。
這個函數需要自己實現,函數的傳入參數根據軸來定,比如軸=0 or ‘index’,就是將函數應用於每個column。軸=1 or ‘columns’,就會將函數應用於每一row。
作業 4 :
練習將 sub_train 做 One-Hot encoding:
sub_train = pd.DataFrame(app_train['WEEKDAY_APPR_PROCESS_START']) print(sub_train.shape) sub_train.head()
(307511, 1)
 WEEKDAY_APPR_PROCESS_START
0 WEDNESDAY
1 MONDAY
2 MONDAY
3 WEDNESDAY
4 THURSDAY
其資料是由星期一到星期日,七個日期組成,如果要表示成one-hot encoding 的話,
星期日:[1,0,0,0,0,0,0];星期一:[0,1,0,0,0,0,0]…類似這樣的概念。
在pandas中,透過 get_dummies() 一行代碼即可做到:
sub_train = pd.get_dummies(sub_train['WEEKDAY_APPR_PROCESS_START']) print(sub_train.shape) sub_train.head()
(307511, 7)
可以看到shape 從 (307511, 1) 變成了 (307511, 7)
one-hot encoding 在 ML&DL 可以說是非常常用到的代碼,之前練習 Deep Learning - Reuters 路透社數據練習 - 多分類問題 就有實際操作練習過!!

沒有留言:

張貼留言