项目成果:泰坦尼克号生存预测

关键词

数据分析流程,经典分析方法,模型性能测评

项目背景

通过多角度分析确定特征变量,使用sklearn机器学习包,调用用经典模型,对幸存率进行预测,最终给出模型解释。

获得技能

一般特征分析方法,调用经典模型,性能评价,通过决策树解释模型。

一、提出问题

  1. 哪些单一特征群体的幸存率较大?
  2. 怎样的复合特征群体的幸存率较大?
  3. 最终选择的特征间如果存在较大相关性,是否会降低预测准确率?

二、数据加工

导入库

In [2]:
# 添加会用到的库
import numpy as np
import pandas as pd 
import os
import random as rnd
print(os.listdir('C:/Users/spark/Desktop/ML101/project-titanic/raw_data'))

# 可视化
import seaborn as sns
import matplotlib.pyplot as plt
# magic命令,确保作图在当前页面显示,但同行代码不能有中文
%matplotlib inline 

# 机器学习
from sklearn.linear_model import LogisticRegression # 分类:逻辑回归
from sklearn.linear_model import SGDClassifier # 分类:梯度下降
from sklearn.svm import LinearSVC # 分类:支持向量机
from sklearn.tree import DecisionTreeClassifier # 分类:决策树
from sklearn.ensemble import RandomForestClassifier # 分类:随机森林
from sklearn.ensemble import GradientBoostingClassifier # 分类:梯度提升决策树
from sklearn.neighbors import KNeighborsClassifier # 分类:k邻近
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron
['test.csv', 'train.csv']

查看字段

In [3]:
# 获取数据文件
train_df = pd.read_csv('C:/Users/spark/Desktop/ML101/project-titanic/raw_data/train.csv')
predict_df = pd.read_csv('C:/Users/spark/Desktop/ML101/project-titanic/raw_data/test.csv')
combined = [train_df, predict_df]
full_df = train_df.append(predict_df, ignore_index=True)
print(train_df.columns.values)
['PassengerId' 'Survived' 'Pclass' 'Name' 'Sex' 'Age' 'SibSp' 'Parch'
 'Ticket' 'Fare' 'Cabin' 'Embarked']
C:\Users\spark\Anaconda3\lib\site-packages\pandas\core\frame.py:6211: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  sort=sort)

有一些二分类数据:survived,sex,embarked

还有一些数值型数据,可以分为离散的、连续的、时间序列的

  • 离散的:sibsp(sibling/spouse),parch(parents/children)
  • 连续的:age,fare
In [4]:
train_df.head()
Out[4]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

survival:生存状态

pclass:船舱等级

embarked:登船地点

查看数据统计信息

In [5]:
full_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 12 columns):
Age            1046 non-null float64
Cabin          295 non-null object
Embarked       1307 non-null object
Fare           1308 non-null float64
Name           1309 non-null object
Parch          1309 non-null int64
PassengerId    1309 non-null int64
Pclass         1309 non-null int64
Sex            1309 non-null object
SibSp          1309 non-null int64
Survived       891 non-null float64
Ticket         1309 non-null object
dtypes: float64(3), int64(4), object(5)
memory usage: 122.8+ KB
In [6]:
train_df.describe()
Out[6]:
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

完整性

应fillna的字段:age,cabin(较多),embarked,fare

有效性

应drop的字段:passengerid,name,ticket,cabin缺乏有效信息

合并、分解特征

  • sibsp+parch-->family
  • name-->title
  • age-->age_bands
  • fare-->fare_ranges

经验假设

女性、孩子、高等舱的幸存率更高

三、数据探索

In [7]:
# 验证假设
# Sex
train_df[['Sex', 'Survived']].groupby(['Sex'], as_index=False)\
.mean().sort_values(by='Survived', ascending=False)
Out[7]:
Sex Survived
0 female 0.742038
1 male 0.188908
In [8]:
# Age
g = sns.FacetGrid(train_df, col='Survived')
#g.map(plt.hist, 'Age', bins=20)
g.map(sns.distplot, 'Age',rug=True,
hist_kws={'color':'blue','label':'hist'},
kde_kws={'color':'red','label':'KDE'},)
g.add_legend()
C:\Users\spark\Anaconda3\lib\site-packages\scipy\stats\stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
Out[8]:
<seaborn.axisgrid.FacetGrid at 0x238ad421d68>

Observations

  • 人数最多:15-35岁
  • 幸存率高:婴儿(0-4岁),老年人(80岁)
  • 幸存率低:15-25岁
In [9]:
# Pclass
train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False)\
.mean().sort_values(by='Survived', ascending=False)
Out[9]:
Pclass Survived
0 1 0.629630
1 2 0.472826
2 3 0.242363
In [10]:
# Pclass&Age
g = sns.FacetGrid(train_df, col='Survived', row='Pclass', height=2.2, aspect=1.6)
g.map(plt.hist, 'Age', alpha=0.5, bins=20)
g.add_legend()
Out[10]:
<seaborn.axisgrid.FacetGrid at 0x238ad85e400>

Observations

  • 人数最多:pclass=3
  • 幸存率高:pclass=1,婴儿(pclass=1,2)
  • 幸存率低:pclass=3

Decisions

特征选择:pclass=3的幸存率区分度大

In [11]:
# Embarked
g = sns.FacetGrid(train_df, row='Embarked', height=2.2, aspect=1.6)
g.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', palette='deep')
g.add_legend()
C:\Users\spark\Anaconda3\lib\site-packages\seaborn\axisgrid.py:715: UserWarning: Using the pointplot function without specifying `order` is likely to produce an incorrect plot.
  warnings.warn(warning)
C:\Users\spark\Anaconda3\lib\site-packages\seaborn\axisgrid.py:720: UserWarning: Using the pointplot function without specifying `hue_order` is likely to produce an incorrect plot.
  warnings.warn(warning)
C:\Users\spark\Anaconda3\lib\site-packages\scipy\stats\stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
Out[11]:
<seaborn.axisgrid.FacetGrid at 0x238adb5b0b8>

Observations

  • 幸存率高:女性,男性(embarked=C)

