scikit-learn特征抽取的API :sklearn.feature_extraction
作用:对字典数据进行特征值化
类:sklearn.feature_extraction.DictVectorizer
DictVectorizer语法:
代码示例:
from sklearn.feature_extraction import DictVectorizer
def dic_extract(X):
'''
字典特征抽取
:return: None
'''
# 实例化类DictVectorizer
dic = DictVectorizer(sparse=False)
# 调用fit_transform方法输入数据并转换 注意返回格式
data = dic.fit_transform(X)
print(dic.get_feature_names())
print(data)
return None
if __name__ == '__main__':
X = [{
'city': '北京', 'temperature': 100},
{
'city': '上海', 'temperature': 60},
{
'city': '深圳', 'temperature': 30}]
dic_extract(X)
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
作用:对文本数据进行特征值化
注意:文本特征提取不会统计单个字母或汉字
类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer语法:
代码示例:英文文本特征提取
from sklearn.feature_extraction.text import CountVectorizer
def text_extract(X):
'''
文本特征提取
:return: None
'''
# 实例化CountVectorizer
text = CountVectorizer()
# 调用fit_transform方法输入数据并转换
# 注意返回格式,利用toarray()进行sparse矩阵转换array数组
data = text.fit_transform(X)
print(data)
print(text.get_feature_names())
print(data.toarray())
return None
if __name__ == '__main__':
X = ["life is short,i like python" ,
"life is too long,i dislike python"]
text_extract(X)
(0, 2) 1
(0, 1) 1
(0, 6) 1
(0, 3) 1
(0, 5) 1
(1, 2) 1
(1, 1) 1
(1, 5) 1
(1, 7) 1
(1, 4) 1
(1, 0) 1
['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分词
API:jieba.cut
返回值:词语生成器
代码示例:中文文本特征提取
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def text_extract(X):
'''
中文文本特征提取
:return: None
'''
# 实例化CountVectorizer
text = CountVectorizer()
#准备句子,利用jieba.cut进行分词
data = []
for i in range(len(X)):
# print(X[i])
data.append(list(jieba.cut(X[i])))
print(data)
# 将分词结果变成字符串当作fit_transform的输入值
con = []
for i in range(len(data)):
con.append(' '.join(data[i]))
print(con)
cn_text = text.fit_transform(con)
print(text.get_feature_names())
# 注意返回格式,利用toarray()进行sparse矩阵转换array数组
print(cn_text.toarray())
return None
if __name__ == '__main__':
X = ['今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。' ,
'我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。' ,
'如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
text_extract(X)
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
[0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
[1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]
TF-IDF是一个用于信息检索和聚类的词加权方法,给出语料库文档中单词的权重,表示重要性。
TF(item frequency,词频):衡量词在文档中出现的频率。由于文档的长度不同,词在长文中出现次数有可能比在短文中出现的次数多得多。因此,一般会对词频进行归一化,用其除以文档长度或文档的总词数。
IDF(inverse document frequency,逆文档频率):衡量词的重要性。在计算词频时,我们认为所有的词都同等重要。但是某些词(如is、of和that)有可能出现很多次,但这些词并不重要。因此,我们需要减少常见词的权重,加大稀有词的权重。
类:sklearn.feature_extraction.text.TfidfVectorizer
TfidfVectorizer语法
代码示例:
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def tfidf_text_extract(X):
'''
中文文本特征提取
:return: None
'''
# 实例化CountVectorizer
text = TfidfVectorizer()
#准备句子,利用jieba.cut进行分词
data = []
for i in range(len(X)):
# print(X[i])
data.append(list(jieba.cut(X[i])))
print(data)
# 将分词结果变成字符串当作fit_transform的输入值
con = []
for i in range(len(data)):
con.append(' '.join(data[i]))
print(con)
cn_text = text.fit_transform(con)
print(text.get_feature_names())
# 注意返回格式,利用toarray()进行sparse矩阵转换array数组
print(cn_text.toarray())
return None
if __name__ == '__main__':
X = ['今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。' ,
'我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。' ,
'如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
tfidf_text_extract(X)
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0. 0. 0.21821789 0. 0. 0.
0.43643578 0. 0. 0. 0. 0.
0.21821789 0. 0.21821789 0. 0. 0.
0. 0.21821789 0.21821789 0. 0.43643578 0.
0.21821789 0. 0.43643578 0.21821789 0. 0.
0. 0.21821789 0.21821789 0. 0. 0. ]
[0. 0. 0. 0.2410822 0. 0.
0. 0.2410822 0.2410822 0.2410822 0. 0.
0. 0. 0. 0. 0. 0.2410822
0.55004769 0. 0. 0. 0. 0.2410822
0. 0. 0. 0. 0.48216441 0.
0. 0. 0. 0. 0.2410822 0.2410822 ]
[0.15698297 0.15698297 0. 0. 0.62793188 0.47094891
0. 0. 0. 0. 0.15698297 0.15698297
0. 0.15698297 0. 0.15698297 0.15698297 0.
0.1193896 0. 0. 0.15698297 0. 0.
0. 0.15698297 0. 0. 0. 0.31396594
0.15698297 0. 0. 0.15698297 0. 0. ]]
特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据。
数值型数据:
类别型数据:
时间类型:
sklearn特征处理API:sklearn. preprocessing
通过对原始数据进行变换把数据映射到(默认为[0,1])之间。
公式: X ′ = x − min max − min X ′ ′ = X ′ ∗ ( m x − m i ) + m i \quad X^{\prime}=\frac{x-\min }{\max -\min } \quad X^{\prime \prime}=X^{\prime} *(m x-m i)+m i X′=max−minx−minX′′=X′∗(mx−mi)+mi
注:作用于每一列,max为一列的最大值, min为一列的最小值, X" 为最终结果, m x , \mathrm{mx}, mx, mi分别为指定区间值默认mx为1,mi为0
分为两步:1.归一化,2.转换到指定区间
sklearn归一化API:sklearn归一化API: sklearn.preprocessing.MinMaxScaler
MinMaxScaler语法:
代码示例:最大最小化
from sklearn.preprocessing import MinMaxScaler
def min_max(X):
'''
最大最小化
:param X:
:return:None
'''
print(X)
# 实例化
min_max = MinMaxScaler()
# 转换数据
data = min_max.fit_transform(X)
print(data)
if __name__ == '__main__':
X = [[90,2,10,40],
[60,4,15,45],
[75,3,13,46]]
min_max(X)
[[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
[[1. 0. 0. 0. ]
[0. 1. 1. 0.83333333]
[0.5 0.5 0.6 1. ]]
归一化总结:
注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
通过对原始数据进行变换把数据变换到均值为0,方差为1范围内。
公式: X ′ = x − mean σ X^{\prime}=\frac{x-\text { mean }}{\sigma} X′=σx− mean
注: 作用于每一列,mean为平均值, σ \sigma σ 为标准差(考量数据的稳定性)
std成为方差, s t d = ( x 1 − m e a n ) 2 + ( x 2 − m e a n ) 2 + ⋯ n ( 每个特征的样本数 ) − 1 , σ = s t d s t d=\frac{(x 1-m e a n)^{2}+(x 2-m e a n)^{2}+\cdots} {n(\text { 每个特征的样本数 })-1}, \quad \sigma=\sqrt{\mathrm{std}} std=n( 每个特征的样本数 )−1(x1−mean)2+(x2−mean)2+⋯,σ=std
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变。
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
sklearn标准化API:scikit-learn.preprocessing.StandardScaler
StandardScaler语法
代码示例:标准化
from sklearn.preprocessing import StandardScaler
def standard(X):
'''
标准化
:param X:
:return:None
'''
print(X)
# 实例化
stand = StandardScaler()
# 转换数据
data = stand.fit_transform(X)
print(data)
print(stand.mean_, stand.scale_)
if __name__ == '__main__':
X = [[ 1., -1., 3.],
[ 2., 4., 2.],
[ 4., 6., -1.]]
standard(X)
[[1.0, -1.0, 3.0], [2.0, 4.0, 2.0], [4.0, 6.0, -1.0]]
[[-1.06904497 -1.35873244 0.98058068]
[-0.26726124 0.33968311 0.39223227]
[ 1.33630621 1.01904933 -1.37281295]]
[2.33333333 3. 1.33333333] [1.24721913 2.94392029 1.69967317]
标准化总结
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
缺失值处理方法:
sklearn缺失值API: from sklearn.impute import SimpleImputer
SimpleImputer语法
SimpleImputer流程:
1、初始化Imputer,指定”缺失值”,指定填补策略,指定行或列。
注:缺失值也可以是别的指定要替换的值。
2、调用fit_transform。
from sklearn.impute import SimpleImputer
import numpy as np
def miss_values(X):
'''
缺失值填补
:param X:
:return:
'''
print(X)
# 实例化SimpleImputer(missing_values='nan', strategy='mean')
mis_val = SimpleImputer(strategy='mean')
# 转换数据
data = mis_val.fit_transform(X)
print(data)
return None
if __name__ == '__main__':
X = [[1, 2],
[np.nan, 3],
[7, 6]]
miss_values(X)
[[1, 2], [nan, 3], [7, 6]]
[[1. 2.]
[4. 3.]
[7. 6.]]