sklearn 中的决策树模型
构造决策树分类器
DecisionTreeClassifier(class_weight=None, criterion='entropy',
max_depth=None, max_features=None,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=None, splitter='best') #默认参数
参数解释:
criterion 在基于特征划分数据集合时,选择特征的标准。默认是gini,也可以是entropy
splitter 在构造树时,选择属性特征的原则。默认是best(选择所有特征中最好的),也可以是random(在部分特征中选择最好的)
max_depth 决策树的最大深度,控制决策树的最大深度,防止过拟合
max_features 在划分数据集时考虑最多的特征值数量。为int或float类型。其中int值是每次split时最大特征数,float是百分数,即特征数=max_features*n_features
min_samples_split 当节点的样本数少于min_samples_split时,不再继续分裂,默认值为2
min_samples_leaf 叶子节点需要的最少样本数。如果叶子节点数小于这个阈值,则会和兄弟节点一起被剪枝。可以是int类型(代表最小样本数),或float类型(表示一个百分比,这是最小样本数=min_samples_leaf*样本数量,向上取整)
max_leaf_nodes 最大叶子节点数。一般不设置,特征过多时,设置防止过拟合
min_impurity_split 信息增益的阈值。信息增益必须大于这个阈值,否则不分裂
class_weight 类别权重。dict类型(指定样本各类别的权重,权重大的类别在决策树构造的时候回进行偏倚),或balanced(算法自己计算权重,样本量少的类别所对应的样本权重会更高)
presort bool类型,默认false,表示在拟合前,是否对数据进行排序来加快树的构建。当数据集较小时,使用presort=true会加快分类器构造速度。
在构造决策树分类器后,我们可以使用 fit 方法让分类器进行拟合,使用 predict 方法对新数据进行预测,得到预测的分类结果,也可以使用 score 方法得到分类器的准确率。
生存预测的关键流程
https://github.com/cystanford//Titanic_Data
模块 1:数据探索
使用 info() 了解数据表的基本情况:行数、列数、每列的数据类型、数据完整度;
使用 describe() 了解数据表的统计情况:总数、平均值、标准差、最小值、最大值等;
使用 describe(include=[‘O’]) 查看字符串类型(非数字)的整体情况;
使用 head 查看前几行数据(默认是前 5 行);
使用 tail 查看后几行数据(默认是最后 5 行)。
import pandas as pd
# 数据加载
train_data = pd.read_csv('Desktop/Titanic_Data-master/train.csv')
test_data = pd.read_csv('Desktop/Titanic_Data-master/test.csv')
# 数据探索
print(train_data.info())
print('-'*30)
print(train_data.describe())
print('-'*30)
print(train_data.describe(include=['O']))
print('-'*30)
print(train_data.head())
print('-'*30)
print(train_data.tail())
模块 2:数据清洗
#用平均年龄代替空的
train_data['Age'].fillna(train_data['Age'].mean(), inplace=True)
test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)
#用平均票费代替空的
train_data('Fare').fillna(train_data['Fare'].mean(),inplace=True)
test_data['Fare'].fillna(test_data['Fare'].mean(),inplace=True)
# 使用登录最多的港口来填充登录港口的 nan 值
train_data['Embarked'].fillna('S', inplace=True)
test_data['Embarked'].fillna('S',inplace=True)
模块 3:特征选择
模块 4:决策树模型
# 构造 ID3 决策树
clf = DecisionTreeClassifier(criterion='entropy')
# 决策树训练
clf.fit(train_features, train_labels)
模块 5:模型预测 & 评估
#测试集的特征值矩阵
test_features=dvec.transform(test_features.to_dict(orient='record'))
# 决策树预测
pred_labels = clf.predict(test_features)
# 使用 K 折交叉验证 统计决策树准确率
print(u'cross_val_score 准确率为 %.4lf' % np.mean(cross_val_score(clf, train_features,train_labels, cv=10)))
使用 K 折交叉验证的方式,交叉验证是一种常用的验证分类准确率的方法,原理是拿出大部分样本进行训练,少量的用于分类器的验证。K 折交叉验证,就是做 K 次交叉验证,每次选取 K 分之一的数据作为验证,其余作为训练。轮流 K 次,取平均值。
K 折交叉验证的原理是这样的:
1. 将数据集平均分割成 K 个等份;
2. 使用 1 份数据作为测试数据,其余作为训练数据;
3. 计算测试准确率;
4. 使用不同的测试集,重复 2、3 步骤。
模块 6:决策树可视化