泰坦尼克乘客生存预测

2019-04-11  本文已影响0人  疯狂的小强_94ee

决策树算法是经常使用的数据挖掘算法,这是因为决策树就像一个人脑中的决策模型一样,呈现出来非常直观。基于决策树还诞生了很多数据挖掘算法,比如随机森林(Random forest)。

sklearn 中的决策树模型

首先,我们需要掌握 sklearn 中自带的决策树分类器 DecisionTreeClassifier,方法如下:

clf = DecisionTreeClassifier(criterion='entropy')

到目前为止,sklearn 中只实现了 ID3 与 CART决策树,所以我们暂时只能使用这两种决策树,

在构造 DecisionTreeClassifier 类时,其中有一个参数是 criterion,意为标准。它决定了构造的分类树是采用 ID3 分类树,还是 CART分类树,对应的取值分别是 entropy 或者 gini:

entropy: 基于信息熵,也就是 ID3 算法,实际结果与 C4.5 相差不大;

gini:默认参数,基于基尼系数。CART 算法是基于基尼系数做属性划分的,所以 criterion=gini 时实际上执行的是 CART 算法。

Titanic 乘客生存预测

泰坦尼克海难是著名的十大灾难之一,究竟多少人遇难,各方统计的结果不一。现在我们可以得到部分的数据,具体数据你可以从 GitHub下载:https://github.com/cystanford/Titanic_Data

实现代码:

import pandasas pd

import numpyas np

from sklearn.feature_extractionimport DictVectorizer

from sklearn.treeimport DecisionTreeClassifier

from sklearn.model_selectionimport cross_val_score

from sklearnimport tree

import graphviz

def trans_sex(x):

if x =='male':

return 1

    else:

return 0

train_data = pd.read_csv('./../data/titanic/train.csv')

test_data = pd.read_csv('./../data/titanic/test.csv', index_col=0)

# 使用平均年龄来填充年龄中的 nan 值

train_data['Age'].fillna(train_data['Age'].mean(), inplace=True)

test_data['Age'].fillna(test_data['Age'].mean(), inplace=True)

# 使用票价的均值填充票价中的 nan 值

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)

# 特征选择

features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']

train_features = train_data[features]

train_labels = train_data['Survived']

test_features = test_data[features]

dvec = DictVectorizer(sparse=False)

train_features = dvec.fit_transform(train_features.to_dict(orient='record'))

#train_features = dvec.transform(train_features.to_dict(orient='record'))

print(dvec.feature_names_)

# 构造 ID3 决策树

clf = DecisionTreeClassifier(criterion='entropy')

# 决策树训练

clf.fit(train_features, train_labels)

test_features = dvec.transform(test_features.to_dict(orient='record'))

# 决策树预测

pred_labels = clf.predict(test_features)

#print(pred_labels)

# 得到决策树准确率

acc_decision_tree =round(clf.score(train_features, train_labels), 6)

print(u'score 准确率为 %.4lf' % acc_decision_tree)

# 使用 K 折交叉验证 统计决策树准确率

print(u'cross_val_score 准确率为 %.4lf' % np.mean(cross_val_score(clf, train_features, train_labels, cv=10)))

# 决策树可视化

dot_data = tree.export_graphviz(clf, out_file=None)

graph = graphviz.Source(dot_data)

graph.view()

上一篇下一篇

猜你喜欢

热点阅读