1.特征抽取
①字典特征抽取
from sklearn.feature_extraction import DictVectorizer
def dictvec():
list=[{'city':'北京','temperature':100},{'city':'上海','temperature':80},{'city':'广州','temperature':20}]
dict=DictVectorizer() //这里有个参数 如果不想输出为sparse矩阵可以dict=DictVectorizer(sparse=False)进行输出为数组的形式
data=dict.fit_transform(list)
print(data)
返回的数据格式:sparse矩阵
就是下面这个数组的描述 有值的描述((0,1)就表示在下面的数组中第0行第1列的值为1表示代表为“北京”)
②文本特征抽取
统计文本出现次数
可以用于文本分类 情感分析
这个对单个字符没有进行统计
对于英文不需要进行数据提前处理,但是**中文需要提前进行分词处理**(jieba分词)
```
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def countvec():
list=["life is short,i like python","life is too long,i dislike python"]
cv=CountVectorizer()
data=cv.fit_transform(list)
print(cv.get_feature_names())
print(data.toarray())
```
中文分词处理
主要是利用jieba
```
import jieba
def cutwords(list1):
result=[]
for words in list1:
word=jieba.cut(words)
word_list=list(word)
result.append(' '.join(word_list))
return result
```
TF-IDF方法
如果一个词在一篇文章中出现频率较高,而在别的文章中出现频率不高 那这些词可以很好的用来分类
tf:term frequency 词的频率
idf:inverse document frequency 逆文档频率 log(总文档数量/该词出现的文档数量)
重要性程度:tf*idf
```
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def tfidfvec():
list=["我爱场景,是的","这里是华南理工大学外语调频台","我是张海玲代号小饼干","小明硕士毕业于中国科学院计算所,后在日本京都大学深造"]
result_list=cutwords(list) # 分词之后的结果
# print(result_list)
tf = TfidfVectorizer()
data = tf.fit_transform(result_list) # 将分词之后的结果输入到transform中
print(tf.get_feature_names())
print(data.toarray())
```
2.特征预处理
通过一些数学方法将数据转成算法需要的数据
数值型数据:
1.归一化(不太常用)、2.标准化(比较常用)、3.缺失值
**缩放目的:使得一个特征对最终结果不会造成较大的影响**
归一化
通过对原始数据进行变换把数据映射到默认0到1之间
$$
x'=(x-min)/max-min
$$
$$
x''=x'*(mx-mi)+mi
$$
x''为最终归一化的结果,max表示一列中最大的数,min表示一列中最小的数,mx表示想映射的区间的最大值,mi表示想映射区间的最小值
归一化的**目的**:**使得一个特征对最终结果不会造成较大的影响**
比如有一个特征的值都是较大的数,如果直接用原始数据进行算法计算的话,会造成这些较大的数对最终结果产生较大的影响
缺点:在特定场景下最大值和最小值是变化的,而且最大值和最小值很容易受**异常点**的影响。鲁棒性较差,只适合传统精确小数据场景
```
from sklearn.preprocessing import MinMaxScaler
'''
归一化处理
这里输入的数据是二维数组
多个特征的数据
'''
def mn():
mn=MinMaxScaler()
data=mn.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
```
标准化
通过对原始数据进行变换将数据变换到均值为0,标准差为1的范围内:(转换后的数据 每个特征的平均值都为0,标准差都为1)
$$
x'=(x-mean)/\sigma
$$
mean为平均值
$$
\sigma为标准差,var为方差 var=\frac{(x1-mean)^2+(x2-mean)^2+....}{n(每个特征的样本数)}
$$
异常点对平均值影响不大(具有一定的数据量,少量的异常点对平均值影响不大)
方差考量数据的稳定性(如果数据比较集中 方差比较小;如果数据比较分散,方差比较大)
```
from sklearn.preprocessing import StandardScaler
def stand():
stand=StandardScaler()
data = stand.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(data)
```
缺失值
删除:当缺失值过多建议直接放弃整行或者整列
插补 :可以通过缺失值每行或没列的平均值、中位数进行填充