Decisions

特征选择:sex、embarked=C的幸存率区分度大

In [12]:
# Fare
g = sns.FacetGrid(train_df, row='Embarked', col='Survived', height=2.2, aspect=1.6)
g.map(sns.barplot, 'Sex', 'Fare', alpha=.5, ci=None)
g.add_legend()
C:\Users\spark\Anaconda3\lib\site-packages\seaborn\axisgrid.py:715: UserWarning: Using the barplot function without specifying `order` is likely to produce an incorrect plot.
  warnings.warn(warning)
Out[12]:
<seaborn.axisgrid.FacetGrid at 0x238add2fd30>

Observations

  • 幸存率高
    • 女性:S、C,且(平均)票价高
    • 男性:C,且(平均)票价高

Decisions

特征选择:划分票价区间

四、数据再加工

修复完整性和无效性

In [13]:
# 修复完整性和无效性
full_df['Age'].fillna(full_df['Age'].mean(), inplace=True)
full_df['Embarked'].fillna(full_df['Embarked'].dropna().mode()[0], inplace=True)
full_df['Fare'].fillna(full_df['Fare'].dropna().median(), inplace=True)
full_df.drop(['Cabin', 'Ticket'], axis=1, inplace=True)
full_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 10 columns):
Age            1309 non-null float64
Embarked       1309 non-null object
Fare           1309 non-null float64
Name           1309 non-null object
Parch          1309 non-null int64
PassengerId    1309 non-null int64
Pclass         1309 non-null int64
Sex            1309 non-null object
SibSp          1309 non-null int64
Survived       891 non-null float64
dtypes: float64(3), int64(4), object(3)
memory usage: 102.3+ KB

特征转换:将类别转换为数字

