kaggle之泰坦尼克号乘客死亡预测

前言

一般接触kaggle的入门题,已知部分乘客的年龄性别船舱等信息,预测其存活情况,二分类问题。
python,所需库 机器学习scikit-learn,数据分析pandas,科学计算numpy,画图工具matplotlib,详细的指导说明
本篇大多是整理了下寒小阳的博文,按照他的思路先熟悉一下。

相关性分析

数据


数据如表所示,Pclass 等级,Sibsp 同辈亲戚人数,Parch长辈或者晚辈亲戚人数,Ticket 票号,Fare票价,Cabin 船舱号,Embarked 登陆港口。

数据特点

1.data_train.describe()查看数据分布信息。

       PassengerId    Survived      Pclass         Age       SibSp       Parch        Fare  
count   891.000000  891.000000  891.000000  714.000000  891.000000  891.000000  891.000000  
mean    446.000000    0.383838    2.308642   29.699118    0.523008    0.381594   32.204208  
std     257.353842    0.486592    0.836071   14.526497    1.102743    0.806057   49.693429  
min       1.000000    0.000000    1.000000    0.420000    0.000000    0.000000    0.000000 
25%     223.500000    0.000000    2.000000   20.125000    0.000000    0.000000    7.910400  
50%     446.000000    0.000000    3.000000   28.000000    0.000000    0.000000   14.454200  
75%     668.500000    1.000000    3.000000   38.000000    1.000000    0.000000   31.000000 
max     891.000000    1.000000    3.000000   80.000000    8.000000    6.000000  512.329200  

2.data_train.info()查看数据类型,数据量,其中反应了缺失数据以及需要数值化的变量。

<class 'pandas.core.frame.DataFrame'>
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

3.plot查看数据分布情况


4.分析

  • 透过图表,我们看到绝大多数人是没有存活
  • 3rd船票最多,1st和2nd相差不大,不同船舱的人有着不同的social-economy state,船舱的就生设备可能也不一样,1st存活可能性应该更高。
  • 中年人居多,小孩女人和老人获救可能性更大,年龄性别是个重要的参考因素
  • 来自S登船口岸的居多,不同地方的人经济地位也可能不一样
  • 独自一人来占大多数,按常识有陪伴的获救可能性大些
  • 曲线都基本符合高斯分布

相关性分析

探寻不同属性与是否存活的相关性,为后面的特征工程中特征选取做准备,不过本题中的特征基本上都能利用上。
1.Sex & Survived
女性获救人数要高过男性

2.Pclass & Survived
相对来说1号船舱获救人数多

3.SibSp & Survived
有陪伴的存活率相对较高

4.Parch & Survived
有陪伴的存活率相对较高

5.Age & Survived (18岁分界)
小孩获救概率要高

6.Cabin & Survived
因为Cabin存在很多缺失数据,在这里考虑将是否记录作为一组数据,含有Cabin为1,不含为0

7.Embarked & Survived
S死亡率较高,其次Q,C

数据预处理

数据预处理,包含了很多特征工程(feature engineering)的内容,常见的包含

  • 数据清洗
    • 缩放特征值
    • 处理离群点
    • 分箱(离散化)
    • 遗漏值填补
    • 平滑
    • 正则化
  • 降维(解决维数灾难问题)
    • PCA主成分分析(以下都没了解过)
    • 核化线性降维
    • 主成分回归
  • 特征选择(选取与学习任务相关的特征,例如剔除冗余特征)
    • 过滤式选择
    • 包裹式选择
    • 嵌入式选择

在原始数据中,Age,Cabin部分数据丢失,Cabin采用的方法是将不存在的数据设为一类,存在设为一类,Age缺失的数据比较少,可以利用其他数据拟合的方法得到。如果数据丢失很多,可以丢弃,拟合缺失数据往往会带来很多噪音。
在这里针对年龄数据进行拟合。scikitlearn中回归的方法很多,包含基本回归方法(线性、决策树、SVM、KNN)和集成方法(随机森林,Adaboost和GBRT)等这里使用决策树试一哈
对Cabin分类有无两类,对类目性特征因子化(比如Pclass为1时,Pclass_1 = 1,Pclass_2 = Pclass_3 = 0),将类目属性变成01属性。
接下来对部分属性数据进行缩放scaling到[-1,1]范围内,因为Fare和Age比较大, 在使用Logistic回归时候可能不收敛。

from sklearn import tree
import pandas as pd
import sklearn.preprocessing as preprocessing
def set_missing_ages(df):
    age_df = df[['Age','Fare','Parch','SibSp','Pclass']]
   #df.info()
    unknown_age = age_df[age_df.Age.isnull()]
   # unknown_age.info()
    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:]
    dtr = tree.DecisionTreeRegressor()
    dtr.fit(X, y)
    predictedAges = dtr.predict(unknown_age[:,1:])
    df.loc[(df.Age.isnull(),'Age')] = predictedAges
    return df,dtr

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

def Dummies(data_train):
    dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix= 'Cabin')
    dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')
    dummies_Sex = pd.get_dummies(data_train['Sex'], prefix= 'Sex')
    dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')
    df = pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
    df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)
    return df

def scale(df):
    scaler = preprocessing.StandardScaler()  
    # age_scale_param = scaler.fit(df[['Age']])  
    df['Age_scaled'] = scaler.fit_transform(df[['Age']])  
    # fare_scale_param = scaler.fit(df[['Fare']])  
    df['Fare_scaled'] = scaler.fit_transform(df[['Fare']])  
    return df

data_test = pd.read_csv('train.csv')
#data_test = data_test[152:153]
#print(data_test)
data_test = set_Cabin_type(data_test)
data_test, dtr = set_missing_ages(data_test)
data_test = Dummies(data_test)
data_test = scale(data_test)

对测试数据同样要进行相同的预处理。

预测模型

Logistic回归训练模型

from sklearn import linear_model
import pandas as pd
#df = pd.read_csv("train.csv")
df = data_train.filter(regex = 'Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
df_np = df.as_matrix()
X = df_np[:,1:]
Y = df_np[:,0]
lr = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6)
lr.fit(X, Y)

测试模型

from sklearn import linear_model
import pandas as pd
df_test = pd.read_csv('test.csv')
data_test = data_test.filter(regex = 'Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
data_test.info()
predictions = lr.predict(data_test)
result = pd.DataFrame({'PassengerId':df_test['PassengerId'].as_matrix(), 'Survived':predictions.astype(np.int32)})
result.to_csv("logistic_regression_predictions.csv", index=False)

提交后识别率0.77511

模型优化

查看Logistics回归中参数

        columns                    coef
0         SibSp   [-0.3381454779319025]
1         Parch   [-0.1064602610081524]
2      Cabin_No  [-0.43037949159765415]
3     Cabin_Yes    [0.4995693787782281]
4    Embarked_C                   [0.0]
5    Embarked_Q                   [0.0]
6    Embarked_S   [-0.4044885229471587]
7    Sex_female     [2.371995280082146]
8      Sex_male  [-0.27587171480659783]
9      Pclass_1   [0.34926690132602034]
10     Pclass_2                   [0.0]
11     Pclass_3   [-1.1852811813447819]
12   Age_scaled   [-0.5456032666714946]
13  Fare_scaled   [0.08190439585453066]
posted @ 2018-08-03 13:26  御心飞行  阅读(996)  评论(0编辑  收藏  举报