1、决策树算法
简介:
决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,本质是一颗由多个判断节点组成的树。
熵:
当数据量一致时,系统越有序,熵值越低;系统越混乱或者分散,熵值越高。
信息增益:
以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。
信息增益 = entroy(前) - entroy(后)
信息增益率:
信息增益率:增益比率度量是用前面的增益度量Gain(S,A)和所分离信息度量SplitInformation的比值来共同定义的。
基尼值和基尼指数:
基尼值Gini(D):从数据集D中随机抽取两个样本,其类别标记不一致的概率。故Gini(D)值越小,数据集D的纯度越高。
基尼指数Gini_index(D):一般选择使划分后基尼系数最小的属性作为最优化分属性。
决策树的构建步骤:
(1)开始将所有样本看作一个整体
(2)遍历每个特征的每一种分割方式,找到最好的分割(信息增益、信息增益率、基尼值增益)
(3)按照最优分割方式,把所有样本分成两个分支(N1和N2)
(4)对N1和N2分别继续执行第2和第3步,直到每个节点足够"纯"为止
决策树类型:
2、cart剪枝
预剪枝:
(1)每一个结点所包含的最小样本数。例如最小样本数为10,则该结点总样本数小于10时,则不再分;
(2)指定树的高度或者深度。例如树的最大深度为3;
(3)指定结点的熵小于某个值,不再划分。随着树的增长,在训练样集上的精度是单调上升的,然而在独立的测试样例上测出的精度先上升后下降。
后剪枝:
后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。
3、特征提取
字典特征提取:
from sklearn.feature_extraction import DictVectorizer
data = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
# 实例化转换器
transfer = DictVectorizer(sparse=False)
# transfer2 = DictVectorizer(sparse=True) # 稀疏矩阵
# 转换数据 提取字典特征
res = transfer.fit_transform(data)
# res2 = transfer2.fit_transform(data)
# 获取列名字
transfer.get_feature_names()
文本特征提取:
from sklearn.feature_extraction.text import CountVectorizer
import jieba
# 统计词语出现次数
data = ["人生苦短,我喜欢Python","生活太长久,我不喜欢Python"]
# 中文分词
def cut_words(s):
return ' '.join(list(jieba.cut(s)))
temp = []
for i in data:
temp.append(cut_words(i))
# 实例化转换器
transfer = CountVectorizer()
# 转换数据 提取字典特征
res = transfer.fit_transform(temp)
# 转换成ndarray
res.toarray()
# 获取列名字
transfer.get_feature_names()
TF-IDF:
# 统计词语出现次数
data = ["人生苦短,我喜欢Python","生活太长久,我不喜欢Python"]
# 中文分词
def cut_words(s):
return ' '.join(list(jieba.cut(s)))
temp = []
for i in data:
temp.append(cut_words(i))
# 实例化转换器
transfer = TfidfVectorizer()
# 转换数据 提取字典特征
res = transfer.fit_transform(temp)
# 转换成ndarray
res.toarray()
# 获取列名字
transfer.get_feature_names()
4、泰坦尼克号乘客生存预测
模型预测:
import pandas as pd
import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 1、获取数据
data = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 2、数据基本处理
x = data[['pclass','age','sex']]
y = data['survived']
# 处理缺失值
x['age'].fillna(x['age'].mean(), inplace=True)
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
# 3、特征工程
# 3.1 实例化转换器
transfer = DictVectorizer(sparse=False)
# 3.2 转换数据
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.transform(x_test.to_dict(orient="records"))
# 4、机器学习 决策树
# 4.1 建立模型
estimator = DecisionTreeClassifier(criterion='gini',max_depth=5)
# 4.2 训练模型
estimator.fit(x_train, y_train)
# 5、模型评估 分类 准确率
estimator.score(x_test,y_test)
决策树可视化:
import pandas as pd
import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 1、获取数据
data = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 2、数据基本处理
x = data[['pclass','age','sex']]
y = data['survived']
# 处理缺失值
x['age'].fillna(x['age'].mean(), inplace=True)
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
# 3、特征工程
# 3.1 实例化转换器
transfer = DictVectorizer(sparse=False)
# 3.2 转换数据
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.transform(x_test.to_dict(orient="records"))
# 4、机器学习 决策树
# 4.1 建立模型
estimator = DecisionTreeClassifier(criterion='gini',max_depth=5)
# 4.2 训练模型
estimator.fit(x_train, y_train)
# 5、模型评估 分类 准确率
estimator.score(x_test,y_test)
# 6、决策树的可视化
export_graphviz(estimator, out_file='./tree.dot',feature_names=transfer.get_feature_names())
决策树的优缺点:
优点:简单的理解和解释,树木可视化。
缺点:决策树学习者可以创建不能很好地推广数据的过于复杂的树,容易发生过拟合。
5、集成学习
简介:
Bagging原理:
(1)采样:通过随机有放回采样N份数据
(2)学习:用N份数据学习N个不同模型
(3)集成:通过N个模型平权投票,票数多的作为最终结果
随机森林:
随机森林 = Bagging + 决策树
随机森林代码实现:
import pandas as pd
import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.ensemble import RandomForestClassifier
# 1、获取数据
data = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 2、数据基本处理
x = data[['pclass','age','sex']]
y = data['survived']
# 处理缺失值
x['age'].fillna(x['age'].mean(), inplace=True)
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
# 3、特征工程
# 3.1 实例化转换器
transfer = DictVectorizer(sparse=False)
# 3.2 转换数据
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.transform(x_test.to_dict(orient="records"))
# 4、机器学习 决策树
# 4.1 建立模型
estimator = RandomForestClassifier(n_estimators=10000,criterion='gini',max_depth=5)
# 4.2 训练模型
estimator.fit(x_train, y_train)
# 5、模型评估 分类 准确率
estimator.score(x_test,y_test)
Boosting原理:
(1)对每个样本进行赋权,每个样本的权重都相等
(2)拿数据集去训练一个模型,得到一个模型
(3)拿训练得到的模型对训练数据进行预测
(4)把预测正确的样本的权重调低,把预测错误的样本的权重调高
(5)再拿修改权重之后的数据训练下一个模型
(6)最终结果:训练的所有模型进行加权投票
Bagging集成与Boosting集成的区别:
(1)数据:Bagging对数据进行采样训练;Boosting根据前一轮学习结果调整数据的重要性
(2)投票:Bagging对所有学习器平权投票;Boosting对所有学习器加权投票
(3)学习顺序:Bagging的学习是并行的,每个学习器没有依赖关系;Boosting学习是串行的,学习有先后顺序
(4)主要作用:Bagging用于解决过拟合,降低方差;Boosting用于解决欠拟合,降低偏差