In [14]:
# 特征转换:将类别转换为数字
full_df['Sex'] = full_df['Sex'].map({'female':1, 'male':0}).astype(int)
full_df['Embarked'] = full_df['Embarked'].map({'S':0,'Q':1,'C':2}).astype(int)
In [15]:
full_df.head()
Out[15]:
Age Embarked Fare Name Parch PassengerId Pclass Sex SibSp Survived
0 22.0 0 7.2500 Braund, Mr. Owen Harris 0 1 3 0 1 0.0
1 38.0 2 71.2833 Cumings, Mrs. John Bradley (Florence Briggs Th... 0 2 1 1 1 1.0
2 26.0 0 7.9250 Heikkinen, Miss. Laina 0 3 3 1 0 1.0
3 35.0 0 53.1000 Futrelle, Mrs. Jacques Heath (Lily May Peel) 0 4 1 1 1 1.0
4 35.0 0 8.0500 Allen, Mr. William Henry 0 5 3 0 0 0.0

相关系数矩阵

In [16]:
# 相关系数矩阵
r_df = full_df.corr()
r_df
Out[16]:
Age Embarked Fare Parch PassengerId Pclass Sex SibSp Survived
Age 1.000000 0.071181 0.170851 -0.130872 0.025731 -0.366371 -0.057397 -0.190747 -0.070323
Embarked 0.071181 1.000000 0.238131 -0.044772 0.051977 -0.185479 0.097960 -0.065567 0.167675
Fare 0.170851 0.238131 1.000000 0.221635 0.031128 -0.558683 0.185681 0.160349 0.257307
Parch -0.130872 -0.044772 0.221635 1.000000 0.008942 0.018322 0.213125 0.373587 0.081629
PassengerId 0.025731 0.051977 0.031128 0.008942 1.000000 -0.038354 -0.013406 -0.055224 -0.005007
Pclass -0.366371 -0.185479 -0.558683 0.018322 -0.038354 1.000000 -0.124617 0.060832 -0.338481
Sex -0.057397 0.097960 0.185681 0.213125 -0.013406 -0.124617 1.000000 0.109609 0.543351
SibSp -0.190747 -0.065567 0.160349 0.373587 -0.055224 0.060832 0.109609 1.000000 -0.035322
Survived -0.070323 0.167675 0.257307 0.081629 -0.005007 -0.338481 0.543351 -0.035322 1.000000
In [17]:
# 热力图
#import matplotlib.pyplot as plt
#import seaborn as sns
f,ax = plt.subplots(figsize=(6,3)) # 设定画幅
sns.heatmap(r_df, vmax =1, square=True, center=0) # 生成热力图
# 调整坐标标签方向
#label_x = ax.get_xticklabels()
#plt.setp(label_x , rotation = 90)
plt.show()

特征转换:划分数值区间(分箱)

In [18]:
# 划分数值区间
# Age
# 调试区间:查看年龄区间的幸存率
train_df['AgeBand'] = pd.cut(train_df['Age'], 4)
train_df[['AgeBand', 'Survived']].groupby(['AgeBand'], as_index=False)\
.mean().sort_values(by='AgeBand', ascending=True)
Out[18]:
AgeBand Survived
0 (0.34, 20.315] 0.458101
1 (20.315, 40.21] 0.397403
2 (40.21, 60.105] 0.390625
3 (60.105, 80.0] 0.227273
In [19]:
# 按照上方区间,修改Age为分组编号
full_df['Age'] = full_df['Age'].map(lambda x:0 if x<=20 else x)
full_df['Age'] = full_df['Age'].map(lambda x:1 if 20<x<=40 else x)
full_df['Age'] = full_df['Age'].map(lambda x:2 if 40<x<=60 else x)
full_df['Age'] = full_df['Age'].map(lambda x:3 if 60<x else x)
full_df['Age'] = full_df['Age'].map(lambda x:int(x))
In [20]:
# Fare
# 调试区间:查看年龄区间的幸存率
train_df['FareBand'] = pd.qcut(train_df['Fare'], 4)
train_df[['FareBand', 'Survived']].groupby(['FareBand'], as_index=False)\
.mean().sort_values(by='FareBand', ascending=True)
Out[20]:
FareBand Survived
0 (-0.001, 7.91] 0.197309
1 (7.91, 14.454] 0.303571
2 (14.454, 31.0] 0.454955
3 (31.0, 512.329] 0.581081
In [21]:
full_df['Fare'] = full_df['Fare'].map(lambda x:0 if x<=7.91 else x)
full_df['Fare'] = full_df['Fare'].map(lambda x:1 if 7.91<x<=14.454 else x)
full_df['Fare'] = full_df['Fare'].map(lambda x:2 if 14.454<x<=31.0 else x)
full_df['Fare'] = full_df['Fare'].map(lambda x:3 if 31.0<x else x)
full_df['Fare'] = full_df['Fare'].map(lambda x:int(x))
full_df.head()
Out[21]:
Age Embarked Fare Name Parch PassengerId Pclass Sex SibSp Survived
0 1 0 0 Braund, Mr. Owen Harris 0 1 3 0 1 0.0
1 1 2 3 Cumings, Mrs. John Bradley (Florence Briggs Th... 0 2 1 1 1 1.0
2 1 0 1 Heikkinen, Miss. Laina 0 3 3 1 0 1.0
3 1 0 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) 0 4 1 1 1 1.0
4 1 0 1 Allen, Mr. William Henry 0 5 3 0 0 0.0

特征转换:从文本中截取关键字

In [22]:
# Name
# 从name中提取title
def title_split(name):
    start = name.find(',') + 1
    end = name.find('.')
    return name[start:end].strip()

train_df['Title'] = train_df['Name'].map(title_split)
train_df['Title'].value_counts()
Out[22]:
Mr              517
Miss            182
Mrs             125
Master           40
Dr                7
Rev               6
Mlle              2
Col               2
Major             2
Capt              1
Mme               1
the Countess      1
Jonkheer          1
Don               1
Lady              1
Ms                1
Sir               1
Name: Title, dtype: int64
In [23]:
train_df['Title'] = train_df['Title'].map(lambda x:1 if x in ['Miss', 'Mrs'] else 0)
train_df[['Title', 'Survived']].groupby(['Title'], as_index=False)\
.mean().sort_values(by='Survived', ascending=True)
Out[23]:
Title Survived
0 0 0.198630
1 1 0.736156

Observations

  • 仅Mr、Miss、Mrs的样本容量充分
  • Mr、Miss同向,Mr则相反

Decisions

将Miss、Mrs分为一组,其它分为另一组。

In [24]:
full_df['Title'] = full_df['Name'].map(title_split)
full_df['Title'] = full_df['Title'].map(lambda x:1 if x in ['Miss', 'Mrs'] else 0)
full_df.drop('Name', axis=1, inplace=True)
full_df.head()
Out[24]:
Age Embarked Fare Parch PassengerId Pclass Sex SibSp Survived Title
0 1 0 0 0 1 3 0 1 0.0 0
1 1 2 3 0 2 1 1 1 1.0 1
2 1 0 1 0 3 3 1 0 1.0 1
3 1 0 3 0 4 1 1 1 1.0 1
4 1 0 1 0 5 3 0 0 0.0 0
In [25]:
# sibsp+parch-->family
train_df['Family'] = train_df['Parch'] + train_df['SibSp'] + 1
train_df[['Family', 'Survived']].groupby(['Family'], as_index=False)\
.mean().sort_values(by='Family', ascending=True)
Out[25]:
Family Survived
0 1 0.303538
1 2 0.552795
2 3 0.578431
3 4 0.724138
4 5 0.200000
5 6 0.136364
6 7 0.333333
7 8 0.000000
8 11 0.000000
In [26]:
# family-SibSp
train_df[['SibSp', 'Survived']].groupby(['SibSp'], as_index=False)\
.mean().sort_values(by='SibSp', ascending=True)
Out[26]:
SibSp Survived
0 0 0.345395
1 1 0.535885
2 2 0.464286
3 3 0.250000
4 4 0.166667
5 5 0.000000
6 8 0.000000
In [27]:
# family-Parch
train_df[['Parch', 'Survived']].groupby(['Parch'], as_index=False)\
.mean().sort_values(by='Parch', ascending=True)
Out[27]:
Parch Survived
0 0 0.343658
1 1 0.550847
2 2 0.500000
3 3 0.600000
4 4 0.000000
5 5 0.200000
6 6 0.000000

Observations

  • family、sibsp、parch的集中趋势是相似的,family对区分度没有更多帮助

Decisions

不对sibsp、parch进行合并

In [28]:
# 备选方法:特征转换:使用特征转换器
#from sklearn.feature_extraction import DictVectorizer
#vec = DictVectorizer(sparse=False)
#full_df = vec.fit_transform(full_df.to_dict(orient='record'))
#print vec.feature_names_

五、调用机器学习模型

In [29]:
# 切分为原始训练集、预测集
len_train = len(train_df)
train_df = full_df.loc[:len_train-1, :]
predict_df = full_df.loc[len_train:, :]
print(train_df.shape, predict_df.shape)
(891, 10) (418, 10)
In [30]:
# 将Survived值转换为int
train_df['Survived'] = train_df['Survived'].map(lambda x:int(x)).copy()
train_df.head()
C:\Users\spark\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  
Out[30]:
Age Embarked Fare Parch PassengerId Pclass Sex SibSp Survived Title
0 1 0 0 0 1 3 0 1 0 0
1 1 2 3 0 2 1 1 1 1 1
2 1 0 1 0 3 3 1 0 1 1
3 1 0 3 0 4 1 1 1 1 1
4 1 0 1 0 5 3 0 0 0 0
In [31]:
train_df['Sex'].value_counts()
Out[31]:
0    577
1    314
Name: Sex, dtype: int64
In [32]:
x = train_df.drop(['PassengerId', 'Survived'], axis=1)
y = train_df['Survived']
x_predict = predict_df.drop('Survived', axis=1)
x.shape, y.shape, x_predict.shape
Out[32]:
((891, 8), (891,), (418, 9))
In [33]:
x.head()
Out[33]:
Age Embarked Fare Parch Pclass Sex SibSp Title
0 1 0 0 0 3 0 1 0
1 1 2 3 0 1 1 1 1
2 1 0 1 0 3 1 0 1
3 1 0 3 0 1 1 1 1
4 1 0 1 0 3 0 0 0
In [34]:
# 将原始训练集切分为训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y,random_state=33,test_size=0.25)
In [35]:
# 调用模型,测评性能
# Logistics Regression、SGD、SVC均为参数模型,且需要标准化。
# 数据加工阶段,已使无需再标准化。

# 标准化方法
#from sklearn.preprocessing import StandardScaler
#ss = StandardScaler()
#x_train = ss.fit_transform(x_train)
#x_test = ss.transform(x_test)

# Logistics Regression
lr = LogisticRegression()
lr.fit(x_train, y_train)
acc_lr = lr.score(x_test, y_test)

# SGD
sgdc = SGDClassifier()
sgdc.fit(x_train, y_train)
acc_sgdc = sgdc.score(x_test, y_test)

# SVC
lsvc = LinearSVC()
lsvc.fit(x_train, y_train)
acc_lsvc = lsvc.score(x_test, y_test)
C:\Users\spark\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
  FutureWarning)
