# 泰坦尼克号生存预测入门

## 1. 数据预览

```import pandas as pd
import numpy as np
from pandas import Series, DataFrame
# 读取前10行
```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.7+ KB```
`data_test.describe() # 可见一些统计信息`

## 2. 特征初步选择

• 由于`Cabin`客舱号大部分都缺失，进行填补，可能会造成较大误差，不选
• 乘客`id`，是个连续数据，跟是否存活应该无关，不选
• 年龄`Age`，是个比较重要的特征，对缺失的部分用中位数进行填充
`data_train["Age"] = data_train["Age"].fillna(data_train["Age"].median())`
• 初步调用一些模型（默认参数）进行预测：
• `algs = [Perceptron(),KNeighborsClassifier(),GaussianNB(),DecisionTreeClassifier(), LinearRegression(),LogisticRegression(),SVC(),RandomForestClassifier()]`
```from sklearn.linear_model import Perceptron
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier # boost
from sklearn.model_selection import KFold # 交叉验证
features = ["Pclass","Age","SibSp","Parch","Fare"]
algs = [Perceptron(),KNeighborsClassifier(),GaussianNB(),DecisionTreeClassifier(),
LinearRegression(),LogisticRegression(),SVC(),RandomForestClassifier()]
for alg in algs:
kf = KFold(n_splits=5,shuffle=True,random_state=1)
predictions = []
for train, test in kf.split(data_train):
train_features = (data_train[features].iloc[train,:])
train_label = data_train["Survived"].iloc[train]
alg.fit(train_features,train_label)
test_predictions = alg.predict(data_train[features].iloc[test,:])
predictions.append(test_predictions)
predictions = np.concatenate(predictions,axis=0) # 合并3组数据
predictions[predictions>0.5] = 1
predictions[predictions<=0.5] = 0
accuracy = sum(predictions == data_train["Survived"])/len(predictions)
print("模型准确率：", accuracy)```

```模型准确率： 0.531986531986532

```模型准确率： 0.5679012345679012

## 3. 增加特征`Sex`和`Embarked`

• 上面效果不好，增加一些特征
• 增加特征`Sex``Embarked`，查看对预测的影响
• 这两个特征为字符串，需要转成数字
```print(pd.value_counts(data_train.loc[:,"Embarked"]))
----------------------
S    644
C    168
Q     77
Name: Embarked, dtype: int64
# sex转成数字
data_train.loc[data_train["Sex"]=="male","Sex"] = 0
data_train.loc[data_train["Sex"]=="female","Sex"] = 1
# 登船地点，缺失的用最多的S进行填充
data_train["Embarked"] = data_train["Embarked"].fillna('S')
data_train.loc[data_train["Embarked"]=="S", "Embarked"]=0
data_train.loc[data_train["Embarked"]=="C", "Embarked"]=1
data_train.loc[data_train["Embarked"]=="Q", "Embarked"]=2```
`features = ["Pclass","Age","SibSp","Parch","Fare","Embarked","Sex"]`

```模型准确率： 0.5521885521885522

```模型准确率： 0.675645342312009

## 4. 选择随机森林调参

