Stacking 在机器学习中的应用,以kaggle titanic为例

本文通过实战案例,详细介绍了使用Python进行泰坦尼克号生存预测的过程,包括数据预处理、特征工程、模型选择及集成学习等关键步骤。

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

之前自己玩了一下kaggle上的入门级别的比赛,泰坦尼克号生存预测。随便进行了简单的特征选择,直接用sklearn中的模型,直接跑结果,大概能跑到0.77左右。三千多名。

近段时间稍微闲下来了,开始着手做一些机器学习相关的比赛。然后想着提升上次的模型,或者在社区看看别人用的是什么模型。

然后看到一篇高票的文章。
Introduction to Ensembling or Stacking in Python

介绍集成学习和模型融合在泰坦尼克号上的应用。

之前只知道什么是集成,对于Stacking这个词还是比较陌生的,没有听过。

然后就查了一些资料,以下附上一些入门级的资料。






然后就是按照 Introduction to Ensembling or Stacking in Python里面的python notebook 的代码,自己敲了一遍,感觉学到了很多,特征提取方面,而且也复习了pandas的一些重要的函数。

这是我敲的notebook https://github.com/ZDstandup/titanic_notebook ,有一些简单的注释。

下面先给出学到的相关pandas的函数。用到的总结以下。

1.读取csv文件,这个csv文件里面的数据要有属性名称才行
train=pd.read_csv('train.csv')#读取数据
test=pd.read_csv('test.csv')#读取数据


2.查看dataframe数据的部分
train.head(3)    #查看前三行数据

3.添加新的属性
直接创建新的属性即可
#1,顾客name的长度
#直接增加一个属性列;直接对整个属性列进行操作;apply(function)中的函数对整体操作
train['Name_length'] =train['Name'].apply(len)


4.对整个属性列进行函数操作
apply(function)
#1,顾客name的长度
#直接增加一个属性列;直接对整个属性列进行操作;apply(function)中的函数对整体操作
train['Name_length']=train['Name'].apply(len)
    

5.apply()里面自建函数操作
#2,是否有客舱号码Cabin也是一个特征,有就为1,没有就为0
train['Has_Cabin']=train['Cabin'].apply( lambda x: 0 if type(x)==float else 1 )
test['Has_Cabin']=test['Cabin'].apply(lambda x : 0 if type(x)==float else 1)


6.相同数据格式的属性列,可以相加
dataset['FamilySize']=dataset['SibSp']+dataset['Parch']+1


7.提取具备某种条件的属性列  pd.loc()函数
#就相当于数据库sql语句的条件查询一样
dataset.loc[dataset['FamilySize']==1,'IsAlone']=1
#提取的是‘IsAlone’这一列中 dataset['FamilySize']==1的值



dataset.loc[ dataset['Fare'] <= 7.91, 'Fare']                                 = 0
    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1
    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare']   = 2
    dataset.loc[ dataset['Fare'] > 31, 'Fare']                                     = 3


8.缺失值的填充fillna()
for dataset in full_data:
    dataset['Embarked']=dataset['Embarked'].fillna('S')
#用‘S’填充‘Embarked’的缺失值

#把数据集的Fare票价这一列中为0 的填充为该列的median()中位数
for dataset in full_data:
    dataset['Fare']=dataset['Fare'].fillna(dataset['Fare'].median())


9.查看某个属性列的数据情况
train['Fare'].head(10)


10.获取中位数median()
train['Fare'].median()

常用的统计的函数:
######################## ******************************************
count 非 NA 值的数量
describe 针对 Series 或 DF 的列计算汇总统计
min , max 最小值和最大值
argmin , argmax 最小值和最大值的索引位置(整数)
idxmin , idxmax 最小值和最大值的索引值
quantile 样本分位数(0 到 1)
sum 求和
mean 均值
median 中位数
mad 根据均值计算平均绝对离差
var 方差
std 标准差
skew 样本值的偏度(三阶矩)
kurt 样本值的峰度(四阶矩)
cumsum 样本值的累计和
cummin , cummax 样本值的累计最大值和累计最小值
cumprod 样本值的累计积
diff 计算一阶差分(对时间序列很有用)
pct_change 计算百分数变化



11.统计属性列为空的样本个数
isnull()

train["Age"].isnull().sum()



12.转换属性列的数值类型
dataset['Age']=dataset['Age'].astype(int)#转换类型



13.取出为空的,并赋值新的值
dataset['Age'][np.isnan(dataset['Age'])]=age_null_random_list#把为空的取出来,再把随机的列表与之对应
#先得到bool型,在提取为True的,在进行赋值一个列表


