机器学习-决策树(特征处理和算法API)
前言
本文承接上文 决策树
特征提取
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注:特征值化是为了计算机更好的去理解数据
- 特征提取分类:
- 字典特征提取(特征离散化)
- 文本特征提取
特征提取API
sklearn.feature_extraction |
字典特征提取
作用:对字典数据进行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X)
- X:字典或者包含字典的迭代器返回值
- 返回sparse矩阵
- DictVectorizer.get_feature_names() 返回类别名称
- DictVectorizer.fit_transform(X)
demo如下:
from sklearn.feature_extraction import DictVectorizer |
返回结果:
(0, 1) 1.0 |
这样返回的是一个spare矩阵,对于数量大的数据而言,spare矩阵的可读性更高
我们在pandas中也有类似的效果 :pd.get_dummies()
我们把这个处理数据的技巧叫做”one-hot“编码
我们对于特征值中存在类别信息的时候,都会进行one-hot处理
文本特征提取
作用:对文本数据进行特征值化
- sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
- 返回词频矩阵
- CountVectorizer.fit_transform(X)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
- CountVectorizer.get_feature_names() 返回值:单词列表
- sklearn.feature_extraction.text.TfidfVectorizer
demo如下:
from sklearn.feature_extraction.text import CountVectorizer |
返回结果为:
(0, 2) 1 |
中文文本特征提取
我们不能直接使用CountVectorizer这个API来对于中文文本直接进行处理
因为英文默认是以空格分开的。其实就达到了一个分词的效果API可以直接使用默认的分词机制而中文并不是这样分词的,所以我们要对中文进行分词处理
这里我们需要使用一个第三方库jieba,可以直接pip安装
pip install jieba |
假设这是我们需要处理的中文文本:
“一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。”,
“我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。”,
“如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。”
我们使用jieba可以处理成这样
import jieba |
运行结果为:
一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。 |
这样我们的中文文本的分词就完成了
接下来就是我们的特征提取了
demo如下:
from sklearn.feature_extraction.text import CountVectorizer |
运行返回结果为:
(0, 0) 2 |
但是这样提取出的只是每种词汇在该训练文本中出现的频率
如果我们想知道文本类型的时候,应该更多去考虑词频
f-idf文本特征提取
- TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
- TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
公式
- 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
举例: |
demo如下:
import jieba |
返回结果如下:
(0, 20) 0.20280347192512724 |
决策树API
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
- criterion
- 特征选择标准
- “gini"或者"entropy”,前者代表基尼系数,后者代表信息增益。一默认"gini",即CART算法。
- min_samples_split
- 内部节点再划分所需最小样本数
- 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。
- min_samples_leaf
- 叶子节点最少样本数
- 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。之前的10万样本项目使用min_samples_leaf的值为5,仅供参考。
- max_depth
- 决策树最大深度
- 决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间
- random_state
- 随机数种子
案例:泰坦尼克号乘客生存预测
数据集部分展示:
age列中存在数据缺失
乘坐班是指乘客班(1,2,3),是社会经济阶层的代表。
基本步骤:
- 1.获取数据
- 2.数据基本处理
- 2.1 确定特征值,目标值
- 2.2 缺失值处理
- 2.3 数据集划分
- 3.特征工程(字典特征抽取)
- 4.机器学习(决策树)
- 5.模型评估
代码如下:
import numpy as np |
运行结果:
预测值 |
注:to_dict这个函数作用为将数据转换为字典类型
x_train转换后大概是这个样子的
具体可以用法可以参考这篇博客
可视化
同时决策树中也有可视化的API
sklearn.tree.export_graphviz() 该函数能够导出DOT格式
- tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
在上面的案例中加一行代码
from sklearn.tree import export_graphviz |
这样生成的dot的文件
去这个网站http://webgraphviz.com/上粘贴上去就能生成可视化页面
可视化页面大概如上图所示
对于决策树的介绍,大概就到这里了,本文完,下文大概是集成学习了