泰坦尼克号问题

学习了机器学习这么久,第一次真正用机器学习中的方法解决一个实际问题,一步步探索,虽然最后结果不是很准确,仅仅达到了0.78647,但是真是收获很多,为了防止以后我的记忆虫上脑,我决定还是记录下来好了。

1,看到样本是,查看样本的分布和统计情况

#查看数据的统计信息print(data_train.info())#查看数据关于数值的统计信息print(data_train.describe())

通常遇到缺值的情况,我们会有几种常见的处理方式

  • 如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果了,或者考虑有值的是一类,没有值的是一类,
  • 如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中
  • 如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(比如这里的age,我们可以考虑每隔2/3岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中。
  • 有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。

随机森林的方法用来填充数据

from sklearn.ensemble import RandomForestRegressor

### 使用 RandomForestClassifier 填补缺失的年龄属性
def set_missing_ages(df):

    # 把已有的数值型特征取出来丢进Random Forest Regressor中
    age_df = df[[‘Age‘,‘Fare‘, ‘Parch‘, ‘SibSp‘, ‘Pclass‘]]

    # 乘客分成已知年龄和未知年龄两部分
    known_age = age_df[age_df.Age.notnull()].as_matrix()
    unknown_age = age_df[age_df.Age.isnull()].as_matrix()

    # y即目标年龄
    y = known_age[:, 0]

    # X即特征属性值
    X = known_age[:, 1:]

    # fit到RandomForestRegressor之中
    rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
    rfr.fit(X, y)

    # 用得到的模型进行未知年龄结果预测
    predictedAges = rfr.predict(unknown_age[:, 1::])

    # 用得到的预测结果填补原缺失数据
    df.loc[ (df.Age.isnull()), ‘Age‘ ] = predictedAges 

    return df, rfr

def set_Cabin_type(df):
    df.loc[ (df.Cabin.notnull()), ‘Cabin‘ ] = "Yes"
    df.loc[ (df.Cabin.isnull()), ‘Cabin‘ ] = "No"
    return df

data_train, rfr = set_missing_ages(data_train)
data_train = set_Cabin_type(data_train)

2,接下来就是特征工程了,这一步比较复杂,就是选择特征,

特征工程的处理方法包括很多种,可以在我的特征工程的博客中找到。

随机森林特征选择方法:通过加入噪音值前后的错误率的差值来判断特征值的重要程度。

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"]  

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

#Plot 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()  

#Pick only the four best features.
predictors=["Pclass","Sex","Fare","Title"]  

alg=RandomForestClassifier(random_state=1,n_estimators=50,min_samples_split=8,min_samples_leaf=4)  

然后就是模型选择了,

不能找到一个在所有数据上都表现好的模型,这就需要一步一步的验证了,而且同一个模型的不同参数,对结果影响也很大,在解决这个问题中我主要用了n折交叉验证来验证模型的准确率,选择准确率高的模型,然后通过曲线来模拟这些过程,还有一个可以考虑的点就是boosting方法,把许多个弱分类器的结果整合起来,还可以给每个弱分类器一定的权值。

//集成多种算法求平均的方法来进行机器学习求解
from sklearn.ensemble import GradientBoostingClassifier
import numpy as  np  

#The algorithms we want to ensemble.
#We‘re using the more linear predictors for the logistic regression,and everything with the gradient boosting classifier
algorithms=[
    [GradientBoostingClassifier(random_state=1,n_estimators=25,max_depth=3, ["Pclass","Sex","Age","Fare","FamilySize","Title","Age","Embarked"]]
    [LogisticRegression(random_state=1),["Pclass","Sex","Fare","FamilySize","Title","Age","Embarked"]]
]  

#Initialize the cross validation folds
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=[]
    #Make predictions for each algorithm on each fold
    for alg,predictors in algorithms:
        #Fit the algorithm on the training data
        alg.fit(titanic[predictors].iloc[train,:],train_targegt)
        #Select and predict on the test fold
        #The .astype(float) is necessary to convert the dataframe to all floats and sklearn error.
        test_predictions=alg.predict_proba(titanic[predictors].iloc[test,:].astype(float))[:,1]
    #Use a simple ensembling scheme -- just  average the predictions to get the final classification.
    test_predictions=(full_test_predictions[0]+full_test_predictions[1])/2
    #Any value over .5 is assumed to be a 1 prediction,and below .5 is a 0 prediction.
    test_predictions[test_predictions<=0.5]=0
    test_predictions[test_predictions>0.5]=1
    predictions.append(test_predictions)  

#Put all the predictions together into one array.
predictions=np.concatenate(predictions,axis=0)  

#Compute accuracy by comparing to the training data
accuracy=sum(predictions[predictions==titanic["Survived"]])/len(predictions)
print(accuracy)  

#The gradient boosting classifier generates better predictions,so we weight it higher
predictions=(full_predictions[0]*3+full_predictions[1]*1)/4
predictions  

这个问题参考了很多的博客或教材:

这个问题的视频讲解 http://study.163.com/course/courseLearn.htm?courseId=1003551009&from=study&edusave=1#/learn/video?lessonId=1004052093&courseId=1003551009

使用sklearn进行kaggle案例泰坦尼克Titanic船员获救预测

数据科学工程师面试宝典系列之二---Python机器学习kaggle案例:泰坦尼克号船员获救预测

kaggle之泰坦尼克的沉没

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

经典又兼具备趣味性的Kaggle案例泰坦尼克号问题

kaggle实战之Titanic (1)-预处理

kaggle实战之Titanic(2)-分类器的选择与实现

kaggle入门泰坦尼克之灾内容总结

我的代码已经上传至   github

原文地址:https://www.cnblogs.com/cmybky/p/11772591.html

时间: 2024-10-31 20:37:44

泰坦尼克号问题的相关文章

用不同方法在R中进行泰坦尼克号幸存者预测练习

现有数据维度:PassengerId survival 生存 0 = No, 1 = Yespclass 票类 社会经济地位,1 = Upper, 2 = Middle, 3 = Lowersex 性别 Age 年龄 sibsp 兄弟姐妹/配偶在泰坦尼克号上 parch 父母/孩子在泰坦尼克号上 ticket 票号fare 客运票价 cabin 舱位数量embarked 始发港 C = Cherbourg, Q = Queenstown, S = Southampton 读取数据,可知船上共有8

Kaggle项目泰坦尼克号预测生存情况(上)-------数据预处理

假期闲着无聊,做了一下Kaggle练手的项目--预测泰坦尼克号乘客的存活情况.对于一些函数和算法,刚开始也是懵懵懂懂的,但通过自己查资料,还是明白了许多,我会把参考资料的网址放在需要查看的地方. ------------------------------------ 我们的整个流程如下: ①数据预处理:数据清洗.可视化.标签化 ②分割训练数据 ③随机森林分类器及其参数调节 数据预处理:数据清洗.可视化.标签化 首先,先导入需要的模块并读取数据 #导入包,读取数据 import numpy as

泰坦尼克号生存预测

从Kaggle官网下载数据:train .test. 赛事描述: 泰坦尼克号的沉没是历史上最臭名昭著的沉船之一.1912年4月15日,泰坦尼克号在处女航时与冰山相撞沉没,2224名乘客和船员中有1502人遇难.这一耸人听闻的悲剧震惊了国际社会,并导致更好的船舶安全法规.船难造成如此巨大的人员伤亡的原因之一是船上没有足够的救生艇供乘客和船员使用.虽然在沉船事件中幸存下来是有运气因素的,但有些人比其他人更有可能存活下来.比如妇女.儿童和上层阶级. 在此次比赛中,我们需要参赛者预测哪一类人更有可能存活

泰坦尼克号之灾分析

大神经验: 1.应用机器学习,千万不要一上来就试图做到完美,先撸一个baseline的model出来,再进行后续的分析步骤,一步步提高,所谓后续步骤可能包括『分析model现在的状态(欠/过拟合),分析我们使用的feature的作用大小,进行feature selection,以及我们模型下的bad case和产生的原因』等等. 2. 对数据的认识太重要了! 数据中的特殊点/离群点的分析和处理太重要了! 特征工程(feature engineering)太重要了!在很多Kaggle的场景下,甚至

泰坦尼克号生存预测(python)

1 数据探索 对数据进行一个整体的理解 1.1 查看数据都有一些什么特征 import pandas as pd import seaborn as sns %matplotlib inline titanic = pd.read_csv('G:\\titanic\\train.csv')titanic.sample(10) 获取数据的10行记录进行观察,初步了解数据的组成,可以看到Age.Cabin里面是存在缺失值的,在进一步理解数据的统计量后再进行数据处理,观察各特征的最大最小值等,可以发现

Kaggle案例泰坦尼克号问题

泰坦里克号预测生还人口问题 泰坦尼克号问题背景 - 就是那个大家都熟悉的『Jack and Rose』的故事,豪华游艇倒了,大家都惊恐逃生,可是救生艇的数量有限,无法人人都有,副船长发话了lady and kid first!,所以是否获救其实并非随机,而是基于一些背景有rank先后的. - 训练和测试数据是一些乘客的个人信息以及存活状况,要尝试根据它生成合适的模型并预测其他人的存活状况. 一.数据预处理 1.初探数据 import pandas as pd #数据分析 import numpy

泰坦尼克号事实,用数据还原真相——Titanic获救率分析(用pyecharts)

泰坦尼克号获救率数据分析报告,用数据揭露真相. 一,船上乘客生存率分析报告 泰坦尼克号生存率仅有38%的,可见此次事件救援不力,救生艇严重不足,且泰坦尼克号号撞得是冰山,海水冷,没有救生艇,在水里冻死的乘客不少. 二,哪个年龄段存活率最高(青年人(18岁以下),中年人(18到50岁),老年人(50岁以上)) 数据分析:看图我们得到,年轻人获救率最高50%,老年人获救率最低0.39,中年人死亡人数最多.发生生命危险时,自救能力最强的中年人还是起到了中流砥柱的作用.不要再叫猥琐油腻中年男了哦,他们才

机器学习第一步——用逻辑回归及随机森林实现泰坦尼克号的生存预测

1.实验背景 本次实验是Kaggle上的一个入门比赛——Titanic: Machine Learning from Disaster.比赛选择了泰坦尼克号海难作为背景,并提供了样本数据及测试数据,要求我们根据样本数据内容建立一个预测模型,对于测试数据中每个人是否获救做个预测.样本数据包括891条乘客信息及获救情况,测试数据有418条乘客信息.样本数据的样例如下: Passenger:乘客唯一识别id Survived:是否存活,0为否,1为是 Pclass:船舱等级,1.2.3等 Name:姓

数据挖掘竞赛kaggle初战——泰坦尼克号生还预测

1.题目 这道题目的地址在https://www.kaggle.com/c/titanic,题目要求大致是给出一部分泰坦尼克号乘船人员的信息与最后生还情况,利用这些数据,使用机器学习的算法,来分析预测另一部分人员最后是否生还.题目练习的要点是语言和数据分析的基础内容(比如python.numpy.pandas等)以及二分类算法. 数据集包含3个文件:train.csv(训练数据).test.csv(测试数据).gender_submission.csv(最后提交结果的示例,告诉大家提交的文件长什

通过正则表达式提取泰坦尼克号字幕里的所有台词

这段时间有空就看泰坦尼克号的电影,看了一遍又一遍,以前看不懂,现在是越品越有味道,也羡慕男主角可以活得这么洒脱,也不能说羡慕,只能说每个人有不同的人生吧.然后网上搜一下看看有没有字幕,找了好久也没找到合适的字幕,要么不完整,要么收费,要么数据是错乱的.我的预期合理的字幕是一个有中英文对照版的,然后按照格式一行行的排列,比如一行英文,一行中文,外加一行对应电影的时间 怎么办呢,想到了电影里的字幕,字幕里有数据的,字幕的数据格式也是统一的,自己利用正则提取一下就好了,本来想用javascript来实