14.把属性列的数据分成几个等份
train['CategoricalAge']=pd.qcut(train['Age'],5)
#分成5个区间,每个区间的样本数量相等



15.替换属性列里面的元素
# Group all non-common titles into one single grouping "Rare"
for dataset in full_data:
    dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')


16.对于一些属性值是离散值的,可以使用mapping操作
dataset['Sex'] = dataset['Sex'].map( {'female': 0, 'male': 1} ).astype(int)




17.删除一些属性列drop()
#现在需要的特征基本完了,现在需要把一些无用的特征属性给去掉,删除掉
drop_elements=['PassengerId', 'Name', 'Ticket', 'Cabin', 'SibSp']
train=train.drop(drop_elements,axis=1)#去掉列表中的属性列
train=train.drop(['CategoricalAge', 'CategoricalFare'], axis = 1)#只删除train中这两个列,因为test没有添加,
                                                                 #这两个列其实只是为了划分一个区间出来,便于mapping到整数上去
test=test.drop(drop_elements,axis=1)




再给出自己敲的notebook,里面也有自己易懂的注释。


这里给出一个在stacking中的一个重要的部分。
#这个函数是用于交叉实验的
#clf是选择的分类模型,x_train是所有训练集,y_train是所有训练集样本的类别标签,x_test是给定的所有测试集
def get_oof(clf, x_train, y_train, x_test):
    oof_train = np.zeros((ntrain,))#长度为891的全0array
    oof_test = np.zeros((ntest,))#长度为418的全0array
    oof_test_skf = np.empty((NFOLDS, ntest))#一个用随机值填充的5*418的矩阵,用来存放5次交叉后的预测结果
    for i, (train_index, test_index) in enumerate(kf):
        #5次交叉,5次循环
        #kf实际上是一个迭代器,是从891个样本中分成了5组训练集和测试集的索引号
        x_tr = x_train[train_index]#当前循环,当前实验的训练数据
        y_tr = y_train[train_index]#当前循环的训练数据标签
        x_te = x_train[test_index]#d当前循环的测试数据
        clf.train(x_tr, y_tr)#用模型去拟合数据,也就是训练预测模型
        oof_train[test_index] = clf.predict(x_te)#把测试数据的预测标签按照对应索引,放到oof_train对应索引处
        oof_test_skf[i, :] = clf.predict(x_test)#用当前的模型,预测所有测试数据的标签,并放到oof_test_skf的一行中
        
    #5次实验做完,把5次得到的结果求平均
    oof_test[:] = oof_test_skf.mean(axis=0)
    return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)




不过按照作者的代码敲下来,感觉结果也并不是很好,大概3000多名,0.79左右。不知道那些高于0.9几得分的是怎么搞的。

不过作为一个入门的练习,了解了整个流程,以及作比赛的常用方法与套路,就可以,这个小比赛没必要做的非常好。

有时间做一个比较大的比赛。好好的研究研究。




感想:感觉看一些英文资料,挺好的。有些知识的中文资料确实比较少。还有就是逛kaggle的 kernels真的很爽。


































































































































































































































































































