## 關于ExtraSensory 數(shù)據(jù)集的分析過程
> 在這一周的學習當中著蟹,我進行對UCSD的傳感器數(shù)據(jù)集進行了分析和學習结榄,我對我學習和嘗試的過程中贝,進行復盤
我們首先先從需要解決的問題入手:?
- 我們需要對數(shù)據(jù)進行了解和清洗?
- 清洗完成后我們需要對其做一個分類的問題
## 觀察數(shù)據(jù)
根據(jù)官網(wǎng)的描述,我們得知如下:
ExtraSensory 數(shù)據(jù)集由 UCSD 下 Yonatan Vaizman 和 Katherine Ellis 收集臼朗, 由手機 APP --the
ExtraSensory App進行收集邻寿,收集的信息為手機各類傳感器的數(shù)據(jù)和此時的人體狀態(tài)等一些數(shù)據(jù)。
該數(shù)據(jù)集有 60個'csv.gz'文件视哑,文件的命名格式為[UUID].features_label.csv.gz绣否。 UUID為每個用戶獨有的 ID, 使用 gzip 進行壓縮挡毅。
我們打開其中一個UUID為 1155FF54-63D3-4AB2-9863-8385D0BD0A13 的單個數(shù)據(jù)集
進行分析
我們對其進行具體的觀察蒜撮,我們得知在該數(shù)據(jù)集中以timestamp作為主鍵進行排序,擁有221個feature慷嗜,和51個label淀弹,和一個sourelabel(此不作為label進行學習)
我當時第一個想法是將csv文件讀入后,將timestamp庆械、feature、label三部分進行劃分菌赖,單獨取出來?
```
# parse_header_of_csv函數(shù)將feature和label進行區(qū)分歸類
# parse_body_of_csv函數(shù)將feature和label的具體數(shù)據(jù)進行分割存儲
# read_user_data函數(shù)將csv文件讀入
def parse_header_of_csv(csv_str):
? ? headline = csv_str[:csv_str.index('\n')]
? ? column = headline.split(",")
? ? # 進行assert測試
? ? assert column[0] == 'timestamp'
? ? assert column[-1] == 'label_source'
? ? # 找到label開始的位置
? ? for (ci,col) in enumerate(column):
? ? ? ? if col.startswith("label:"):
? ? ? ? ? ? first_start_lind = ci
? ? ? ? ? ? break
? ? ? ? pass
? ? feature_names = column[1:first_start_lind]
? ? label_names = column[first_start_lind:-1]
? ? ##去除多余無效的字符
? ? for (li,label) in enumerate(label_names):
? ? ? ? # assert
? ? ? ? assert label.startswith("label:")
? ? ? ? label_names[li] = label.replace('label:',"")
? ? ? ? pass
? ? return (feature_names, label_names)
def parse_body_of_csv(csv_str,n_feature):
? ? full_body = np.loadtxt(StringIO(csv_str),delimiter=',',skiprows=1)
? ? # 數(shù)據(jù)的主鍵為timestamp
? ? timestamps = full_body[:,0].astype(int)
? ? # 將特征和標簽分開,前面的是特征即傳感器
? ? X = full_body[:,1:(n_feature+1)]
? ? #分離出所有l(wèi)abel數(shù)據(jù)
? ? trinary_labels_mat = full_body[:,(n_feature+1):-1]
? ? M = np.isnan(trinary_labels_mat)# 將其進行判斷有哪些是nan值
? ? Y = np.where(M,0,trinary_labels_mat)>0.## 進行判斷哪里有Nan值則將其轉化為0缭乘,則保留原來的數(shù)值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ##并將其轉化為布爾值
? ? return (X,Y,M,timestamps)
# 輸出feature數(shù)據(jù)矩陣X,label數(shù)據(jù)矩陣Y琉用,label的缺失數(shù)據(jù)分布矩陣M堕绩,feature_names,label_names? ?
def read_user_data(uiud):
? ? user_data_file = '%s.features_labels.csv.gz'%uuid
? ? with gzip.open(user_data_file,'r') as fid:
? ? ? ? csv_str = fid.read()
? ? ? ? csv_str = csv_str.decode(encoding = 'utf-8')
? ? ? ? pass
? ? (feature_names,label_names) = parse_header_of_csv(csv_str)
? ? n_feature = len(feature_names)
? ? (X,Y,M,timestamps) = parse_body_of_csv(csv_str, n_feature)
? ? return (X,Y,M,timestamps,feature_names,label_names)
```
在這段代碼中,主要有三個函數(shù)?
def read_user_data(uiud)讀入用戶數(shù)據(jù)邑时,并且其中將讀取數(shù)據(jù)的過程再次抽離出兩個函數(shù)進行抽象奴紧。分別是:parse_header_of_csv()、 parse_body_of_csv().
> 值得注意的是在這里晶丘,我們使用的Python黍氮,Python在IO輸入的時候和Python2有所不同,我們進行讀取之后需要對其進行decode()操作浅浮,encoding為utf-8
parse_header_of_csv(csv_str)函數(shù):由于我們直接將csv文件整個進行輸入沫浆,所以我們直接將其作為一個大的str進行分析,我們通過判斷\n的位置滚秩,進行對heading(column)的截取专执。為了更為嚴謹,我們在其中插入了assert函數(shù)進行判斷郁油,截取之后再使用enumerate對column進行從新標號本股,判斷l(xiāng)abel開始的位置攀痊,得到位置之后在依舊使用enumrate對其進行分析,對label標簽進行處理拄显,return (feature_names, label_names)
parse_body_of_csv(csv_str,n_feature)函數(shù):我們使用使用numpy中的loadtxt進行讀取蚕苇,以StringIo進行讀取,在將feature和label進行分割凿叠。
```?
? ? #分離出所有l(wèi)abel數(shù)據(jù)
? ? trinary_labels_mat = full_body[:,(n_feature+1):-1]
? ? M = np.isnan(trinary_labels_mat)# 將其進行判斷有哪些是nan值
? ? Y = np.where(M,0,trinary_labels_mat)>0.
? ? ##進行判斷哪里有Nan值則將其轉化為0涩笤,則保留原來的數(shù)值
? ? ##并將其轉化為布爾值
```
由上我們得到狀態(tài)存在矩陣M,同時使用where函數(shù)對其進行從新置換。