C:\Users\spark\Anaconda3\lib\site-packages\sklearn\svm\base.py:929: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  "the number of iterations.", ConvergenceWarning)
In [36]:
# 决策树、集合模型均为参数模型,但不需要标准化,但需要将类别特征向量化
# 数据加工阶段,已处理类别特征

# 特征向量化方法
#from sklearn.feature_extraction import DictVectorizer
#vec = DictVectorizer()
#x_train = vec.fit_transform(x_train.to_dict(orient='record'))
#x_test = vec.transform(x_test.to_dict(orient='record'))

# Tree
dtc = DecisionTreeClassifier()
dtc.fit(x_train, y_train)
acc_dtc = dtc.score(x_test, y_test)

# Ensemble-RandomForestClassifier
rfc = RandomForestClassifier()
rfc.fit(x_train, y_train)
acc_rfc = rfc.score(x_test, y_test)

# Ensemble-GradientBoostingClassifier
gbc = GradientBoostingClassifier()
gbc.fit(x_train, y_train)
acc_gbc = gbc.score(x_test, y_test)
C:\Users\spark\Anaconda3\lib\site-packages\sklearn\ensemble\forest.py:245: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22.
  "10 in version 0.20 to 100 in 0.22.", FutureWarning)
In [37]:
# K-Neighbors:非参数模型,且需要标准化
knc = KNeighborsClassifier(n_neighbors=11)
knc.fit(x_train, y_train)
acc_knc = knc.score(x_test, y_test)
In [38]:
# rank of score
models = pd.DataFrame({'Model':['Logistics Regression',
                                'SGD',
                                'SVC',
                                'Tree',
                                'Ensemble-RandomForestClassifier',
                                'Ensemble-GradientBoostingClassifier',
                                'K-Neighbors'],
                       'Score':[acc_lr,
                                acc_sgdc,
                                acc_lsvc,
                                acc_dtc,
                                acc_rfc,
                                acc_gbc,
                                acc_knc]})
models.sort_values(by='Score', ascending=False)
Out[38]:
Model Score
5 Ensemble-GradientBoostingClassifier 0.843049
6 K-Neighbors 0.843049
2 SVC 0.825112
4 Ensemble-RandomForestClassifier 0.825112
0 Logistics Regression 0.820628
1 SGD 0.811659
3 Tree 0.811659
In [39]:
# 性能测评方法
# 混淆矩阵:精确度、召回率、二者的调和平均数
#from sklearn.metrics import classification_report

模型可视化:以决策树为例

In [42]:
# 小图
# from sklearn import tree
# tree.plot_tree(dtc.fit(x_train, y_train))

