<think>我们使用pandas读取数据,然后进行特征工程和预处理,最后使用一个分类模型进行预测参考步骤:1.读取训练集和测试集2.数据预处理:处理缺失值、转换类别特征、特征选择等3.选择模型(例如随机森林、逻辑回归、SVM等)进行训练4.对测试集进行预测5.将预测结果保存为csv文件,要求包含PassengerId和Survived两列根据题目的要求,我们只需要将预测结果(即Survived列)保存在./predict.csv文件中,但注意测试集中没有Survived列,我们需要从测试集中获取PassengerId,并将预测的Survived与之对应。但题目要求保存格式只有Survived列(见示例图),所以我们将预测结果直接保存为Survived一列(注意:示例图只有Survived一列,没有PassengerId),不过检查题目要求:文件保存格式如图所示,但图中内容未给出。实际上,根据代码注释中的示例,我们只需要保存Survived列,且不要索引。但是,根据比赛提交要求,通常需要两列:PassengerId和Survived。然而,题目要求是“如图所示”,而图中没有给出,并且示例代码是:pd.DataFrame({'Survived':result}).to_csv('./predict.csv',index=False)所以,我们只需要一列Survived(按顺序对应测试集的每一行)。因此,我们不需要保存PassengerId,只需要按测试集的顺序输出Survived预测结果。步骤:1.读取训练集('./train.csv')和测试集('./test.csv')2.进行特征工程和预处理(包括训练集和测试集)3.从训练集中分离出特征X和标签y4.训练模型5.对测试集进行预测,得到result(一维数组,每个元素为0或1)6.创建DataFrame,只有一列Survived,然后保存为csv文件,不要索引注意:测试集和训练集要使用相同的预处理流程。我们将使用一个较为常用的处理流程,包括:-填充或删除缺失值-特征选择:选择一些特征(如Pclass,Sex,Age,SibSp,Parch,Fare等)-将Sex转换为数值(0/1)-填充Age和Fare的缺失值(用中位数或平均数)-可以选择创建新特征,如家庭大小(SibSp+Parch)等由于题目没有要求具体模型,我们使用随机森林(效果较好且稳定)。下面我们逐步实现:</think>
# 泰坦尼克号生还预测模型完整实现
我将根据需求,使用pandas、numpy和sklearn完成泰坦尼克号生还预测模型的代码实现,并将预测结果保存在./predict.csv文件中。
```python
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
#********* Begin *********#
# 1. 数据读取
train_df = pd.read_csv('./train.csv')
test_df = pd.read_csv('./test.csv')
# 2. 数据预处理函数
def preprocess_data(df):
# 创建家庭规模特征
df['FamilySize'] = df['SibSp'] + df['Parch'] + 1
df['IsAlone'] = 0
df.loc[df['FamilySize'] == 1, 'IsAlone'] = 1
# 从姓名中提取称呼
df['Title'] = df['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
# 统一称谓类型
df['Title'] = df['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
df['Title'] = df['Title'].replace('Mlle', 'Miss')
df['Title'] = df['Title'].replace('Ms', 'Miss')
df['Title'] = df['Title'].replace('Mme', 'Mrs')
# 填充年龄缺失值
if 'Age' in df.columns:
median_age = df['Age'].median()
df['Age'] = df['Age'].fillna(median_age)
# 填充港口缺失值
if 'Embarked' in df.columns:
df['Embarked'] = df['Embarked'].fillna('S')
return df
# 预处理训练集和测试集
train_df = preprocess_data(train_df)
test_df = preprocess_data(test_df)
# 3. 定义特征类型
numeric_features = ['Age', 'Fare', 'FamilySize', 'IsAlone']
categorical_features = ['Pclass', 'Sex', 'Embarked', 'Title']
# 4. 创建数据处理管道
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
# 5. 构建机器学习管道
model = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42))])
# 6. 训练模型
X = train_df.drop(['Survived', 'Name', 'Ticket', 'Cabin'], axis=1)
y = train_df['Survived']
model.fit(X, y)
# 7. 预测并保存结果
# 测试集需要保持与训练集相同的特征
X_test = test_df.drop(['Name', 'Ticket', 'Cabin'], axis=1)
result = model.predict(X_test)
# 8. 保存预测结果
pd.DataFrame({'Survived': result}).to_csv('./predict.csv', index=False)
#********* End *********#
```
## 实现说明
### 1. 数据预处理
- **家庭规模特征**:计算$$ \text{FamilySize} = \text{SibSp} + \text{Parch} + 1 $$反映家庭规模
- **独自旅行特征**:根据家庭规模创建二元特征$$ \text{IsAlone} =
\begin{cases}
1 & \text{if } \text{FamilySize} = 1 \\
0 & \text{otherwise}
\end{cases}
$$
- **称呼提取**:从姓名中提取并规范化称呼特征,如Mr、Mrs、Miss等[^2]
- **缺失值处理**:
- 年龄使用中位数填充
- 登船港口使用众数'S'填充
### 2. 特征工程
- **数值特征**:年龄、船票价格、家庭规模、是否独自旅行
- **类别特征**:船舱等级、性别、登船港口、称呼
- **移除无关特征**:姓名、船票号和舱位号被移除,因与生还预测关联较弱
### 3. 机器学习管道
- **数值特征处理**:
- 使用中位数填充缺失值
- 使用标准化转换$$ x_{\text{new}} = \frac{x - \mu}{\sigma} $$
- **类别特征处理**:
- 使用众数填充缺失值
- 使用独热编码转换
- **分类模型**:使用随机森林分类器,100棵子树,最大深度5防止过拟合
### 4. 模型性能评估
虽然题目未要求,但我们可以评估模型表现:
```python
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)
print(f"交叉验证准确率: {scores.mean():.4f} ± {scores.std():.4f}")
```
### 5. 结果保存
预测结果按测试集顺序保存在`./predict.csv`文件中,格式要求:
```
Survived
0
1
0
...
```
## 相关问题
1. 如何进一步提高泰坦尼克号生还预测的准确率?可以考虑添加哪些新特征?
2. 随机森林模型在泰坦尼克号问题上有哪些优点和局限性?
3. 逻辑回归和支持向量机(SVM)在此类问题上表现如何?[^3]
4. 哪些特征对生还预测影响最大?如何评估特征重要性?
5. 如何处理年龄特征与生还率之间的非线性关系?