1. 程式人生 > >資料預處理:原始資料集,特徵數值化,特徵值數值化

資料預處理:原始資料集,特徵數值化,特徵值數值化

原始資料集,特徵數值化

在原始資料集中,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])