决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,就是利用这类结构分割数据的一种分类学习方法。是帮助我们进行高效决策分析的一种方法。
2、信息论基础(信息熵、信息增益)
- 信息:消除随机不定性的东西(信息论创始人说的:香农)
- 信息的衡量:使用信息熵,反应信息量的多少
- 信息熵的定义
- 决策树的划分依据之一 – 信息增益
3、决策树API
sklearn.tree.DecisionTreeClassifier(criterion="gini",max_depth=None,random_state=None)
- 决策树分类器
- criterion:默认是"gini",也可以选择信息增益的熵“entropy”
- max_depth:决策树的深度大小(不能太大,防止过拟合)
- random_state:随机树种子
4、决策树算法对莺尾花分类
from sklearn.datasets import load_iris,fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
import ssl
def decision_iris():
"""
1)、获取数据
2)、数据划分
3)、数据特征提取(该步骤在本例中不需要)
4)、使用决策树预估器进行分类
5)、模型的选择与调优
6)、模型评价
:return:
"""
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target)
estimator = DecisionTreeClassifier(criterion="entropy")
estimator.fit(x_train,y_train)
"""评估方法1:直接比对真实值和预测值"""
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
"""评估方法2:计算准确率"""
score = estimator.score(x_test, y_test)
print("准确率:\n", score)
return
if __name__ == '__main__':
ssl._create_default_https_context = ssl._create_unverified_context
decision_iris()
准确率: 0.9210526315789473 可以可以将该结果与KNN算法进行比较
5、决策树的可视化API
sklearn.tree.export_graphviz()
- tree.export_graphviz(estimator,out_file="tree.dot",feature_names=["age","pclass "])
- 下载支持dot插件,你点开那个文件,pycharm 会自动让你下载
export_graphviz(estimator, out_file="iris_tree.dot")
运行结果如图
6、决策树总结
- 优点:
- 简单的理解和解释,树木的可视化;
- 可视化,可解释能力强;
- 缺点:
决策树学习者可以创建不能很好地推广数据过于复杂的数据,这被称作为过拟合; - 改进:
- 减枝cart算法(决策树API当中已经实现,随机森林参数调优有相关介绍)
- 随机森林
ps:在企业重要决策中,由于决策树有很好的分析能力,在决策过程中应用较多,可以选择特征
7、泰坦尼克号案例(点击此处下载数据)密码:rtp0
流程分析
- 获取数据
- 数据处理(要根据实际数据是否需要,对本问题来说肯定是需要的)
- 缺失值的处理
- 特征值–>字典类型
- 划分数据集合
- 特征工程:字典特征的抽取
- 决策树预估器流程
- 模型评估
代码如下
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.feature_extraction import DictVectorizer
import pandas as pd
def titanic_demo():
titanic = pd.read_csv("/Users/dengzhao/Desktop/数据集/titanic/train.csv")
x = titanic[["Pclass","Age","Sex"]]
y = titanic["Survived"]
x["Age"].fillna(x["Age"].mean(),inplace=True)
x = x.to_dict(orient="records")
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=22)
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
estimator = DecisionTreeClassifier(criterion="entropy",max_depth=8)
estimator.fit(x_train, y_train)
"""评估方法1:直接比对真实值和预测值"""
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
"""评估方法2:计算准确率"""
score = estimator.score(x_test, y_test)
print("准确率:\n", score)
export_graphviz(estimator, out_file="titanic_tree.dot",feature_names=transfer.get_feature_names())
return
if __name__ == '__main__':
titanic_demo()
|