决策树,预测泰坦尼克号生存概率

用id3算法,得出泰坦尼克号生存率预测:

测试集与训练集:
链接: https://pan.baidu.com/s/1AsWe81NfddCoWAwmHp97Iw 提取码: zp8x 复制这段内容后打开百度网盘手机App,操作更方便哦

我们看下步骤:
1、数据导入与探索
使用 info() 了解数据表的基本情况:行数、列数、每列的数据类型、数据完整度;
使用 describe() 了解数据表的统计情况:总数、平均值、标准差、最小值、最大值等;
使用 describe(include=[‘O’]) 查看字符串类型(非数字)的整体情况;
使用 head 查看前几行数据(默认是前 5 行);
使用 tail 查看后几行数据(默认是最后 5 行)。

import pandas as pd

#数据加载
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')
#数据探索
print(train_data.info())#了解数据表基本情况:行数RangeIndex、列数Data columns、每列的数据类型、数据完整度;
print('_'*30)#分割线
print(train_data.describe())#了解数据表的统计情况:总数cout、平均数mean、标准差std、最小值min、最大值max等;
print('_'*30)#分割线
print(train_data.describe(include=['O']))#查看字符串类型(非数字)的整体情况O为大写的哦
print('_'*30)#分割线
print(train_data.head())#前30行的情况
print('_'*30)#分割线
print(train_data.tail())

2、数据清理与整合

#缺失值为age年龄,fare船票价格,cabin船舱,Embarked为字符串
#1、使用平均年龄来填充年龄中的nan值
train_data['Age'].fillna(train_data['Age'].mean(),inplace=True)
test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)
#2使用平均票价来填充票价中的nan值
train_data['Fare'].fillna(train_data['Fare'].mean,inplace=True)
test_data['Fare'].fillna(test_data['Fare'].mean,inplace=True)

#查看Embarked的字段取值
print(train_data['Embarked'].value_counts())
#使用最多的s港口补齐缺失值
train_data['Embarked'].fillna('S',inplace=True)
test_data['Embarked'].fillna('S',inplace=True)

3、特征选择

#特征选择,除去无用信息
features=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
train_features=train_data[features]
train_lables=train_data['Survived']
test_features=train_data[features]

4、将字符串转化成0/1字符替代
特征选择是分类模型好坏的关键。选择什么样的特征,以及对应的特征值矩阵,决定了分类模型的好坏。通常情况下,特征值不都是数值类型,可以使用 DictVectorizer 类进行转化;

#特征值里有一些字符串不方便计算,用DictVectorizer转换为字符串,如性别,可用1,2,代替male和female
from sklearn.feature_extraction import DictVectorizer
dvec=DictVectorizer(sparse=False)
train_features=dvec.fit_transform(train_features.to_dict(orient='record'))#训练集特征矩阵

5、模型建立,与测试集数据代入

#决策树模型
from sklearn.tree import DecisionTreeClassifier
#构造id3决策树
clf=DecisionTreeClassifier(criterion='entropy')
#决策树训练
clf.fit(train_features,train_lables)
test_features=dvec.transform(test_features.to_dict(orient='record'))#测试集特征值矩阵

6、交叉验证

模型准确率需要考虑是否有测试集的实际结果可以做对比,当测试集没有真实结果可以对比时,需要使用 K 折交叉验证 cross_val_score;

#k折交叉验证
import numpy as np
from sklearn.model_selection import cross_val_score
#使用K折交叉验证 统计决策树准确率
print(u'cross_val_score准确率为%.41f'%np.mean(cross_val_score(clf,train_features,train_lables,cv=10)))

7、可视化
Graphviz 可视化工具可以很方便地将决策模型呈现出来,帮助你更好理解决策树的构建。

import graphviz
from sklearn.tree import export_graphviz
# 参数是回归树模型名称,不输出文件。
dot_data = export_graphviz(clf,out_file=None)
graph = graphviz.Source(dot_data)
# render 方法会在同级目录下生成 Boston PDF文件,内容就是回归树。
graph.view()

完整代码请笑纳~~~

# encoding=utf-8
import pandas as pd

#数据加载
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')
#数据探索
print(train_data.info())#了解数据表基本情况:行数RangeIndex、列数Data columns、每列的数据类型、数据完整度;
print('_'*30)#分割线
print(train_data.describe())#了解数据表的统计情况:总数cout、平均数mean、标准差std、最小值min、最大值max等;
print('_'*30)#分割线
print(train_data.describe(include=['O']))#查看字符串类型(非数字)的整体情况O为大写的哦
print('_'*30)#分割线
print(train_data.head())#前30行的情况
print('_'*30)#分割线
print(train_data.tail())

#数据清洗
#缺失值为age年龄,fare船票价格,cabin船舱,Embarked为字符串
#1、使用平均年龄来填充年龄中的nan值
train_data['Age'].fillna(train_data['Age'].mean(),inplace=True)
test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)
#2使用平均票价来填充票价中的nan值
train_data['Fare'].fillna(train_data['Fare'].mean,inplace=True)
test_data['Fare'].fillna(test_data['Fare'].mean,inplace=True)

#查看Embarked的字段取值
print(train_data['Embarked'].value_counts())
#使用最多的s港口补齐缺失值
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_lables=train_data['Survived']
test_features=train_data[features]

#特征值里有一些字符串不方便计算,用DictVectorizer转换为字符串,如性别,可用1,2,代替male和female
from sklearn.feature_extraction import DictVectorizer
dvec=DictVectorizer(sparse=False)
train_features=dvec.fit_transform(train_features.to_dict(orient='record'))#训练集特征矩阵
print(dvec.feature_names_)

#决策树模型
from sklearn.tree import DecisionTreeClassifier
#构造id3决策树
clf=DecisionTreeClassifier(criterion='entropy')
#决策树训练
clf.fit(train_features,train_lables)
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(test_features,train_lables),6)
# print(u'score准确率为%.41f'%acc_decision_tree)

#k折交叉验证
import numpy as np
from sklearn.model_selection import cross_val_score
#使用K折交叉验证 统计决策树准确率
print(u'cross_val_score准确率为%.41f'%np.mean(cross_val_score(clf,train_features,train_lables,cv=10)))

import graphviz
from sklearn.tree import export_graphviz
# 参数是回归树模型名称,不输出文件。
dot_data = export_graphviz(clf,out_file=None)
graph = graphviz.Source(dot_data)
# render 方法会在同级目录下生成 Boston PDF文件,内容就是回归树。
graph.view()

数据存在百度云盘,可以自己练练手,理论不讲了。

你可能感兴趣的:(决策树,预测泰坦尼克号生存概率)