Python中如何基于特征列表为数据集样本生成特征向量
特征向量生成方案
有现成的Python库可以实现该需求,也可以用原生Python无依赖实现,两种方案如下:
方案1:使用scikit-learn库实现(推荐)
scikit-learn提供的MultiLabelBinarizer工具就是专门用于多标签二值化的,完全匹配你的需求,适合批量处理大量样本,性能更优。
示例代码:
# 没有安装的话先执行 pip install scikit-learn from sklearn.preprocessing import MultiLabelBinarizer # 定义全量特征总集,固定向量的维度和顺序 features = ['a', 'b', 'c', 'd', 'e', 'f'] mlb = MultiLabelBinarizer(classes=features) s1 = ['a', 'b', 'c'] s2 = ['a', 'c', 'f'] # 生成对应向量,tolist()可将numpy数组转为原生列表 r1 = mlb.transform([s1])[0].tolist() r2 = mlb.transform([s2])[0].tolist() print(r1) # 输出:[1, 1, 1, 0, 0, 0] print(r2) # 输出:[1, 0, 1, 0, 0, 1] # 批量处理多个样本可直接传样本列表 batch_result = mlb.transform([s1, s2]).tolist()
方案2:原生Python实现(无第三方依赖)
如果不想引入额外的第三方库,自己写实现逻辑也非常简单,通过字典映射特征对应位置即可:
# 定义全量特征总集,生成特征到索引的映射关系 features = ['a', 'b', 'c', 'd', 'e', 'f'] feat_index_map = {feat: idx for idx, feat in enumerate(features)} def generate_vector(sample): # 初始化全0向量 vector = [0] * len(features) for feat in sample: # 过滤总集外的异常特征,不需要的话可以去掉判断 if feat in feat_index_map: vector[feat_index_map[feat]] = 1 return vector s1 = ['a', 'b', 'c'] s2 = ['a', 'c', 'f'] r1 = generate_vector(s1) r2 = generate_vector(s2) print(r1) # 输出:[1, 1, 1, 0, 0, 0] print(r2) # 输出:[1, 0, 1, 0, 0, 1]
内容的提问来源于stack exchange,提问作者Jack Qiao
相关产品推荐
相关产品推荐