<think>嗯,用户之前已经询问过Excel数据分析的学习路径,现在他们想知道如何在实践Kaggle数据集时进行学习。我需要先理解他们的需求。看起来他们已经掌握了Excel的基础,现在想通过实际项目,特别是Kaggle的数据集,来提升数据分析能力。可能他们想转向更高级的数据分析工具,比如Python或R,或者继续在Excel中应用更复杂的分析? 首先,我要确定用户的技术背景。他们之前学的是Excel,但Kaggle上的项目通常需要编程技能,比如Python和库如Pandas、Scikit-learn。不过,用户可能还不熟悉这些,或者希望先用Excel处理Kaggle数据?需要确认这点。但考虑到Kaggle环境主要是代码驱动的,可能用户想开始学习编程分析。 然后,用户可能希望有一个结构化的学习路径,结合Kaggle数据集,从数据清洗到建模,逐步实践。他们可能需要指导如何选择合适的数据集,如何处理数据,如何构建模型,以及如何参与竞赛。此外,他们可能对如何利用Kaggle社区资源感兴趣,比如笔记本、讨论区。 还需要注意用户可能的时间投入和学习方式。比如是否喜欢自学,是否需要推荐资源,如在线课程或书籍。另外,用户可能关心如何平衡理论学习和实践,避免陷入盲目调参而缺乏理解。 我应该分步骤回答,从准备阶段、数据处理、分析建模到社区互动。每个阶段给出具体的方法和示,比如如何选择数据集,使用什么工具,如何应用机器学习模型。同时强调实践和理论结合,建议用户参与竞赛和阅读优秀代码,以及记录和总结项目经验。 另外,用户之前的Excel学习可能涉及数据清洗和透视表,现在可能需要扩展到编程工具,所以应该推荐Python的基础学习,并提供过渡的建议,比如先用Excel做探索,再用Python处理更复杂的任务。或者,如果用户仍想用Excel,可能需要调整建议,但Kaggle通常需要编程,所以可能重点放在Python上。 最后,要确保回答清晰,结构合理,鼓励用户实际操作,利用Kaggle资源,并持续学习。可能需要检查是否有遗漏的步骤,比如版本控制、项目展示等,但作为入门,保持建议简洁实用更重要。</think>以下是为您设计的Kaggle数据集实践学习路径(分步骤指导+核心方法): 一、准备阶段(环境搭建) $$开发环境 = Jupyter Notebook + Python + 常用库$$ 1. 工具准备 - 安装Anaconda(含Jupyter和常用库) - 基础库配置:Pandas/Numpy/Matplotlib/Scikit-learn - 推荐IDE:VSCode(安装Python插件)或直接使用Kaggle Notebook 2. 数据集选择原则 ```markdown | 难度等级 | 数据集特征 | 推荐案 | |----------|------------------------------|------------------------| | 青铜级 | <5MB,结构化数据,分类问题 | Titanic生存预测 | | 白银级 | 10-50MB,含文本/时间序列 | 房价预测 | | 黄金级 | 100MB+,非结构化数据 | MNIST手写数字识别 | ``` 二、数据处理实践(核心方法) 1. 探索性分析(EDA) ```python # 使用Pandas-profiling快速生成报告 from pandas_profiling import ProfileReport profile = ProfileReport(df) profile.to_file("report.html") ``` 2. 特征工程模板 $$特征组合 = \sqrt{特征A \times 特征B}$$ - 缺失值处理:用中位数填充`df.fillna(df.median())` - 类别编码:`pd.get_dummies(df['类别列'])` - 时间特征提取:`df['年'] = df['日期列'].dt.year` 三、模型构建流程(机器学习入门) 1. 基础建模流程 ```python from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 数据分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 模型训练 model = RandomForestClassifier(n_estimators=100) model.fit(X_train, y_train) # 评估预测 print("准确率:", model.score(X_test, y_test)) ``` 2. 模型优化技巧 - 交叉验证:`sklearn.model_selection.KFold` - 超参数调优:`GridSearchCV`网格搜索 - 特征重要性分析:`model.feature_importances_` 四、竞赛提升策略(以Titanic) $$评分公式 = \frac{正确预测数}{总样本数} \times 100\%$$ 1. 基准模型建立 - 使用基础随机森林获得0.78准确率 2. 进阶优化步骤 - 添加衍生特征(家庭成员数量=同船亲属数+1) - 使用Stacking模型融合(RF+GBDT+XGBoost) - 通过SHAP值分析特征影响 五、学习资源组合 ```markdown 1. 代码学习:Kaggle Notebooks(筛选Most Votes) 2. 理论补充:Coursera《机器学习》(吴恩达) 3. 工具精进:官方文档(Pandas/Scikit-learn) 4. 案库:Kaggle Learn官方教程 ``` 实战建议: 1. 从"Titanic"和"House Prices"两个经典案入手 2. 先复现高分Notebook,再尝试改进(每次修改一个变量) 3. 使用`!pip install kaggle`命令行工具直接下载数据集 4. 每周参与1次新竞赛(Active Competitions栏目) 避坑指南: 1. 不要直接复制代码,务必逐行理解 2. 遇到报错先阅读错误提示,90%的问题可通过错误信息解决 3. 内存不足时使用`dtype={'列名':'category'}`优化数据存储 4. 特征工程比调参更重要(参考Kaggle大师分享的经验法则) 进阶路线图: 青铜 → 白银(3个月):掌握数据清洗+基础模型 白银 → 黄金(6个月):精通特征工程+模型融合 黄金 → 大师(1年+):熟练处理非结构化数据+自主创新方法 注:每天投入2小时的情况下,多数学习者可在6个月内达到Kaggle Competitions前25%水平。建议将每次练习成果整理到GitHub,形成可视化的成长轨迹。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值