开始使用Kaggle去系统接触一下机器学习深度学习
前言 2026年5月27日,保研前的所有课程已经结束,已经可以为将来的研究生牛马生活做些铺垫了,遂开始系统学习机器学习深度学习。此前已经将理论诸如SVM、LSTM、CNN之类过了一遍,但是很少有使用pytorch、sklearn实操的机会,于是选择在kaggle上找些题做。
初见 早在大三上学期的《数据挖掘》课上,老师就为我们介绍过kaggle这个平台并鼓励我们在上面参加比赛,那时的我还是个抱着Agent开发和传统后端不放的纯正软工人,直到现在才知道当时的短浅QAQ
Kaggle的本质也是个大型的OJ,我是这么认为的。给定题目数据集,用户去做分类/回归等任务并提交测试集的预测csv,最终平台将预测结果与test_data的label进行评估并最终打分(准确率)。
kaggle的主要workspace是notebook(话说搞ML,DL的好像都喜欢在notebook写东西),当然也可以下载到本地去运行,毕竟最终要提交的只有预测结果的csv。
First Try 毫无疑问的,Hello World级别的 Titanic - Machine Learning from Disaster
本质是通过泰坦尼克号的所有乘客的信息,预测其生还与否
那么就开始做题吧~
第一步:读取数据 没啥好说的
1 2 3 4 5 6 import numpy as np import pandas as pdtrain_data = pd.read_csv("../input/competitions/titanic/train.csv" ) test_data = pd.read_csv("../input/competitions/titanic/test.csv" ) print (train_data.head())
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 PassengerId Survived Pclass \ 0 1 0 3 1 2 1 1 2 3 1 3 3 4 1 1 4 5 0 3 Name Sex Age SibSp \ 0 Braund, Mr. Owen Harris male 22.0 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 2 Heikkinen, Miss. Laina female 26.0 0 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 4 Allen, Mr. William Henry male 35.0 0 Parch Ticket Fare Cabin Embarked 0 0 A/5 21171 7.2500 NaN S 1 0 PC 17599 71.2833 C85 C 2 0 STON/O2. 3101282 7.9250 NaN S 3 0 113803 53.1000 C123 S 4 0 373450 8.0500 NaN S
第二步:分析 1 print (train_data.groupby('Sex' )['Survived' ].mean())
输出
1 2 3 4 Sex female 0.742038 male 0.188908 Name: Survived, dtype: float64
可以通过这种方式去判断哪些属性有用,哪些没用
第三步:删除无关列 1 2 3 4 5 cols_to_drop=['PassengerId' ,'Name' ,'Ticket' ,'Fare' ,'Cabin' ,'Embarked' ] train_data = train_data.drop(cols_to_drop, axis=1 ) test_data = test_data.drop(cols_to_drop, axis=1 ) print (train_data.head())
输出
1 2 3 4 5 6 Survived Pclass Sex Age SibSp Parch 0 0 3 male 22.0 1 0 1 1 1 female 38.0 1 0 2 1 3 female 26.0 0 0 3 1 1 female 35.0 1 0 4 0 3 male 35.0 0 0
第四步:预处理 检查缺失值
输出
1 2 3 4 5 6 7 Survived False Pclass False Sex False Age True SibSp False Parch False dtype: bool
处理缺失值 注意!!! 一定,一定,要使用训练集的平均值去给测试集做缺失值填充,接下来的归一化等操作还会涉及到此类问题。
究其原因,如果使用测试集的平均值填充,那么测试集的平均值就相当于泄露了
1 2 3 4 5 train_data['Age' ] = train_data['Age' ].fillna(train_data['Age' ].mean()) test_data['Age' ] = test_data['Age' ].fillna(train_data['Age' ].mean()) print (train_data.head(10 ))train_data.isna().any ()
拆分x_train,y_train并归一化 1 2 3 4 5 6 7 8 9 10 11 12 from sklearn.preprocessing import MinMaxScalerx_train = train_data.drop("Survived" ,axis=1 ) y_train = train_data["Survived" ] x_test = test_data scaler = MinMaxScaler() x_train = scaler.fit_transform(x_train) x_test = scaler.transform(x_test) print (x_train[:10 ])
输出
1 2 3 4 5 6 7 8 9 10 [[1. 1. 0.27117366 0.125 0. ] [0. 0. 0.4722292 0.125 0. ] [1. 0. 0.32143755 0. 0. ] [0. 0. 0.43453129 0.125 0. ] [1. 1. 0.43453129 0. 0. ] [1. 1. 0.36792055 0. 0. ] [0. 1. 0.67328474 0. 0. ] [1. 1. 0.01985423 0.375 0.16666667 ] [1. 0. 0.33400352 0. 0.33333333 ] [0.5 0. 0.17064589 0.125 0. ]]
第五步:训练模型 1 2 3 4 5 from sklearn.svm import SVCmodel = SVC(kernel='linear' ) model.fit(x_train, y_train)
第六步:预测 1 2 3 4 5 6 7 8 9 10 11 predictions = model.predict(x_test) test_data = pd.read_csv("../input/competitions/titanic/test.csv" ) output = pd.DataFrame({ 'PassengerId' : test_data.PassengerId, 'Survived' : predictions }) output.to_csv('submission.csv' , index=False ) print (output[:50 ])
最终提交
结果 0.76555的准确率,位居70%。
下一步就是优化了。
总结 在Kaggle上做这个还是挺有意思的,找回了大一的时候做OJ的感觉。甚至也会有优秀解法可以参考