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表示代表为“北京”)

提取数据特征值bp神经网络 特征提取python_缺失值

 

提取数据特征值bp神经网络 特征提取python_python_02

 

②文本特征抽取

 统计文本出现次数

可以用于文本分类 情感分析

这个对单个字符没有进行统计  

对于英文不需要进行数据提前处理,但是**中文需要提前进行分词处理**(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())
```

提取数据特征值bp神经网络 特征提取python_python_03

 

中文分词处理

主要是利用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
```

提取数据特征值bp神经网络 特征提取python_python_04

 

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())
```

提取数据特征值bp神经网络 特征提取python_提取数据特征值bp神经网络_05

 

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)
```

缺失值

 删除:当缺失值过多建议直接放弃整行或者整列             
插补 :可以通过缺失值每行或没列的平均值、中位数进行填充