泰坦尼克号生产模拟数据集。
根据乘客的性别、年龄、仓位级别、上船口岸、亲友数、父母数量来预测是否会生存。
模型采用决策树来构建
导入相应的包导入数据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