欢迎大家来到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