基于决策树的泰坦尼克号幸存者分析

基于决策树泰坦尼克号幸存者进行分析

  • 缺失值的处理

  • 将字符型数据转成数值型

  • 特征属性数据和标签属性的分离

  • 决策树的建模

  • 网格搜索的建立

导入模块

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set() # setting seaborn default for plots

from sklearn.tree import DecisionTreeClassifier    # 分类决策树
from sklearn.model_selection import GridSearchCV   # 网格搜索
from sklearn.model_selection import train_test_split # 训练集和测试集的划分
from sklearn.model_selection import cross_val_score  # 交叉验证模块

导入数据

data = pd.read_csv("/Users/peter/data-visualization/train.csv")  

查看数据信息

image

删除缺失值

# 去掉缺失值过多的列 Cabin (直接删掉),以及和观测判断来说和预测的y没有关系的列(Name, Ticket)
data.drop(["Cabin", "Name", "Ticket"], inplace=True, axis=1)

中值填充

某个字段缺失值不是太多,使用中值填充

# Age属性用中值填充
data['Age'] = data['Age'].fillna(data['Age'].mean())  
image

如果只是很少部分的缺失值,比如Embarked字段,直接dropna

data = data.dropna()   # 只要是存在的缺失值都给删掉
data.info()
image

将属性的值转成数值型

Python不能直接处理字符串数据,需要转成数值型

  • Embark中存在["S", "C", "Q"]3种结果:现将结果转成列表,再从列表中取出对应的索引(数字)
  • Sex字段中存在["male", "female"]2种结果:只有两个结果的情形,通过bool值来解决
# 方法1
# 属性的结果存在多个不同的取值
labels = data["Embarked"].unique().tolist()  # ["S", "C", "Q"]
# 将Embarked属性中的 ["S", "C", "Q"]转成0,1,2
data['Embarked']= data['Embarked'].apply(lambda x: labels.index(x))   


# 方法2
data["Sex"] = (data["Sex"] == "male").astype("int")  # 先获取bool值,再将bool值转成0-1

# 方法3:通过loc来实现
# data.loc[:, "Sex"] = (data["Sex"] == "male").astype("int")
image
image

特征属性和标签的分离

根据某个属性将数据分成特征数据和标签数据(最后的预测值或者输出值)

x = data.iloc[:, data.columns != "Survived"]
y = data.iloc[:, data.columns == "Survived"]

随机划分数据后的索引还原

# 划分训练集和测试集
Xtrain, Xtest, ytrain, ytest = train_test_split(x, y, test_size=0.3)

for i in [Xtrain, Xtest, ytrain, ytest]:
    i.index = range(i.shape[0])  # shape属性的第一个元素就是索引的总个数
image
image

决策树的建模过程

clf = DecisionTreeClassifier(random_state=25)
clf = clf.fit(Xtrain, ytrain)
score = clf.score(Xtest, ytest)
score

# 交叉验证
clf = DecisionTreeClassifier(random_state=25)
score = cross_val_score(clf, x, y, cv=10).mean()  # 10次交叉验证求均值,结果降低
score   

学习曲线

tr = []  # 两个空列表用来存储训练得到的两个分数
te = []
for i in range(10):
    clf = DecisionTreeClassifier(random_state=25   # 实例化模型,设定决策树的最大深度
                                ,max_depth=i+1
                                ,criterion="entropy"  # 默认是基尼系数。一般情况下,entropy是欠拟合的情况下才使用
                                )
    clf = clf.fit(Xtrain, ytrain)  # fit训练过程
    score_tr = clf.score(Xtrain, ytrain)  # 训练集score
    score_te = cross_val_score(clf, x, y, cv=10).mean()   # 测试集分数,取均值
    tr.append(score_tr)
    te.append(score_te)
    
print(max(te))
plt.plot(range(1,11), tr, color="red", label="train")  # x,y,颜色,label
plt.plot(range(1,11), te, color="blue", label="test")
plt.xticks(range(1,11)) # 横坐标范围固定在1-10
plt.legend()  # 图例
plt.show()
image

网格搜索demo

gini_threholds = np.linspace(0, 0.5, 20)   # gini:0-0.5
#entropy_threholds = np.linspace(0,1,20)  entropy:0-1

# 参数
parameter = {
    "criterion":("gini", "entropy")
    ,"splitter":("best", "random")
    ,"max_depth":[*range(1,10)]
    ,"min_samples_leaf":[*range(1,50,5)]
    ,"min_impurity_decrease":gini_threholds
}

# 网格搜索
clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf, parameter, cv=10)  # 同时满足fit,score,交叉验证3种功能
GS = GS.fit(Xtrain, ytrain)

# 2个重要的属性
GS.best_params_   # 显示属性的最好组合结果
GS.best_score_   
image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容