泰坦尼克号生存预测(决策树算法)「终于解决」

泰坦尼克号生存预测(决策树算法)「终于解决」泰坦尼克号生产模拟数据集。根据乘客的性别、年龄、仓位级别、上船口岸、亲友数、父母数量来预测是否会生存。

欢迎大家来到IT世界,在知识的湖畔探索吧!

泰坦尼克号生产模拟数据集。

根据乘客的性别、年龄、仓位级别、上船口岸、亲友数、父母数量来预测是否会生存。

模型采用决策树来构建

导入相应的包

import pandas as pd

import numpy as np

import sklearn

from sklearn import datasets #导入方法类

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier

from sklearn import tree

import warnings

warnings.filterwarnings(“ignore”)

导入数据

data=pd.read_csv(“mytrain.csv”)

data

泰坦尼克号生存预测(决策树算法)「终于解决」

  • PassengerId 乘客ID
  • Survived 生存与否
  • Pclass 仓位登记 1为最高级
  • SibSp 朋友亲戚数量
  • Parch 父母的数量
  • Fare 船费
  • Cabin 船舱号
  • Embarked 上船点

先看下数据的基本信息

data.info()

泰坦尼克号生存预测(决策树算法)「终于解决」

可以看到,数据集有891条记录,其中Cabin缺失严重,Unnamed: 12是无效字段。乘客ID、姓名、船票可以直接去掉。因为已经分了仓位等级,所以把船费也去掉

数据清理

把用不到的字段清理掉

data.pop(“Cabin”)

data.pop(“Name”)

data.pop(“Ticket”)

data.pop(“Unnamed: 12”)

data.pop(“Fare”)

data.pop(“PassengerId”)

泰坦尼克号生存预测(决策树算法)「终于解决」

年龄有缺失数据,所以我们用均值进行填充。 上船口岸有2条数据缺失,由于数量量小,这里选择直接删除。

data[“Age”]=data[“Age”].fillna(data[“Age”].mean())

data=data.dropna()#去掉含有NA的行

data.info()

  • 构造训练数据集,拆分成特征集和目标集

data_target=data.pop(“Survived”)

data_feature=data

  • 原数据中存在文本型,需要转换成数值型类型

def sex(x):

if x==“male”:

return 0

else:

return 1

data_feature[“Sex”]=data_feature[“Sex”].apply(lambda x:sex(x))

def Embarked(x):

if x==“S”:

return 0

if x==“C”:

return 1

if x==“Q”:

return 2

data_feature[“Embarked”]=data_feature[“Embarked”].apply(lambda x:Embarked(x))

泰坦尼克号生存预测(决策树算法)「终于解决」

  • 将数据拆分成训练集和测试集

feature_train, feature_test, target_train, target_test = train_test_split(data_feature, data_target, test_size=0.33, random_state=2)

构建模型和训练

dt_model = DecisionTreeClassifier(max_depth=3) # 所以参数均置为默认状态

dt_model.fit(feature_train,target_train) # 使用训练集训练模型

预测

predict_results = dt_model.predict(feature_test) # 使用模型对测试集进行预测

评价模型

scores= dt_model.score(feature_test, target_test)

scores

Out[13]:

0.8571428571428571

调参

from sklearn.model_selection import GridSearchCV #网格搜索

#定义参数及取值范围

tree_param_grid={“max_depth”:list((3,4,5,6,7)),”min_samples_split”:list((2,4,6,8))}

#构建模型(选择要选择的模型,选择参数集,选择交叉验证的CV)

grid=GridSearchCV( DecisionTreeClassifier(),param_grid=tree_param_grid,cv=5) #cv表示把训练集分成几段,取其中一段作为测试集。产生的组合有5种

#训练

grid.fit(feature_test, target_test)

#feature_test–训练数据的特征集, target_test–训练数据的目标集

means = grid.cv_results_[‘mean_test_score’] #获取每个方案的分数均值

std=grid.cv_results_[‘std_test_score’] #获得分数的标准差

params = grid.cv_results_[‘params’] #获取参数组合

#输出参数组合

for mean,std,param in zip(means,std,params):

print(“mean: %f std: %f with: %r” % (mean,std,param))

#输出最优的参数以及最优的分数

grid.best_params_,grid.best_score_

泰坦尼克号生存预测(决策树算法)「终于解决」

可以看到最优参数max_depth为4;min_samples_split为2。

根据参数调优结果重构模型

dt_model = DecisionTreeClassifier(max_depth=4,min_samples_split=2) # 所以参数均置为默认状态

dt_model.fit(feature_train,target_train) # 使用训练集训练模型

predict_results = dt_model.predict(feature_test) # 使用模型对测试集进行预测

scores= dt_model.score(feature_test, target_test)

scores

Out[20]:

0.8673469387755102

可以看到,这个预测结果的准确率只有86.73%,不知道是模型的影响还是因为泰坦尼克号生存的偶然性太高了。

画出决策树

import graphviz # doctest: +SKIP

clf=dt_model

dot_data = tree.export_graphviz(clf, out_file=None, # doctest: +SKIP

feature_names=feature_train.columns, # doctest: +SKIP

class_names=[“0″,”1”], # doctest: +SKIP

filled=True, rounded=True, # doctest: +SKIP

special_characters=True) # doctest: +SKIP

graph = graphviz.Source(dot_data) # doctest: +SKIP’

graph.render(‘example.gv’, view=True)

print(‘Save example.gv file!\n’)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/15391.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信