目录
1 案例背景
泰坦尼克号沉没是历史上最臭名昭着的沉船之⼀。 1912年4⽉ 15⽇ , 在她的处⼥航中, 泰坦尼克号在与冰⼭相撞后沉没, 在2224名乘客和机组⼈员中造成1502⼈死亡。 这场耸⼈听闻的悲剧震惊了国际社会, 并为船舶制定了更好的安全规定。 造成海难失事的原因之⼀是乘客和机组⼈员没有⾜够的救⽣艇。 尽管幸存下沉有⼀些运⽓因素, 但有些⼈⽐其他⼈更容易⽣存, 例如妇⼥, ⼉童和上流社会。 在这个案例中, 我们要求您完成对哪些⼈可能存活的分析。 特别是,我们要求您运⽤机器学习⼯具来预测哪些乘客幸免于悲剧。
案例: https://www.kaggle.com/c/titanic/overview
我们提取到的数据集中的特征包括票的类别, 是否存活, 乘坐班次, 年龄, 登陆home.dest, 房间, 船和性别等。
数据: http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
2 决策树算法api
- class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
1.criterion
特征选择标准
"gini"或者"entropy", 前者代表基尼系数, 后者代表信息增益。 ⼀默认"gini", 即CART算法。
2.min_samples_split
内部节点再划分所需最⼩样本数
这个值限制了⼦树继续划分的条件, 如果某节点的样本数少于min_samples_split, 则不会继续再尝试选择最优特征来进⾏划分。 默认是2.如果样本量不⼤, 不需要管这个值。 如果样本量数量级⾮常⼤, 则推荐增⼤这个值。 我之前的⼀个项⽬例⼦, 有⼤概10万样本, 建⽴决策树时, 我选择了min_samples_split=10。可以作为参考。
3.min_samples_leaf
叶⼦节点最少样本数
这个值限制了叶⼦节点最少的样本数, 如果某叶⼦节点数⽬⼩于样本数, 则会和兄弟节点⼀起被剪枝。默认是1,可以输⼊最少的样本数的整数, 或者最少样本数占样本总数的百分⽐。 如果样本量不⼤, 不需要管这个值。 如果样本量数量级⾮常⼤, 则推荐增⼤这个值。 之前的10万样本项⽬使⽤min_samples_leaf的值为5, 仅供参考。
4.max_depth
决策树最⼤深度
决策树的最⼤深度, 默认可以不输⼊, 如果不输⼊的话, 决策树在建⽴⼦树的时候不会限制⼦树的深度。⼀般来说, 数据少或者特征少的时候可以不管这个值。 如果模型样本量多, 特征也多的情况下, 推荐限制这个最⼤深度, 具体的取值取决于数据的分布。 常⽤的可以取值10-100之间。
5.random_state
随机数种⼦
3. 代码实现
3.1 代码部分分析
- 导入需要的模块
- 1.获取数据
- 2.数据的基本处理
2.1 确定特征值,目标值
2.2 缺失值处理
2.3 数据集划分
- 3.特征工程(字典特征抽取)
特征中出现类别符号, 需要进⾏one-hot编码处理(DictVectorizer) ;x.to_dict(orient="records") 需要将数组特征转换成字典数据。
- 4. 决策树模型训练和评估
决策树API当中, 如果没有指定max_depth那么会根据信息熵的条件直到最终结束。 这⾥我们可以指定树的深度来进⾏限制树的⼤⼩。
3.2 完整代码
# 1.获取数据
# 2.数据基本处理
# 2.1 确定特征值,目标值
# 2.2 缺失值处理
# 2.3 数据集划分
# 3.特征工程(字典特征抽取)
# 4.机器学习(决策树)
# 5.模型评估
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 1.获取数据
titan =pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 2.数据基本处理
# 2.1 确定特征值,目标值
x = titan[["pclass", "age", "sex"]]
y = titan["survived"]
# 2.2 缺失值处理
x['age'].fillna(value=titan["age"].mean(), inplace=True)
# 2.3 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22, test_size=0.2)
# 3.特征工程(字典特征抽取)
x_train = x_train.to_dict(orient="records")
x_test = x_test.to_dict(orient="records")
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 4.机器学习(决策树)
estimator = DecisionTreeClassifier(max_depth=15)
estimator.fit(x_train, y_train)
# 5.模型评估
y_pre = estimator.predict(x_test)
ret = estimator.score(x_test, y_test)
print(ret)
export_graphviz(estimator, out_file="./data/tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
4 决策树可视化
4.1 保存树的结构到dot文件
- sklearn.tree.export_graphviz() 该函数能够导出DOT格式
tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
dot文件当中的内容如下
那么这个结构不能看清结构, 所以可以在⼀个⽹站上显示
4.2 网站显示结构
4.2.1效果
5 决策树总结
5.1 优点
简单的理解和解释,树木可视化
5.2 缺点
决策树学习者可以创建不能很好地推广数据的过于复杂的树,容易发生过拟合。
5.3 改进
剪枝cart算法
随机森林
参考:黑马程序员课程