原始数据集,特征数值化
在原始数据集中,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])