机器学习的流程

预处理 ——> 特征工程 ——> 机器学习 ——> 模型评估

如果未达到要求,重新循环

特征工程

原始数据转换为更好地代表预测模型的潜在问题的特征的工程,从而提高了模型对位置数据预测的准确性( 属于数据预处理阶段的工作

以scikit-learn为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
import jieba
import numpy as np
from sklearn.impute import SimpleImputer

def dictvec():
"""
字典数据抽取
:return: None
"""
# 实例化
# sparse改为True,输出的是每个不为零位置的坐标,稀疏矩阵可以节省存储空间
dict = DictVectorizer(sparse=False) # 把sparse改为True看看
#矩阵中存在大量的0,sparse存储只记录非零位置,节省空间
# 调用fit_transform
data = dict.fit_transform([{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}])
print(data)
print('-' * 50)
print(dict.get_feature_names_out()) # 字典中的一些类别数据,分别进行转换成特征
print('-' * 50)
print(dict.inverse_transform(data)) #去看每个特征代表的含义,逆转回去
return None

DictVectorizer.fit_transform:(在训练集上)将字典数据转换特征值数组(默认是one-hot编码)

DictVectorizer.inverse_transform:上述过程逆转换

sklearn.feature_extraction.text.CountVectorizer:对文本进行特征值化,单个汉字单个字母不统计,因为单个汉字字母没有意义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def countvec():
"""
对文本进行特征值化,单个汉字单个字母不统计,因为单个汉字字母没有意义,(“我”没有统计)
:return: None
"""
cv = CountVectorizer()
data = cv.fit_transform(["人生苦短,我 喜欢 python python", "人生漫长,不用 python"])

print(cv.get_feature_names())
print(data)
print(data.toarray())
return None

countvec()

TF-IDF

如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

sklearn.feature extraction.text.TfidfVectorizer

Tf:term frequency:词的频率出现的次数
idf:逆文档频率inverse document frequency:log(总文档数量/该词出现的文档数量)
tf*idf 来代表重要性程度

(1)TF是词频(Term Frequency)

        词频(TF)**表示词条(关键字)在文本中出现的频率**。

        这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。

        公式:           **即:

其中 ni,j 是该词在文件 dj 中出现的次数,分母则是文件 dj 中所有词汇出现的次数总和;

(2) IDF是逆向文件频率(Inverse Document Frequency)

        逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目再将得到的商取对数得到

如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。

      公式:

其中,**|D|** 是语料库中的文件总数|{j:ti∈dj}| 表示包含词语 ti 的文件数目(即 ni,j≠0 的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|

即:

*(3)TF-IDF实际上是:TF * IDF*

       某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

       公式:

注:  TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。