泰坦尼克号数据分析

源数据截图
  1. 导入库并加载泰坦尼克号数据集
import pandas #ipython notebook
titanic = pandas.read_csv("titanic_train.csv")
titanic.head(5) # 显示前五条数据
  1. 观察源数据集发现,age属性中有缺失, 通过计算该属性的均值将缺失处填补,使得数据的数量一致
titanic["Age"] = titanic["Age"].fillna(titanic["Age"].median())
print (titanic.describe())
  1. 获取sex的值, 并用0和1代表男性和女性
print (titanic["Sex"].unique())

# Replace all the occurences of male with the number 0.
titanic.loc[titanic["Sex"] == "male", "Sex"] = 0
titanic.loc[titanic["Sex"] == "female", "Sex"] = 1
  1. 获取embarked的值, 用0,1,2分别表示S,C,Q
print (titanic["Embarked"].unique())
titanic["Embarked"] = titanic["Embarked"].fillna('S')
titanic.loc[titanic["Embarked"] == "S", "Embarked"] = 0
titanic.loc[titanic["Embarked"] == "C", "Embarked"] = 1
titanic.loc[titanic["Embarked"] == "Q", "Embarked"] = 2
  1. 使用交叉验证并调用线性回归算法
from sklearn.linear_model import LinearRegression
from sklearn.cross_validation import KFold

# 我们用来预测目标的列
predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"]

# 对线性回归类进行实例化
alg = LinearRegression()
# 为泰坦尼克数据集生成交叉验证折叠。它返回与训练和测试相对应的行索引
# 我们设置了random_state以确保每次运行时都得到相同的分割。
kf = KFold(titanic.shape[0], n_folds=3, random_state=1)

predictions = []
for train, test in kf:
    train_predictors = (titanic[predictors].iloc[train,:])
    # 训练算法的目标.
    train_target = titanic["Survived"].iloc[train]
    # 利用预测器和目标训练算法.
    alg.fit(train_predictors, train_target)
    # 我们现在可以在测试折叠部分做出预测
    test_predictions = alg.predict(titanic[predictors].iloc[test,:])
    predictions.append(test_predictions)
  1. 将predictions放到一个array中
predictions = np.concatenate(predictions, axis=0)
# 将预测映射到结果(只有可能的结果是1和0)
predictions[predictions > .5] = 1
predictions[predictions <=.5] = 0
accuracy = sum(predictions[predictions == titanic["Survived"]]) / len(predictions)
print (accuracy)
线性回归预测结果
  1. 再换一种算法预测, 使用逻辑回归
from sklearn import cross_validation
from sklearn.linear_model import LogisticRegression
alg = LogisticRegression(random_state=1)
# 计算所有交叉验证折叠的精度分数。(比以前简单多了!)
scores = cross_validation.cross_val_score(alg, titanic[predictors], titanic["Survived"], cv=3)
# 取分数的平均值(因为每一组都有一个分数)
print(scores.mean())
逻辑回归算法的预测结果
  1. 对真正测试集进行预处理
titanic_test = pandas.read_csv("test.csv")
titanic_test["Age"] = titanic_test["Age"].fillna(titanic["Age"].median())
titanic_test["Fare"] = titanic_test["Fare"].fillna(titanic_test["Fare"].median())
titanic_test.loc[titanic_test["Sex"] == "male", "Sex"] = 0 
titanic_test.loc[titanic_test["Sex"] == "female", "Sex"] = 1
titanic_test["Embarked"] = titanic_test["Embarked"].fillna("S")

titanic_test.loc[titanic_test["Embarked"] == "S", "Embarked"] = 0
titanic_test.loc[titanic_test["Embarked"] == "C", "Embarked"] = 1
titanic_test.loc[titanic_test["Embarked"] == "Q", "Embarked"] = 2
  1. 使用随机森林
from sklearn import cross_validation
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)
# 计算所有交叉验证折叠的精度分数。
kf = cross_validation.KFold(titanic.shape[0], n_folds=3, random_state=1)
scores = cross_validation.cross_val_score(alg, titanic[predictors], titanic["Survived"], cv=kf)

# 取分数的平均值(因为每一组都有一个分数)
print(scores.mean())
随机森林预测结果1

调优,修改算法参数:

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)