# 矢量图
# graphviz:用于输出可视化图片。首次安装后,可能需要添加至系统环境。
# import os
# os.environ['PATH'] = os.environ['PATH'] + (';c:\\Program Files (x86)\\Graphviz2.38\\bin\\')
import graphviz 
from sklearn import tree
dot_data = tree.export_graphviz(dtc, out_file=None) 
graph = graphviz.Source(dot_data) 
graph.render("Titanic") 
Out[42]:
'Titanic.pdf'
In [43]:
>>> dot_data = tree.export_graphviz(dtc, out_file=None, 
...                      feature_names=x_train.columns,  # 特征名称列表
...                      class_names=y_train.name,  # 类别标签名称
...                      filled=True, rounded=True,  
...                      special_characters=True)  
>>> graph = graphviz.Source(dot_data)  
>>> graph 
Out[43]:
Tree 0 Sex ≤ 0.5 gini = 0.471 samples = 668 value = [415, 253] class = S 1 Pclass ≤ 1.5 gini = 0.315 samples = 439 value = [353, 86] class = S 0->1 True 140 Pclass ≤ 2.5 gini = 0.395 samples = 229 value = [62, 167] class = u 0->140 False 2 Age ≤ 1.5 gini = 0.467 samples = 94 value = [59, 35] class = S 1->2 49 Parch ≤ 0.5 gini = 0.252 samples = 345 value = [294, 51] class = S 1->49 3 Fare ≤ 1.0 gini = 0.498 samples = 58 value = [31, 27] class = S 2->3 30 SibSp ≤ 0.5 gini = 0.346 samples = 36 value = [28, 8] class = S 2->30 4 gini = 0.0 samples = 3 value = [3, 0] class = S 3->4 5 Fare ≤ 2.5 gini = 0.5 samples = 55 value = [28, 27] class = S 3->5 6 Parch ≤ 0.5 gini = 0.483 samples = 22 value = [9, 13] class = u 5->6 11 Parch ≤ 0.5 gini = 0.489 samples = 33 value = [19, 14] class = S 5->11 7 Embarked ≤ 1.0 gini = 0.472 samples = 21 value = [8, 13] class = u 6->7 10 gini = 0.0 samples = 1 value = [1, 0] class = S 6->10 8 gini = 0.444 samples = 12 value = [4, 8] class = u 7->8 9 gini = 0.494 samples = 9 value = [4, 5] class = u 7->9 12 SibSp ≤ 0.5 gini = 0.461 samples = 25 value = [16, 9] class = S 11->12 21 Age ≤ 0.5 gini = 0.469 samples = 8 value = [3, 5] class = u 11->21 13 Embarked ≤ 1.0 gini = 0.408 samples = 14 value = [10, 4] class = S 12->13 16 Age ≤ 0.5 gini = 0.496 samples = 11 value = [6, 5] class = S 12->16 14 gini = 0.375 samples = 8 value = [6, 2] class = S 13->14 15 gini = 0.444 samples = 6 value = [4, 2] class = S 13->15 17 gini = 0.0 samples = 1 value = [1, 0] class = S 16->17 18 Embarked ≤ 1.0 gini = 0.5 samples = 10 value = [5, 5] class = S 16->18 19 gini = 0.49 samples = 7 value = [4, 3] class = S 18->19 20 gini = 0.444 samples = 3 value = [1, 2] class = u 18->20 22 gini = 0.0 samples = 2 value = [0, 2] class = u 21->22 23 SibSp ≤ 0.5 gini = 0.5 samples = 6 value = [3, 3] class = S 21->23 24 Embarked ≤ 1.0 gini = 0.48 samples = 5 value = [3, 2] class = S 23->24 29 gini = 0.0 samples = 1 value = [0, 1] class = u 23->29 25 gini = 0.0 samples = 2 value = [2, 0] class = S 24->25 26 Parch ≤ 1.5 gini = 0.444 samples = 3 value = [1, 2] class = u 24->26 27 gini = 0.0 samples = 2 value = [0, 2] class = u 26->27 28 gini = 0.0 samples = 1 value = [1, 0] class = S 26->28 31 Fare ≤ 2.5 gini = 0.219 samples = 24 value = [21, 3] class = S 30->31 38 Embarked ≤ 1.5 gini = 0.486 samples = 12 value = [7, 5] class = S 30->38 32 Embarked ≤ 1.0 gini = 0.355 samples = 13 value = [10, 3] class = S 31->32 37 gini = 0.0 samples = 11 value = [11, 0] class = S 31->37 33 Age ≤ 2.5 gini = 0.375 samples = 12 value = [9, 3] class = S 32->33 36 gini = 0.0 samples = 1 value = [1, 0] class = S 32->36 34 gini = 0.375 samples = 8 value = [6, 2] class = S 33->34 35 gini = 0.375 samples = 4 value = [3, 1] class = S 33->35 39 Parch ≤ 0.5 gini = 0.375 samples = 8 value = [6, 2] class = S 38->39 46 Parch ≤ 0.5 gini = 0.375 samples = 4 value = [1, 3] class = u 38->46 40 Embarked ≤ 0.5 gini = 0.48 samples = 5 value = [3, 2] class = S 39->40 45 gini = 0.0 samples = 3 value = [3, 0] class = S 39->45 41 SibSp ≤ 1.5 gini = 0.5 samples = 4 value = [2, 2] class = S 40->41 44 gini = 0.0 samples = 1 value = [1, 0] class = S 40->44 42 gini = 0.444 samples = 3 value = [2, 1] class = S 41->42 43 gini = 0.0 samples = 1 value = [0, 1] class = u 41->43 47 gini = 0.444 samples = 3 value = [1, 2] class = u 46->47 48 gini = 0.0 samples = 1 value = [0, 1] class = u 46->48 50 Fare ≤ 2.5 gini = 0.212 samples = 298 value = [262, 36] class = S 49->50 111 Age ≤ 0.5 gini = 0.435 samples = 47 value = [32, 15] class = S 49->111 51 Fare ≤ 1.5 gini = 0.193 samples = 287 value = [256, 31] class = S 50->51 108 Pclass ≤ 2.5 gini = 0.496 samples = 11 value = [6, 5] class = S 50->108 52 Fare ≤ 0.5 gini = 0.207 samples = 247 value = [218, 29] class = S 51->52 93 SibSp ≤ 1.5 gini = 0.095 samples = 40 value = [38, 2] class = S 51->93 53 Embarked ≤ 1.5 gini = 0.161 samples = 136 value = [124, 12] class = S 52->53 72 Pclass ≤ 2.5 gini = 0.259 samples = 111 value = [94, 17] class = S 52->72 54 Age ≤ 0.5 gini = 0.132 samples = 113 value = [105, 8] class = S 53->54 67 Age ≤ 0.5 gini = 0.287 samples = 23 value = [19, 4] class = S 53->67 55 gini = 0.0 samples = 12 value = [12, 0] class = S 54->55 56 Age ≤ 1.5 gini = 0.146 samples = 101 value = [93, 8] class = S 54->56 57 Pclass ≤ 2.5 gini = 0.164 samples = 89 value = [81, 8] class = S 56->57 66 gini = 0.0 samples = 12 value = [12, 0] class = S 56->66 58 gini = 0.0 samples = 5 value = [5, 0] class = S 57->58 59 Embarked ≤ 0.5 gini = 0.172 samples = 84 value = [76, 8] class = S 57->59 60 SibSp ≤ 0.5 gini = 0.19 samples = 66 value = [59, 7] class = S 59->60 63 SibSp ≤ 0.5 gini = 0.105 samples = 18 value = [17, 1] class = S 59->63 61 gini = 0.177 samples = 61 value = [55, 6] class = S 60->61 62 gini = 0.32 samples = 5 value = [4, 1] class = S 60->62 64 gini = 0.111 samples = 17 value = [16, 1] class = S 63->64 65 gini = 0.0 samples = 1 value = [1, 0] class = S 63->65 68 gini = 0.0 samples = 1 value = [0, 1] class = u 67->68 69 Age ≤ 1.5 gini = 0.236 samples = 22 value = [19, 3] class = S 67->69 70 gini = 0.245 samples = 21 value = [18, 3] class = S 69->70 71 gini = 0.0 samples = 1 value = [1, 0] class = S 69->71 73 Embarked ≤ 1.0 gini = 0.201 samples = 44 value = [39, 5] class = S 72->73 84 SibSp ≤ 1.0 gini = 0.294 samples = 67 value = [55, 12] class = S 72->84 74 Age ≤ 0.5 gini = 0.172 samples = 42 value = [38, 4] class = S 73->74 83 gini = 0.5 samples = 2 value = [1, 1] class = S 73->83 75 gini = 0.245 samples = 7 value = [6, 1] class = S 74->75 76 Age ≤ 2.5 gini = 0.157 samples = 35 value = [32, 3] class = S 74->76 77 Age ≤ 1.5 gini = 0.165 samples = 33 value = [30, 3] class = S 76->77 82 gini = 0.0 samples = 2 value = [2, 0] class = S 76->82 78 SibSp ≤ 0.5 gini = 0.142 samples = 26 value = [24, 2] class = S 77->78 81 gini = 0.245 samples = 7 value = [6, 1] class = S 77->81 79 gini = 0.147 samples = 25 value = [23, 2] class = S 78->79 80 gini = 0.0 samples = 1 value = [1, 0] class = S 78->80 85 Embarked ≤ 1.0 gini = 0.305 samples = 64 value = [52, 12] class = S 84->85 92 gini = 0.0 samples = 3 value = [3, 0] class = S 84->92 86 Age ≤ 1.5 gini = 0.312 samples = 62 value = [50, 12] class = S 85->86 91 gini = 0.0 samples = 2 value = [2, 0] class = S 85->91 87 Age ≤ 0.5 gini = 0.302 samples = 54 value = [44, 10] class = S 86->87 90 gini = 0.375 samples = 8 value = [6, 2] class = S 86->90 88 gini = 0.291 samples = 17 value = [14, 3] class = S 87->88 89 gini = 0.307 samples = 37 value = [30, 7] class = S 87->89 94 Pclass ≤ 2.5 gini = 0.053 samples = 37 value = [36, 1] class = S 93->94 103 Embarked ≤ 0.5 gini = 0.444 samples = 3 value = [2, 1] class = S 93->103 95 SibSp ≤ 0.5 gini = 0.105 samples = 18 value = [17, 1] class = S 94->95 102 gini = 0.0 samples = 19 value = [19, 0] class = S 94->102 96 gini = 0.0 samples = 7 value = [7, 0] class = S 95->96 97 Embarked ≤ 1.0 gini = 0.165 samples = 11 value = [10, 1] class = S 95->97 98 Age ≤ 1.5 gini = 0.198 samples = 9 value = [8, 1] class = S 97->98 101 gini = 0.0 samples = 2 value = [2, 0] class = S 97->101 99 gini = 0.245 samples = 7 value = [6, 1] class = S 98->99 100 gini = 0.0 samples = 2 value = [2, 0] class = S 98->100 104 gini = 0.0 samples = 1 value = [1, 0] class = S 103->104 105 Embarked ≤ 1.5 gini = 0.5 samples = 2 value = [1, 1] class = S 103->105 106 gini = 0.0 samples = 1 value = [0, 1] class = u 105->106 107 gini = 0.0 samples = 1 value = [1, 0] class = S 105->107 109 gini = 0.0 samples = 4 value = [4, 0] class = S 108->109 110 gini = 0.408 samples = 7 value = [2, 5] class = u 108->110 112 SibSp ≤ 2.0 gini = 0.497 samples = 24 value = [11, 13] class = u 111->112 135 Embarked ≤ 1.5 gini = 0.159 samples = 23 value = [21, 2] class = S 111->135 113 Fare ≤ 0.5 gini = 0.32 samples = 15 value = [3, 12] class = u 112->113 128 Fare ≤ 2.5 gini = 0.198 samples = 9 value = [8, 1] class = S 112->128 114 gini = 0.0 samples = 1 value = [1, 0] class = S 113->114 115 Fare ≤ 2.5 gini = 0.245 samples = 14 value = [2, 12] class = u 113->115 116 Pclass ≤ 2.5 gini = 0.165 samples = 11 value = [1, 10] class = u 115->116 125 Embarked ≤ 1.0 gini = 0.444 samples = 3 value = [1, 2] class = u 115->125 117 gini = 0.0 samples = 6 value = [0, 6] class = u 116->117 118 Fare ≤ 1.5 gini = 0.32 samples = 5 value = [1, 4] class = u 116->118 119 gini = 0.0 samples = 2 value = [0, 2] class = u 118->119 120 Embarked ≤ 1.0 gini = 0.444 samples = 3 value = [1, 2] class = u 118->120 121 Parch ≤ 1.5 gini = 0.5 samples = 2 value = [1, 1] class = S 120->121 124 gini = 0.0 samples = 1 value = [0, 1] class = u 120->124 122 gini = 0.0 samples = 1 value = [1, 0] class = S 121->122 123 gini = 0.0 samples = 1 value = [0, 1] class = u 121->123 126 gini = 0.5 samples = 2 value = [1, 1] class = S 125->126 127 gini = 0.0 samples = 1 value = [0, 1] class = u 125->127 129 gini = 0.0 samples = 4 value = [4, 0] class = S 128->129 130 SibSp ≤ 4.5 gini = 0.32 samples = 5 value = [4, 1] class = S 128->130 131 Parch ≤ 1.5 gini = 0.5 samples = 2 value = [1, 1] class = S 130->131 134 gini = 0.0 samples = 3 value = [3, 0] class = S 130->134 132 gini = 0.0 samples = 1 value = [1, 0] class = S 131->132 133 gini = 0.0 samples = 1 value = [0, 1] class = u 131->133 136 gini = 0.0 samples = 19 value = [19, 0] class = S 135->136 137 Pclass ≤ 2.5 gini = 0.5 samples = 4 value = [2, 2] class = S 135->137 138 gini = 0.0 samples = 2 value = [2, 0] class = S 137->138 139 gini = 0.0 samples = 2 value = [0, 2] class = u 137->139 141 Fare ≤ 2.5 gini = 0.109 samples = 121 value = [7, 114] class = u 140->141 178 Embarked ≤ 0.5 gini = 0.5 samples = 108 value = [55, 53] class = S 140->178 142 Age ≤ 1.5 gini = 0.188 samples = 57 value = [6, 51] class = u 141->142 167 Parch ≤ 1.5 gini = 0.031 samples = 64 value = [1, 63] class = u 141->167 143 Age ≤ 0.5 gini = 0.127 samples = 44 value = [3, 41] class = u 142->143 158 Embarked ≤ 1.0 gini = 0.355 samples = 13 value = [3, 10] class = u 142->158 144 gini = 0.0 samples = 12 value = [0, 12] class = u 143->144 145 Embarked ≤ 0.5 gini = 0.17 samples = 32 value = [3, 29] class = u 143->145 146 Fare ≤ 1.5 gini = 0.191 samples = 28 value = [3, 25] class = u 145->146 157 gini = 0.0 samples = 4 value = [0, 4] class = u 145->157 147 gini = 0.26 samples = 13 value = [2, 11] class = u 146->147 148 Parch ≤ 0.5 gini = 0.124 samples = 15 value = [1, 14] class = u 146->148 149 gini = 0.0 samples = 6 value = [0, 6] class = u 148->149 150 SibSp ≤ 0.5 gini = 0.198 samples = 9 value = [1, 8] class = u 148->150 151 gini = 0.0 samples = 3 value = [0, 3] class = u 150->151 152 SibSp ≤ 1.5 gini = 0.278 samples = 6 value = [1, 5] class = u 150->152 153 Parch ≤ 1.5 gini = 0.32 samples = 5 value = [1, 4] class = u 152->153 156 gini = 0.0 samples = 1 value = [0, 1] class = u 152->156 154 gini = 0.375 samples = 4 value = [1, 3] class = u 153->154 155 gini = 0.0 samples = 1 value = [0, 1] class = u 153->155 159 SibSp ≤ 0.5 gini = 0.298 samples = 11 value = [2, 9] class = u 158->159 166 gini = 0.5 samples = 2 value = [1, 1] class = S 158->166 160 Fare ≤ 1.5 gini = 0.219 samples = 8 value = [1, 7] class = u 159->160 163 Parch ≤ 1.5 gini = 0.444 samples = 3 value = [1, 2] class = u 159->163 161 gini = 0.375 samples = 4 value = [1, 3] class = u 160->161 162 gini = 0.0 samples = 4 value = [0, 4] class = u 160->162 164 gini = 0.5 samples = 2 value = [1, 1] class = S 163->164 165 gini = 0.0 samples = 1 value = [0, 1] class = u 163->165 168 gini = 0.0 samples = 54 value = [0, 54] class = u 167->168 169 Embarked ≤ 1.0 gini = 0.18 samples = 10 value = [1, 9] class = u 167->169 170 SibSp ≤ 2.0 gini = 0.278 samples = 6 value = [1, 5] class = u 169->170 177 gini = 0.0 samples = 4 value = [0, 4] class = u 169->177 171 Pclass ≤ 1.5 gini = 0.375 samples = 4 value = [1, 3] class = u 170->171 176 gini = 0.0 samples = 2 value = [0, 2] class = u 170->176 172 Age ≤ 0.5 gini = 0.444 samples = 3 value = [1, 2] class = u 171->172 175 gini = 0.0 samples = 1 value = [0, 1] class = u 171->175 173 gini = 0.0 samples = 1 value = [0, 1] class = u 172->173 174 gini = 0.5 samples = 2 value = [1, 1] class = S 172->174 179 SibSp ≤ 1.5 gini = 0.472 samples = 68 value = [42, 26] class = S 178->179 224 Fare ≤ 1.5 gini = 0.439 samples = 40 value = [13, 27] class = u 178->224 180 Parch ≤ 1.5 gini = 0.496 samples = 53 value = [29, 24] class = S 179->180 217 Fare ≤ 1.5 gini = 0.231 samples = 15 value = [13, 2] class = S 179->217 181 Age ≤ 2.5 gini = 0.5 samples = 45 value = [23, 22] class = S 180->181 210 Age ≤ 1.5 gini = 0.375 samples = 8 value = [6, 2] class = S 180->210 182 Age ≤ 1.5 gini = 0.499 samples = 44 value = [23, 21] class = S 181->182 209 gini = 0.0 samples = 1 value = [0, 1] class = u 181->209 183 Fare ≤ 1.5 gini = 0.5 samples = 43 value = [22, 21] class = S 182->183 208 gini = 0.0 samples = 1 value = [1, 0] class = S 182->208 184 SibSp ≤ 0.5 gini = 0.496 samples = 33 value = [18, 15] class = S 183->184 201 Age ≤ 0.5 gini = 0.48 samples = 10 value = [4, 6] class = u 183->201 185 Parch ≤ 0.5 gini = 0.499 samples = 27 value = [13, 14] class = u 184->185 196 Age ≤ 0.5 gini = 0.278 samples = 6 value = [5, 1] class = S 184->196 186 Age ≤ 0.5 gini = 0.5 samples = 24 value = [12, 12] class = S 185->186 193 Age ≤ 0.5 gini = 0.444 samples = 3 value = [1, 2] class = u 185->193 187 Fare ≤ 0.5 gini = 0.5 samples = 6 value = [3, 3] class = S 186->187 190 Fare ≤ 0.5 gini = 0.5 samples = 18 value = [9, 9] class = S 186->190 188 gini = 0.444 samples = 3 value = [2, 1] class = S 187->188 189 gini = 0.444 samples = 3 value = [1, 2] class = u 187->189 191 gini = 0.494 samples = 9 value = [4, 5] class = u 190->191 192 gini = 0.494 samples = 9 value = [5, 4] class = S 190->192 194 gini = 0.5 samples = 2 value = [1, 1] class = S 193->194 195 gini = 0.0 samples = 1 value = [0, 1] class = u 193->195 197 Parch ≤ 0.5 gini = 0.5 samples = 2 value = [1, 1] class = S 196->197 200 gini = 0.0 samples = 4 value = [4, 0] class = S 196->200 198 gini = 0.0 samples = 1 value = [1, 0] class = S 197->198 199 gini = 0.0 samples = 1 value = [0, 1] class = u 197->199 202 Parch ≤ 0.5 gini = 0.5 samples = 2 value = [1, 1] class = S 201->202 205 Parch ≤ 0.5 gini = 0.469 samples = 8 value = [3, 5] class = u 201->205 203 gini = 0.0 samples = 1 value = [1, 0] class = S 202->203 204 gini = 0.0 samples = 1 value = [0, 1] class = u 202->204 206 gini = 0.444 samples = 6 value = [2, 4] class = u 205->206 207 gini = 0.5 samples = 2 value = [1, 1] class = S 205->207 211 Age ≤ 0.5 gini = 0.48 samples = 5 value = [3, 2] class = S 210->211 216 gini = 0.0 samples = 3 value = [3, 0] class = S 210->216 212 gini = 0.5 samples = 2 value = [1, 1] class = S 211->212 213 Parch ≤ 3.5 gini = 0.444 samples = 3 value = [2, 1] class = S 211->213 214 gini = 0.0 samples = 1 value = [1, 0] class = S 213->214 215 gini = 0.5 samples = 2 value = [1, 1] class = S 213->215 218 gini = 0.0 samples = 1 value = [0, 1] class = u 217->218 219 Parch ≤ 0.5 gini = 0.133 samples = 14 value = [13, 1] class = S 217->219 220 Age ≤ 0.5 gini = 0.5 samples = 2 value = [1, 1] class = S 219->220 223 gini = 0.0 samples = 12 value = [12, 0] class = S 219->223 221 gini = 0.0 samples = 1 value = [1, 0] class = S 220->221 222 gini = 0.0 samples = 1 value = [0, 1] class = u 220->222 225 Parch ≤ 1.0 gini = 0.32 samples = 20 value = [4, 16] class = u 224->225 232 SibSp ≤ 1.5 gini = 0.495 samples = 20 value = [9, 11] class = u 224->232 226 Embarked ≤ 1.5 gini = 0.266 samples = 19 value = [3, 16] class = u 225->226 231 gini = 0.0 samples = 1 value = [1, 0] class = S 225->231 227 Age ≤ 0.5 gini = 0.32 samples = 15 value = [3, 12] class = u 226->227 230 gini = 0.0 samples = 4 value = [0, 4] class = u 226->230 228 gini = 0.5 samples = 2 value = [1, 1] class = S 227->228 229 gini = 0.26 samples = 13 value = [2, 11] class = u 227->229 233 Age ≤ 1.5 gini = 0.492 samples = 16 value = [9, 7] class = S 232->233 252 gini = 0.0 samples = 4 value = [0, 4] class = u 232->252 234 Parch ≤ 3.5 gini = 0.498 samples = 15 value = [8, 7] class = S 233->234 251 gini = 0.0 samples = 1 value = [1, 0] class = S 233->251 235 Parch ≤ 1.5 gini = 0.5 samples = 14 value = [7, 7] class = S 234->235 250 gini = 0.0 samples = 1 value = [1, 0] class = S 234->250 236 SibSp ≤ 0.5 gini = 0.48 samples = 10 value = [6, 4] class = S 235->236 247 Age ≤ 0.5 gini = 0.375 samples = 4 value = [1, 3] class = u 235->247 237 gini = 0.0 samples = 2 value = [2, 0] class = S 236->237 238 Embarked ≤ 1.5 gini = 0.5 samples = 8 value = [4, 4] class = S 236->238 239 Parch ≤ 0.5 gini = 0.444 samples = 3 value = [1, 2] class = u 238->239 242 Parch ≤ 0.5 gini = 0.48 samples = 5 value = [3, 2] class = S 238->242 240 gini = 0.0 samples = 2 value = [0, 2] class = u 239->240 241 gini = 0.0 samples = 1 value = [1, 0] class = S 239->241 243 Age ≤ 0.5 gini = 0.375 samples = 4 value = [3, 1] class = S 242->243 246 gini = 0.0 samples = 1 value = [0, 1] class = u 242->246 244 gini = 0.5 samples = 2 value = [1, 1] class = S 243->244 245 gini = 0.0 samples = 2 value = [2, 0] class = S 243->245 248 gini = 0.0 samples = 1 value = [0, 1] class = u 247->248 249 gini = 0.444 samples = 3 value = [1, 2] class = u 247->249

