本文主要介绍基于sklearn的特征提取,旨在为机器学习提供一个好的开端
1.分类特征提取
如上图所示:许多特征如pclass代表乘客船舱等级,分为1,2,3。还有例如性别,乘客登船码头,称之为分类特征。
对于这一类数据的提取,采用one-hot编码。
例如:data数据有两个特征,分别是城市和温度,显然第一个特征为分类特征。
[[ 1. 0. 0. 50.]
[ 0. 0. 1. 40.]
[ 0. 1. 0. 36.]]
data = [{'city':'beijing','tem':50},
{'city':"shanghai",'tem':40},
{'city':"chongqing",'tem':36}]
import sklearn
from sklearn.feature_extraction import DictVectorizer
def dict_demo(): #分类特征提取
data = [{'city':'beijing','tem':50},
{'city':"shanghai",'tem':40},
{'city':"chongqing",'tem':36}]
trans = DictVectorizer(sparse=False)
trans_data = trans.fit_transform(data)
print(trans_data)
if __name__ == "__main__":
dict_demo()
输出结果: 将分类数据用one-hot编码,前边三列为城市特征,后边一列为温度特征
[[ 1. 0. 0. 50.]
[ 0. 0. 1. 40.]
[ 0. 1. 0. 36.]]
输出此时的特征:
print(trans.get_feature_names())
可见下图输出
['city=beijing', 'city=chongqing', 'city=shanghai', 'tem']
因为one-hot编码中0太多了,占用大量储存空间,所以在
trans = DictVectorizer(sparse=False)
去掉sparse=False后即采用稀疏矩阵存储,如下图:
(0, 0) 1.0
(0, 3) 50.0
(1, 2) 1.0
(1, 3) 40.0
(2, 1) 1.0
(2, 3) 36.0
上图通过坐标和数的形式可以存储所有的非零值
2.文本特征提取
对于{"hello everyone! my name is big data! I am 12 years old"},通常根据单词划分特征
from sklearn.feature_extraction.text import CountVectorizer
def count_text():#文本特征提取
ct = CountVectorizer(stop_words=['is','12'])
data = {"hello everyone! my name is big data! I am 12 years old"}
data1 = ct.fit_transform(data)
print(data1.toarray())
print(ct.get_feature_names())
print(data1)
if __name__ == "__main__":
count_text()
输出特征:
['am', 'big', 'data', 'everyone', 'hello', 'my', 'name', 'old', 'years']
输出特征出现次数
[[1 1 1 1 1 1 1 1 1]]