特征抽取:对文本等数据进行特征值化,特征抽取是为了计算机更好理解数据。
特征抽取的API:sklearn.feature_extraction
作用:对字典数据进行特征化,把字典中一些类别数据,分别进行转换成特征。
from sklearn.feature_extraction import DictVectorizer
# 实例化DictVectorizer, sparse = False意味着返回格式不为sparse矩阵, 为ndarray类型
dict = DictVectorizer(sparse = False)
# 调用fit_transform转换
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
# 打印出类别名称
print(dict.get_feature_names())
print(data)
# 输出结果
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
One-hot 编码
普通编码:
Sample | Category | Numerical |
---|---|---|
1 | Human | 1 |
2 | Human | 1 |
3 | Penguin | 2 |
4 | Octopus | 3 |
5 | Alien | 4 |
6 | Octopus | 3 |
7 | Alien | 4 |
这里利用1、2、3、4进行编码可能会存在优先级问题,One-hot编码解决了这个问题。
One-hot编码:
Sample | Human | Penguin | Octopus | Alien |
---|---|---|---|---|
1 | 1 | 0 | 0 | 0 |
2 | 1 | 0 | 0 | 0 |
3 | 0 | 1 | 0 | 0 |
4 | 0 | 0 | 1 | 0 |
5 | 0 | 0 | 0 | 1 |
6 | 0 | 0 | 1 | 0 |
7 | 0 | 0 | 0 | 1 |
作用:对文本数据进行特征化,常用于文本分类,情感分析等。
处理英文文本
from sklearn.feature_extraction.text import CountVectorizer
# 实例化CountVectorizer
cv = CountVectorizer()
# 调用fit_transform转换
data = cv.fit_transform(["life is short,I like python", "life is too long,I dislike python"])
# 打印出类别名称
print(dict.get_feature_names())
print(data.toarray()) # 将sparse转换成ndarray
# 输出结果
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
由结果可看成以下几点:
处理中文文本
处理中文文本之前首先需要进行分词处理(利用jieba包)
# 分词处理
import jieba
content1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
content2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
# 转换为列表
cont1 = list(c1)
cont2 = list(c2)
# 把列表转换成字符串
c1 = ' '.join(con1)
c2 = ' '.join(con2)
# 中文文本特征值化
cv = CountVectorizer()
data = cv.fit_transform([c1, c2])
print(cv.get_feature_names())
print(data.toarray())
主要思想:若某个词或短语在一篇文章中出现概率高,且在其他文章中很少出现,则认为此词或短语具有更好的类别区分能力,适合用来分类
作用:用以评估一字词对于一个文件集或者一个语料库的其中一份文件的重要程度
from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer()
data = tf.fit_transform(["life is short,I like python", "life is too long,I dislike python"])
print(tf.get_feature_names())
print(data.toarray())
特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据
特征处理的API:sklearn.preprocessing
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式: X ′ = x − m i n m a x − m i n , X ′ ′ = X ′ ∗ ( m x − m i ) + m i X^{'} = \frac{x-min}{max-min},\ X^{''}=X^{'}*(mx-mi)+mi X′=max−minx−min, X′′=X′∗(mx−mi)+mi
注:作用于每一列,max为一列最大值,min为一列最小值, X ′ ′ X^{''} X′′为最终结果,mx, mi分别为指定区间默认mx为1,mi为0.
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,40]])
print(data)
注:
特点:通过对原始数据进行变换把数据变换到均值为0,方差为1的范围内
公式: X ′ = x − m e a n σ X'=\frac{x-mean}{\sigma} X′=σx−mean
注:作用于每一列,mean为平均值, σ \sigma σ为标准差,var称为方差, v a r = ( x 1 − m e a n ) 2 + ( x 2 − m e a n ) 2 + . . . n var=\frac{(x_1-mean)^2+(x_2-mean)^2+...}{n} var=n(x1−mean)2+(x2−mean)2+..., σ = v a r \sigma=\sqrt{var} σ=var
from sklearn.preprocessing import StandardScaler
std = StandardScaler()
data = std.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,40]])
print(data)
缺失值的处理方法
删除 | 若每列或行数据缺失值达到一定的比例,建议放弃整行或整列 |
插补 | 可以通过缺失值每行或每列的平均值、中位数来填充 |
sklearn缺失值API: sklearn.preprocessing.Imputer
from sklearn.preprocessing import Imputer
im= Imputer()
data = im.fit_transform([[1,2],[np.nan,3],[3,1]])
print(data)
关于np.nan(np.NaN)
1、numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型
2、如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可