六、结论

背景分析

  • 本次目标属于分类问题,一般会选择监督学习中分类学习模型。
  • 数据量未达到10万,因此暂不考虑模型效率问题。

特征分析

  • 特征选择:Age Embarked Fare Parch PassengerId Pclass Sex SibSp Title
  • 处理方式:对于每个特征,通过聚合数据,观察其与标签(幸存率)的关系,从而划分出级别,并用序数标记。最终都被整理为了离散值。
  • 备选方式:抽了逐一手动处理特征,还可以考虑保留连续性变量,或调用特征向量化方法进行自动处理;但经过比较,发现逐一分析变量,手动聚合为离散值的方式,效果较好。
  • 经验:
    • 增加无关特征,准确率降低
    • 增加特征title后,准确率
      • 提高的:梯度上升决策树(+0.004),决策树(+0.004)
      • 下降的:梯度下降(-0.09)
      • 不变的:支持向量机,逻辑回归,随机森林,k邻近法(最优n由6变为11)

模型评价

准确率

  • 参数模型:
    • 最高,集合模型:梯度上升决策树;
    • 其次,支持向量机,逻辑回归;
    • 然后,随机森林,决策树;
    • 最后,梯度下降。
  • 非参数模型:当n取11时,准确率最高,且排名第二。

模型解释

  • 相关系数矩阵:相关性较强的原始特征为sex、pclass、fare
  • 决策树可视化:sex、pclass是最重要的特征,值得关注的人群有
    • 对于男性:1等舱,20岁以上的,幸存率较好
    • 对于男性:2、3等舱、无亲属、低票价的,幸存率较好
    • 对于男性低龄儿童:2、3等舱、无亲属的,幸存率较差
    • 对于男性低龄儿童:2、3等舱、既有直系亲属又有旁系亲属,幸存率较好
    • 对于女性:1、2等舱的,生存率较差
    • 对于女性:3等仓,上传地点为S,亲属较多的,幸存率较好
    • 对于女性:3等仓,上传地点为S,低龄的,幸存率较好