```features = ["Pclass","Age","SibSp","Parch","Fare","Embarked","Sex"]
estimator_num = [5,10,15,20,25,30]
splits_num = [3,5,10,15]
for e_n in estimator_num:
for sp_n in splits_num:
alg = RandomForestClassifier(n_estimators=e_n)
kf = KFold(n_splits=sp_n,shuffle=False,random_state=1)
predictions_train = []
for train, test in kf.split(data_train):
train_features = (data_train[features].iloc[train,:])
train_label = data_train["Survived"].iloc[train]
alg.fit(train_features,train_label)
train_pred = alg.predict(data_train[features].iloc[test,:])
predictions_train.append(train_pred)
predictions_train = np.concatenate(predictions_train,axis=0) # 合并3组数据
predictions_train[predictions_train>0.5] = 1
predictions_train[predictions_train<=0.5] = 0
accuracy = sum(predictions_train == data_train["Survived"])/len(predictions_train)
print("%d折数据集，%d棵决策树，模型准确率：%.4f" %(sp_n,e_n,accuracy))```
```3折数据集，5棵决策树，模型准确率：0.7890
5折数据集，5棵决策树，模型准确率：0.7901
10折数据集，5棵决策树，模型准确率：0.7935
15折数据集，5棵决策树，模型准确率：0.8092
3折数据集，10棵决策树，模型准确率：0.7890
5折数据集，10棵决策树，模型准确率：0.8047
10折数据集，10棵决策树，模型准确率：0.8137
15折数据集，10棵决策树，模型准确率：0.8092
3折数据集，15棵决策树，模型准确率：0.7868
5折数据集，15棵决策树，模型准确率：0.8002
10折数据集，15棵决策树，模型准确率：0.8092
15折数据集，15棵决策树，模型准确率：0.8047
3折数据集，20棵决策树，模型准确率：0.7969
5折数据集，20棵决策树，模型准确率：0.8092
10折数据集，20棵决策树，模型准确率：0.8114
15折数据集，20棵决策树，模型准确率：0.8092
3折数据集，25棵决策树，模型准确率：0.7924
5折数据集，25棵决策树，模型准确率：0.8070
10折数据集，25棵决策树，模型准确率：0.8103
15折数据集，25棵决策树，模型准确率：0.8025
3折数据集，30棵决策树，模型准确率：0.7890
5折数据集，30棵决策树，模型准确率：0.8013
10折数据集，30棵决策树，模型准确率：0.8081
15折数据集，30棵决策树，模型准确率：0.8193```

## 5. 实践总结

• 导入工具包 numpy, pandas, sklearn等
• 数据读取，`pandas.read_csv(file)`
• pandas的一些数据处理 `data.head(n)` 读取前n行展示 `data.info()` 获取数据的信息 `data.describe()` 获取统计信息（均值、方差等） `data["Age"] = data["Age"].fillna(data["Age"].median())` 缺失数据填补(均值、最大值、根据别的特征分段填充等) 性别等字符串特征数字化
• 选取特征，初步预测
• 不断的加入新的特征预测
• 选定较好的模型，再调整这些模型的参数，选出最好的模型参数

0 条评论

• ### 预测分析 · 员工满意度预测

可以看出 上一次的评分、有没有工伤、过去5年有没有晋升 跟 满意度 呈正相关系数

• ### 基于sklearn的LogisticRegression二分类实践

本文使用sklearn的逻辑斯谛回归模型，进行二分类预测，并通过调整各种参数，对预测结果进行对比。

• ### 程序员面试金典 - 面试题 05.02. 二进制数转字符串（浮点型 转 二进制小数，乘2取整）

二进制数转字符串。给定一个介于0和1之间的实数（如0.72），类型为double，打印它的二进制表达式。

• ### 模型|利用Python语言做逻辑回归算法

问题是这些预测对于分类来说是不合理的，因为真实的概率必然在0到1之间。为了避免这个问题，我们必须使用一个函数对p(X)建模，该函数为X的所有值提供0到1之间的输...

• ### 【机器学习】--模型评估指标之混淆矩阵，ROC曲线和AUC面积

实际上非常简单，精确率是针对我们预测结果而言的，它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了，一种就是把正类预测为正类(TP)，另...

• ### 如何提高FPGA工作频率？影响FPGA运行速度的几大因素

对于设计者来说，当然希望我们设计的电路的工作频率（在这里如无特别说明，工作频率指FPGA片内的工作频率）尽量高。我们也经常听说用资源换速度，用流水的方式可以提高...

• ### java:自动搜索不同位置的properties文件并加载

版权声明：本文为博主原创文章，转载请注明源地址。 https://blog.csdn.net...

• ### 基于PyTorch的分类和时间序列预测小例子

最近确实太忙了，没能很好的写这个系列的文章，但是大家不要急，好事多磨，我要保证每一篇的质量。

• ### 5G时代，电信运营商如何打造云网一体新生态

随着5G时代的到来，运营商纷纷进入了数字化转型的关键阶段，在SDN/NFV技术的驱动下，电信运营商开始依托云网一体化服务推动自身网络资源的优化升级，为自己创造更...

• ### 【CentOS】配置网络yum源遇到的问题之解决办法

我配置的是yum源是：wget http://mirrors.sohu.com/help/CentOS-Base-sohu.repo