# 取分数的平均值
print(scores.mean())
随机森林预测结果2
  1. 自己构造一个特征
# 生成一个familysize列
titanic["FamilySize"] = titanic["SibSp"] + titanic["Parch"]

# apply方法生成一个新的列
titanic["NameLength"] = titanic["Name"].apply(lambda x: len(x))
import re

#从名称中获取标题的函数.
def get_title(name):
    # 使用正则表达式搜索标题。标题总是由大写字母和小写字母组成,以句号结尾。
    title_search = re.search(' ([A-Za-z]+)\.', name)
    # 如果标题存在,提取并返回它.
    if title_search:
        return title_search.group(1)
    return ""

# 获取所有标题并打印出每个标题出现的频率。
titles = titanic["Name"].apply(get_title)
print(pandas.value_counts(titles))

# 将每个标题映射为整数。有些标题非常罕见,它们被压缩成与其他标题相同的代码。
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Dr": 5, "Rev": 6, "Major": 7, "Col": 7, "Mlle": 8, "Mme": 8, "Don": 9, "Lady": 10, "Countess": 10, "Jonkheer": 10, "Sir": 9, "Capt": 7, "Ms": 2}
for k,v in title_mapping.items():
    titles[titles == k] = v

# 验证我们转换了的所有东西
print(pandas.value_counts(titles))

# 添加到标题列.
titanic["Title"] = titles
  1. 画出各个特征对预测结果的影响关系
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", "FamilySize", "Title", "NameLength"]

# 进行特征选择
selector = SelectKBest(f_classif, k=5)
selector.fit(titanic[predictors], titanic["Survived"])

#获取每个特性的原始p值,并将p值转换为分数
scores = -np.log10(selector.pvalues_)

# 画出成绩。看看“Pclass”、“Sex”、“Title”和“Fare”如何是最好的?
plt.bar(range(len(predictors)), scores)
plt.xticks(range(len(predictors)), predictors, rotation='vertical')
plt.show()

# 只选择四个最好的功能。
predictors = ["Pclass", "Sex", "Fare", "Title"]

alg = RandomForestClassifier(random_state=1, n_estimators=50, min_samples_split=8, min_samples_leaf=4)
  1. 通过bootsing和logistic预测
from sklearn.ensemble import GradientBoostingClassifier
import numpy as np

# 我们要集成的算法.
# 我们使用了线性预测器来进行逻辑回归,以及使用梯度提升分类器.
algorithms = [
    [GradientBoostingClassifier(random_state=1, n_estimators=25, max_depth=3), ["Pclass", "Sex", "Age", "Fare", "Embarked", "FamilySize", "Title",]],
    [LogisticRegression(random_state=1), ["Pclass", "Sex", "Fare", "FamilySize", "Title", "Age", "Embarked"]]
]

# 初始化交叉验证折叠
kf = KFold(titanic.shape[0], n_folds=3, random_state=1)

predictions = []
for train, test in kf:
    train_target = titanic["Survived"].iloc[train]
    full_test_predictions = []
    # 对每一种算法进行预测
    for alg, predictors in algorithms:
        # 根据训练数据拟合算法.
        alg.fit(titanic[predictors].iloc[train,:], train_target)
        # 选择并预测测试折叠.  
        # 要将dataframe转换为所有float,并避免sklearn错误,必须使用.astype(float).
        test_predictions = alg.predict_proba(titanic[predictors].iloc[test,:].astype(float))[:,1]
        full_test_predictions.append(test_predictions)
    # 使用一个简单的整体方案——平均预测得到最终的分类.
    test_predictions = (full_test_predictions[0] + full_test_predictions[1]) / 2
    # 任何大于0.5的值都被假设为1,小于0.5的值为0.
    test_predictions[test_predictions <= .5] = 0
    test_predictions[test_predictions > .5] = 1
    predictions.append(test_predictions)

# 把所有的预测放在一个数组中.
predictions = np.concatenate(predictions, axis=0)

# 通过与训练数据的比较计算准确率.
accuracy = sum(predictions[predictions == titanic["Survived"]]) / len(predictions)
print(accuracy)
预测结果

小结
以上分别使用了'线性回归', '逻辑回归', '随机森林',以及'bootsing+logisic集成学习方法'对数据进行预测

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

推荐阅读更多精彩内容