机器学习——Kaggle初体验

开始使用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 pd

train_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
train_data.isna().any()

输出

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 MinMaxScaler

# 训练包含features与label分别为x与y
x_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 SVC
model = 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)

# 生成提交文件(必须包含PassengerId和Survived两列)
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的感觉。甚至也会有优秀解法可以参考