sklearn一些小技巧的记录(pipeline) *

博客记录了sklearn中pipeline的一些小技巧,聚焦于信息技术领域里机器学习工具的使用,能为相关开发人员提供实用参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<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. 如何处理年龄特征与生还率之间的非线性关系?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值