泰坦尼克号生存预测(决策树算法)

泰坦尼克号生存预测(决策树算法)

首页休闲益智泰坦尼克号塔更新时间:2024-07-29

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

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

模型采用决策树来构建

导入相应的包

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

先看下数据的基本信息

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')

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved