泰坦尼克生存预测
最好的学习就是输出,所以虽然这个预测很多人做过了,我还是在这里再做一遍,纯粹是为了自己学习. 前言
这次预测使用的是Sklearn中的决策树模型: clf = DecisionTreeClassifier(criterion="entropy")
其中criterion是标准,决定了构造分类树是采用ID3分类树还是CART分类树,对应的取值分别是 entropy 和 gini
entropy : 基于信息熵,也就是ID3算法, 实际结果与C4.5相差不大;
gini : 默认参数,基于基尼系数. CART算法是基于基尼系数做属性划分的,所以 criterion=gini 时, 实际上执行的是CART算法.
其完整参数: DecisionTreeClassifier(class_weight=None, criterion="entropy", max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter="best")
参数代表的含义如下表:
参数表
作用
criterion
在基于特征划分数据集合时,选择特征的标准。默认是 gini,也可以是entropyo
splitter
在构造树时,选择属性特征的原则,可以是best或者 random。默认是best,best代表在所有的特征中选择最 好的,random代表在部分特征中选择最好的。
max_depth
决策树的最大深度,我们可以控制决策树的深度来防止 决策树过拟合
max_features
在划分数据集时考虑的最多的特征值数量。为int或float类型。其中int值是每次split时最大特征数;float值是百 分数,即特征数=max_features * n_featureso
min_samples_split
当节点的样本数少于min_samples_split时,不再继续分 裂。默认值为2
min_samples_leaf
叶子节点需要的最少样本数。如果某叶子节点数目小于 这个阈值,则会和兄弟节点一起被剪枝。 min_samples_leaf的取值可以是int或float类型。 int类型:代矗小样本数; float类型:表示一个百分比,这是最小样本数 =min_samples_leaf乘以样本数量,并向上取整。
max_leaf_nodes
最大叶子节点数。int类型,默认为None。 默认情况下是不设置最大叶子节点数,特征不多时,不 用设置。特征多时,可以通过设置最大叶子节点数,防 止过拟合。
min_impurity_decrease
节点划分最小不纯度。float类型,默认值为0。 节点的不纯度必须大于这个阈值,否则该节点不再生成 子节点。通过设置,可以限制决策树的增长。
minjmpurity_split
信息増益的阀值。信息増益必须大于这个阀值,否则不 分裂。
class_weight
类别权重。默认为None,也可以是diet或balanced。 diet类型:指定样本各类别的权重,权重大的类别在决策 树构造的时候会进行偏倚。 balanced:算法自己计算权重,样本量少的类别所对应 的样本权重会更高。
presort
bool类型,默认是false,表示在拟合前,是否对数据进 行排序来加快树的构建。当数据集较小时,使用 presort=true会加快分类器构造速度。当数据集庞大 时,presort=true会导致整个分类非常缓慢。
在构造决策树分类器后,我们可以使用fit方法让他分类器进行拟合, 使用 predict 方法对新数据进行预测, 得到预测的分类结果, 也可以使用 score 方法得到分类器的准确率.
fit 、 predict 和 score 方法的作用如下表:
方法表
作用
fit(features, labels)
通过特征矩阵, 分类表示,让分类器进行拟合
predict(features)
返回预测结果
score(features, labels)
返回准确率
本次数据集一共两个,一个是 train.csv , 用于训练, 包含特征信息和存活与否的标签, 一个是 test.csv , 测试数据集, 只包含特征信息.
训练集中,包括了以下字段:
字段
描述
Passengerld
乘客编号
Survived
是否幸存
Pclass
船票等级
Name
乘客姓名
Sex
乗客性别
SibSp
亲戚数虽(兄妹、配偶数)
Parch
亲戚数虽(父母、子女数)
Ticket
船票号码
Fare
船票价格
Cabin
船舱
Embarked
登陆港口 流程
整个流程可以划分为三个阶段: 获取数据 准备阶段 数据探索 数据清洗 特征选择
分类阶段 决策树模型 模型评估&预测 决策树可视化
获取数据
这一步还包含了引入所需依赖 # 引入依赖 import pandas as pd from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier import os # 准备工作 path = os.path.expanduser("~/data/python/Titanic_Data/") # 获取数据 train_data = pd.read_csv(path + "train.csv") test_data = pd.read_csv(path + "test.csv")准备阶段
对数据进行探索,分析数据质量,并对数据进行清洗,然后通过特征选择对数据进行降维, 以便于之后进行分类运算; 数据探索train_data.info() # 了解数据表的基本情况:行数、列数、每列的数据类型、数据完整度 train_data.describe() # 了解数据表的统计情况:总数、平均值、标准差、最小值、最大值等 train_data.describe(include=["O"]) #查看字符串类型 (非数字) 的整体情况 train_head(5) # 查看前几行数据 (默认是前 5 行) train_tail(5) # 查看后几行数据 (默认是最后 5 行) train_sample(5) # 查看随机几行数据 (默认是随机1行) # 运行结果 RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): PassengerId 891 non-null int64 Survived 891 non-null int64 Pclass 891 non-null int64 Name 891 non-null object Sex 891 non-null object Age 714 non-null float64 SibSp 891 non-null int64 Parch 891 non-null int64 Ticket 891 non-null object Fare 891 non-null float64 Cabin 204 non-null object Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.6+ KB None ------------------------------ PassengerId Survived ... Parch Fare count 891.000000 891.000000 ... 891.000000 891.000000 mean 446.000000 0.383838 ... 0.381594 32.204208 std 257.353842 0.486592 ... 0.806057 49.693429 min 1.000000 0.000000 ... 0.000000 0.000000 25% 223.500000 0.000000 ... 0.000000 7.910400 50% 446.000000 0.000000 ... 0.000000 14.454200 75% 668.500000 1.000000 ... 0.000000 31.000000 max 891.000000 1.000000 ... 6.000000 512.329200 [8 rows x 7 columns] ------------------------------ Name Sex ... Cabin Embarked count 891 891 ... 204 889 unique 891 2 ... 147 3 top Peter, Mrs. Catherine (Catherine Rizk) male ... B96 B98 S freq 1 577 ... 4 644 [4 rows x 5 columns] ------------------------------ PassengerId Survived Pclass ... Fare Cabin Embarked 0 1 0 3 ... 7.2500 NaN S 1 2 1 1 ... 71.2833 C85 C 2 3 1 3 ... 7.9250 NaN S 3 4 1 1 ... 53.1000 C123 S 4 5 0 3 ... 8.0500 NaN S [5 rows x 12 columns] ------------------------------ PassengerId Survived Pclass ... Fare Cabin Embarked 886 887 0 2 ... 13.00 NaN S 887 888 1 1 ... 30.00 B42 S 888 889 0 3 ... 23.45 NaN S 889 890 1 1 ... 30.00 C148 C 890 891 0 3 ... 7.75 NaN Q [5 rows x 12 columns] ------------------------------ PassengerId Survived Pclass ... Fare Cabin Embarked 619 620 0 2 ... 10.5000 NaN S 330 331 1 3 ... 23.2500 NaN Q 647 648 1 1 ... 35.5000 A26 C 716 717 1 1 ... 227.5250 C45 C 860 861 0 3 ... 14.1083 NaN S [5 rows x 12 columns]数据清洗
探索之后, 我们发现Age、Cabin这两个字段的数据有缺失.
其中, Cabin为船舱, 有大量的缺失值, 在训练集和测试集中的缺失率分别为77%和78%, 无法补齐, Age可以获取平均值进行补齐, 而Embarked是登陆港口, 这个字段也有少量(2个)缺失值, 可以使用最大数据进行补齐. train_data["Age"].fillna(train_data["Age"].mean(), inplace=True) test_data["Age"].fillna(test_data["Age"].mean(), inplace=True) train_data["Embarked"].fillna(train_data["Embarked"].value_counts().idxmax(), inplace=True) test_data["Embarked"].fillna(test_data["Embarked"].value_counts().idxmax(), inplace=True)分类阶段特征选择
需要选择有用的字段作为特征,这一步其实很重要: # 特征选择 train_data.columns # 从上一句的结果中选择特征字段 features = ["Pclass", "Sex", "Age", "SibSp", "Fare", "Parch", "Embarked"] train_features = train_data[features] test_features = test_data[features] train_labels = train_data["Survived"]
这中间有一些事字符串字段, 是不适合进行后续运算的, 需要在这里转变为数值类型,比如Sex字段, 男女两种取值需要转变成0和1
再比如Embarked有S, C, Q三种可能, 我们可以改成Embarked=S, Embarked=C, Embarked=Q三个字段,然后用数值0和1来表示, 其中sklearn特征选择中的DictVectorizer类( 上面已引入依赖 ), 可以处理符号化的对象, 将符号转变为0/1进行表示: dvec=DictVectorizer(sparse=False) train_features=dvec.fit_transform(train_features.to_dict(orient="record"))
fit_transform 这个函数可以讲特征向量转化为特征值矩阵, 我们查看下: dvec.feature_names_ # 运行结果: ["Age", "Embarked=C", "Embarked=Q", "Embarked=S", "Fare", "Parch", "Pclass", "Sex=female", "Sex=male", "SibSp"]
我们讲Embarked转化为三列 ( ["Embarked=C", "Embarked=Q", "Embarked=S"] ), Sex变为了两列 ( [Sex=female", "Sex=male"] ) 决策树模型# 构造ID3决策树 clf=DecisionTreeClassifier(criterion="entropy") # 决策树训练 clf.fit(train_features, train_labels)模型预测 & 评估
我们首先得到测试集的特征值矩阵, 然后使用训练好的决策树clf进行预测, 得到预测结果: test_features=dvec.transform(test_features.to_dict(orient="record")) # 决策树预测 pred_labels=clf.predict(test_features)
模型评估中,决策树提供了score函数直接得到准确率,但是我们并不知道真实的预测结果,所以无法用预测值和真实的预测结果做比较, 需要使用训练机中的数据进行模型评估, 可以使用决策树自带的score函数计算: # 得到决策树准确率 acc_decision_tree=round(clf.score(train_features, train_labels), 6) acc_decision_tree # 运行结果 0.982043
其实,以上准确率评估并不准确,因为我们用训练集做了训练,再用训练集做准确率评估, 并不能代表决策树分类器的准确率.
要统计决策树分类器的准确率, 可以使用K折交叉验证,
cross_val_score 函数中的参数 cv 代表对原始数据划分成多少份,也就是我们的 K 值,一般建议 K 值取 10,因此我们可以设置 CV=10 import numpy as np from sklearn.model_selection import cross_val_score # 使用K折交叉验证, 统计决策树准确率 np.mean(cross_val_score(clf, train_features, train_labels, cv=10)) # 输出结果 0.7778901373283394
一体化畜禽养殖,温氏股份主业稳步扩张,充分受益行业高景气度(报告出品方分析师西部证券熊航)一温氏股份农业产业化国家重点龙头企业1。1四十年发展,造就一体化畜禽养殖龙头温氏集团前身为1983年创建的新兴县勒竹鸡场,以肉猪肉鸡养殖为主,以奶牛
斧子扔向天空世界上最悲哀的事莫过于你掏心掏肺真心对待的朋友没成想最终她在背后捅了你一刀心寒的透透的人心抵不过人心呐相处几年的人还能在背后把你描述的如此不堪的人社会很单纯复杂的是人心。一个人问禅
今天是我抄书的第三十八天,收益达到14。11每一种花的花期不同,但总会开花,所以静待花开。人也是这样。每个人成长的速度有所不同,但总会长大,所以不要急,慢慢来吧,慢慢长大。随着时间的流逝,很多事情最后都会迎刃而解。时间像沙漏
痛饮了六杯友情真得像美酒一样芬芳浓烈吗?如果让我来回答,我可以毫不犹豫地说是的,友情使人陶醉。人生最美妙的体验,就是和真正的朋友一起举杯。于是我喝了六杯,一杯几乎二两,却没有像以往那样断片。
研究发现每天只进行2分钟的短暂的剧烈活动都与长寿有关每次持续两分钟的剧烈活动,每周总共仅15分钟,与死亡风险的降低有关。这是根据10月27日发表在欧洲心脏病学会(ESC)期刊欧洲心脏杂志上的新研究报告。结果表明,在一周内短时间内积累
中国人寿支持民营和小微企业投资存量规模超2300亿元小微活,就业稳,经济兴。小微企业不仅是吸纳就业的主力军,更是带动投资促进消费的生力军。助力小微企业不仅关乎市场活力,也关乎民生发展。中国人寿始终坚守服务国家发展大局守护人民美好生活
时代要变了?英特尔拿下7家芯片代工业务,或包含台积电5大客户台积电作为全球芯片代工龙头,拥有全球50以上的市场份额,力压三星和英特尔,创造了属于自己的一个时代。但是,2022年以来,台积电传就递出多个危险信号,其状况原本就不是很理想。然而,
经常喝黄芪水,为什么会越来越瘦?喝黄芪水有哪些好处?导语黄芪属于一种非常常见的中药材,具有极高的药用价值,所含的营养成分比较丰富,在很多药物的成分中都能看到黄的身影,除此之外,还可以用来制成药膳,能够起到补气养血,调理脾胃的作用。生
前列腺肥大,功能障碍,以黄芪,水蛭为君,9味药一月收功很多男性朋友在患有前列腺肥大的同时还患有功能障碍,为什么会一下子查出来两个疾病?中医认为,年老肾虚为发病之本。肾处于下焦,开窍于二阴,与膀胱相为表里,统摄全身水液,主水司二便,为机
一个神奇的中成药,祛风除湿,通络止痛,逼出关节骨缝的风寒湿为什么年纪轻轻的,全身关节都不好使了呢?经常出现脖子,肩膀不舒服,扭头伸胳膊都酸痛难忍,有时坐的时间长,腰后侧就开始酸痛发软,严重的腰都直不起来,并且稍微多走几步,膝关节,小腿肚就
贫富差距这件事要辩证看现在贫富差距很大,这个但凡不傻的都知道。但这事也未必就是坏事,让大家知道差距,并提供公平的环境,靠个人努力能改变,就没啥大问题。要是让大家看到差距了,却无法通过个人努力来改变确实挺