泰坦尼克号系列(二)——建模和特征工程及其评估

【目录】

建模

逻辑回归

逻辑回归算法是一种很常用的用于二分类的分类算法,我们先用逻辑回归模型试一试。scikit-learn这个包中含有绝大部分数据挖掘需要用到的算法,可以直接引用。
建模之前,我们先引入交叉验证的概念。毕竟建模是一个螺旋上升的过程,需要对每一轮的假设和分析进行评估,再基于当前的评估进行改进,因此我们需要一个评估的工具。交叉验证可用于特征选择、模型选择和参数调优,这里我们先用cross_val_score来做模型选择。

from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
# 初始化逻辑回归分类器
alg = LogisticRegression(random_state=1)
# 计算accuracy score
scores = model_selection.cross_val_score(alg, titanic[predictors], titanic["Survived"],cv=3)#cv默认3倍
predictors_score=predictors_score.append({'predictors':predictors, 'scores':scores.mean(),'model':"LogisticRegression"},ignore_index=True)
#取得分的平均值
print(scores.mean())
#alg.fit(titanic[predictors],titanic["Survived"])

这次得分是:0.787878787879
到这里模型就建好了,然而探索并没有结束。当前得分对于一个二分类问题来说有点低,毕竟瞎蒙都能蒙对50%,所以下面来看看对于同一组特征,别的模型的表现。

随机森林

随机森林这个算法可以称得上人见人爱了吧,在遇到分类问题时,若是不能决断要采取什么算法,可以先试试随机森林,所以这么一个解决了选择综合症难题且表现不俗的算法,人气高点也不奇怪。下面来看看随机森林算法在这个问题中的表现。

from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier

#predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"]

# 初始化随机森林分类器,参数默认
# n_estimators:树的数量
# min_samples_split:划分的最小行数
# min_samples_leaf 最小的叶子数,即树最底层的节点数
alg = RandomForestClassifier(random_state=1, n_estimators=10, min_samples_split=2, min_samples_leaf=1)
#计算accuracy
kf = cross_validation.KFold(titanic.shape[0], n_folds=3, random_state=1)
scores = model_selection.cross_val_score(alg, titanic[predictors], titanic["Survived"], cv=kf)
predictors_score=predictors_score.append({'predictors':predictors, 'scores':scores.mean(),'model':"RandomForest10_2_1"},ignore_index=True)
# 计算平均得分
print(scores.mean())

是不是更亮眼呢?然而并没有,这次的得分是:0.785634118967
这个圆不回去了,怎么办呢。这个其实是这个分类器的状态不太好,参数不太合适,我们调整下参数看看:

alg = RandomForestClassifier(random_state=1, n_estimators=100, min_samples_split=4, min_samples_leaf=2)
kf = cross_validation.KFold(titanic.shape[0], 3, random_state=1)
scores = cross_validation.cross_val_score(alg, titanic[predictors], titanic["Survived"], cv=kf)
predictors_score=predictors_score.append({'predictors':predictors, 'scores':scores.mean(),'model':"RandomForest100_4_2"},ignore_index=True)
print(scores.mean())

此次得分:0.814814814814814。终于没有抽风表现正常了一回,哈哈说笑的。参数是建模很重要的一环,良好的结果离不开最优参数的寻找,俗称参数调优,是个运筹学范畴内的议题,也是我们日常生活中经常面临的一类情景,最简单的情景就是小学课本里的那种数学应用题,找个最优解。

模型评估

模型评估其实也是个比较大的话题,一般有准确率,就是我们用的指标,还有召回率(recall)、ROC以及K-S等指标,说清楚模型评估需要较大篇幅,这里就不展开了。我们暂时就比较accuracy这个指标了。
从得分来看,分类器RandomForestClassifier(random_state=1, n_estimators=100, min_samples_split=4, min_samples_leaf=2)表现要优于 LogisticRegression(random_state=1),最后我们采用优化过参数的随机森林分类器。
对应不同的需求我们有不一样的衡量模型的标准,要结合具体的实际情况做不同的选择。
模型评估暂时就到这里,下面我们进行数据挖掘的另一个重头戏:特征工程。

特征工程

在学神经网络的时候老师曾提到了蝴蝶效应,就是想说明输入对系统的输出有很大的影响。放在数据挖掘这里也同样适用,神经网络也是数据挖掘会用到的算法之一,其他算法不一定有这么夸张,但是影响也是不容小觑的。特征的选取对成本和结果都有很大的影响,好的输入不一定有好的输出,但是要想从一堆噪音中得到好结果,那几乎是不可能的。
scikit-learn真的是一个很强大的库,特征选择我们也直接在这里引用相对应的API。
之前根据初步的分析我们选了一组特征,现在我们用SelectKBest,和f_classif来帮助我们看看前面的的特征的价值到底怎么样。

#特征价值
import numpy as np
from sklearn.feature_selection import SelectKBest, f_classif
import matplotlib.pyplot as plt
predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"]

# Perform feature selection
selector = SelectKBest(f_classif, k=5)
selector.fit(titanic[predictors], titanic["Survived"])

# Get the raw p-values for each feature, and transform from p-values into scores
scores = -np.log10(selector.pvalues_)

# Plot the scores.  See how "Pclass", "Sex", "Title", and "Fare" are the best?
plt.bar(range(len(predictors)), scores)
plt.xticks(range(len(predictors)), predictors, rotation='vertical')
plt.show()


可以看到Pclass、Sex和Fare表现比较突出,其他特征不那么明显是不是就一定要舍弃呢,不一定啊,说不定挖掘的方向或者说预处理方式不对呢。可以一个一个假设去试,如果再也想不到别的了或者时间不允许了或者有别的限制条件,我们再酌情放弃这些特征。
结合之前对数据的基本分析,年龄这个属性在岁数这个数值上可能区分不是那么明显,毕竟分析的时候不是说几岁就一定获救或是不获救,当时是猜测某一年龄段的人更容易获救,比如孩子,所以我们按幼儿、儿童、青少年、青年、中年和老年这种年龄阶段来区分,将年龄离散化。这里用pandas的cut来切片,生成AgeB这个特征代替Age。

可以看到Age的表现有提升,虽然不是很多。我们再来看看横向的那些放弃了的特征,比如文字类的特征。再来研究下name这个属性,逃生时会不会因为头衔不一样而享受不一样的待遇呢,和名字长度有没有关系呢,名字长度是不是在一定程度上也代表了身份地位呢,英文姓名有融合先辈的姓名,如果经济或地位不好的话,应该不会这么讲究?就像我们中国,大家族起名字会暗合辈分,但是穷苦人家可能就比较随意了。来看看数据怎么说吧。

捉到了2只表现还不错的特征。
我们来看看全部特征都用上的时候的得分:0.829405162738496
只取重要的特征时候的得分:0.81705948372615034
这个放弃特征要谨慎啊,还是先保留吧,对重要特征心里有数。
第一轮改进到这里就结束了,接下来继续第二轮改进。
【目录】

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

推荐阅读更多精彩内容