决策树:是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果,本质是一颗由多个判断节点组成的树。
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.
min_samples_leaf
叶子节点最少样本数
这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。
max_depth
决策树的最大深度,默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。常用的可以取值10-100之间
示例—泰坦尼克号生存预测
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
# 获取数据
# titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# # 确定特征值,目标值
# x = titan[["pclass", "age", "sex"]]
# y = titan["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, random_state=22)
# 获取数据
train_data = pd.read_csv('./titanic/train.csv')
x_train, y_train = train_data[['Pclass', 'Age', 'Sex']], train_data[['Survived']]
print(x_train.head())
print(y_train.head())
x_test = pd.read_csv('./titanic/test.csv')[['Pclass', 'Age', 'Sex']]
y_test = pd.read_csv('./titanic/gender_submission.csv')[['Survived']]
print(x_test.head())
print(y_test.head())
# 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取
x_train['Age'].fillna(x_train['Age'].mean(), inplace=True)
x_test['Age'].fillna(x_test['Age'].mean(), inplace=True)
# 字典特征抽取,特征中出现类别符号,需要进行one-hot编码处理
# x.to_dict(orient="records")将数组特征转换为字典数据
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
# 决策树
estimator = DecisionTreeClassifier(max_depth=5)
estimator.fit(x_train, y_train)
# 模型评估
y_pre = estimator.predict(x_test)
print(y_pre)
# 准确率
ret1 = estimator.score(x_train, y_train)
ret = estimator.score(x_test, y_test)
print(ret1, ret)
# 决策树可视化
export_graphviz(estimator, out_file="./tree.dot", feature_names=['Age', 'Pclass=1st', 'Pclass=2nd', 'Pclass=3rd', 'female', 'male'])