資料預處理:原始資料集,特徵數值化,特徵值數值化
阿新 • • 發佈:2018-12-31
原始資料集,特徵數值化
在原始資料集中,feature是多種多樣的,為了方便處理,我們必須把feature數值化,而且還需要把特徵值數值化。
示例:
x=[[黃色,小,成人,用手打]
,[黃色,小,成人,用腳踩]
,[黃色,小,小孩,用手打]
,[黃色,小,小孩,用腳踩]
,[黃色,大,成人,用手打]
,[黃色,大,成人,用腳踩]
,[黃色,大,小孩,用手打]
,[黃色,大,小孩,用腳踩]
,[紫色,小,成人,用手打]
,[紫色,小,小孩,用手打]
,[紫色,大,成人,用腳踩]
,[紫色,大,小孩,用腳踩]
]
y = [不爆炸,爆炸,不爆炸,不爆炸,爆炸,爆炸,不爆炸, 爆炸,不爆炸,不爆炸,爆炸,爆炸]
feature數值化,直接是一個數據的下標ID就可以了。
featureValue數值化,為了實現featureValue數值化,我們必須建立(feature,featureValue):featureValue編碼 的字典
可見上述資料x為:資料數量*feature數量
注意我們這裡沒有使用numpy特徵數值化,使用python比較方便。
為了簡便解釋feature數量為n,資料數量為N
將資料轉置,這樣得到的資料為:feature數量n*資料數量N,這樣每一行就對應了某一個feature的N個取值
# 將輸入的向量轉置
features = map(list,zip(*x))
每一行就對應了某一個feature的N個取值,這個就是我們編碼的物件,我們需要確定每一個feature有多少個取值,set就去掉了重複,就得到的矩陣為:feature數量n*每一個feature取值的數量m
# 獲取的是每一個feature的取值
features = [set(feat) for feat in features]
下面是編碼,_對應的是 feature取值,i對應的是這個feature取值的編碼,比如黃色是0,紫色是1,小是0,大是1,這樣得到的是二維陣列:feature數量n*feature取值的數量m,這個字典就是:(feature,featureValue):featureValue編碼,比如features[顏色][黃色] =0
# feat_dics[第幾個feature][這個feature的取值] = 這個feature的取值對應的數值化ID
feat_dics = [{_:i for i,_ in enumerate(feats)} for feats in features ]
label_dic = {_:i for i,_ in enumerate(set(y))}
得到(feature,featureValue):featureValue編碼的字典之後,就需要對原始資料編碼,我們需要按照(feature,featureValue)這個pair索引來編碼。
原始資料為:資料數量N*feature數量n,一行一行的讀取,就是一個數據的n個featureValue,這個就和索引對上了,每一個featureValue都能找到對應的編碼了。
# 利用字典轉換更新資料集
# 這裡可能有點難以理解,自己舉個例子就能明白
# feat_dics每一行代表一個feature緯度
# 每一行裡裝的是:這個feature的取值:數值化這個feature的取值
# 原始x每一行[feature1,feature2..],遍歷它,就是第幾個feature
x = np.array([[feat_dics[i][_] for i,_ in sample] for sample in x])
y = np.array([label_dic[yy] for yy in y])