news 2026/2/10 9:43:32

DAY26 针对Kaggle平台提交一个比赛代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAY26 针对Kaggle平台提交一个比赛代码

今天是第一次实战,这次的目的主要是再次熟悉机器学习的训练流程,并能够在Kaggle平台上成功实现第一份作品的提交。

一、登录Kaggle并创建相应的账号

这一步利用谷歌邮箱或者是QQ邮箱均可快速实现在此不做过多赘述。

二、登录后选择Kaggle的competitions的选项进入如下界面

在相应的搜索框内搜索想查询方向的比赛,并选择心仪的比赛参加,这次我所选择的是泰坦尼克号——灾难中的机器学习。

三、进入特定比赛界面

进入特定比赛界面后,可自行根据相应的流程提交相应的作品,我本次比赛的作品要求如下:

你的提交应该是一个CSV文件,包含418行和一个头部。你可以上传zip/gz/7z的压缩包。(一般比赛方会给出相应的比赛作品格式的示例)。

本次比赛的代码:

# 读取数据 #此处读取数据时可以是相对路径也可以是绝对路径 import pandas as pd data = pd.read_csv(r'D:\FristKaggle\titanic\train.csv') data.info() # 列名、非空值、数据类型 data.shape # (行数, 列数) data的属性 data.columns # 所有列名 data的属性 data.describe() # 数值列的基本统计量 #data["Annual Income"].dtype # 查看某一列的数据类型 data.isnull() # 布尔矩阵显示缺失值,这个方法返回一个布尔矩阵,其中True表示对应位置的值是缺失值,False表示对应位置的值不是缺失值。 data.isnull().sum() # 每列缺失值计数,sum方法为求每一列的和 此外此方法可验证缺失值是否补全 #预处理消除不必要的警告 import warnings warnings.filterwarnings('ignore') # 在填补缺失值后、独热编码前添加: print("\n处理高基数特征...") # 1. 删除无用列 data = data.drop(['PassengerId', 'Name', 'Ticket'], axis=1) # 2. Cabin列处理:由于缺失太多(204/891),提取首字母或删除 data['Cabin'] = data['Cabin'].fillna('Unknown') # 或者只保留首字母 data['Cabin'] = data['Cabin'].str[0] # 3. 然后进行独热编码,但只对类别少的列 # 重新定义离散变量列表,不包括已删除的列 discrete_lists = [] for discrete_features in data.columns: if data[discrete_features].dtype == 'object': # 只对类别数小于10的列进行独热编码 unique_count = data[discrete_features].nunique() print(f"列 '{discrete_features}' 有 {unique_count} 个唯一值") if unique_count < 10: # 只编码类别少的列 discrete_lists.append(discrete_features) else: print(f" -> 跳过 {discrete_features},类别太多") # 第二步 填补缺失值(离散+连续) 先填补缺失值可以避免独热编码后补全的众数值为0的问题 for i in data.columns: # 找到为数值型的列(连续变量) if data[i].dtype != 'object': # 找到为数值型的列 if data[i].isnull().sum() > 0: # 找到存在缺失值的列 #计算该列的均值 mean_value = data[i].mean() #用均值填充缺失值 data[i].fillna(mean_value, inplace=True) # 找到为非数值型的列(离散变量) else: if data[i].isnull().sum() > 0: # 找到存在缺失值的列 # 计算该列的众数(出现频率最高的值) mode_value = data[i].mode()[0] # mode()返回一个Series,取第一个众数 print(f"列 '{i}' 的众数是: {mode_value}") # 可以查看众数值 # 用众数填充缺失值 data[i].fillna(mode_value, inplace=True) #第三步对离散变量进行one-hot编码 # 找到离散变量 discrete_lists = [] # 新建一个空列表,用于存放离散变量名 for discrete_features in data.columns: if data[discrete_features].dtype == 'object': discrete_lists.append(discrete_features) # 离散变量独热编码 one_hot_data = pd.get_dummies(data, columns=discrete_lists, drop_first=True) #获得所有独热编码后的新特征名 方便后续对独热编码后的变量转化为int型 #list_append存放独热编码后新增的特征名 #one_hot_data.columns.difference(data.columns)这个操作是​​获取两个相同集合的差集 list_append = one_hot_data.columns.difference(data.columns) # 接着之前的,对bool特征进行类型转换 for i in list_append: one_hot_data[i] = one_hot_data[i].astype(int) # 这里的i就是独热编码后的特征名 one_hot_data.head() data.isnull().sum() # 划分训练集和测试机 from sklearn.model_selection import train_test_split X = one_hot_data.drop(['Survived'], axis=1) # 特征,axis=1表示按列删除 y = one_hot_data['Survived'] # 标签 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 划分数据集,20%作为测试集,随机种子为42 # 训练集和测试集的形状 print(f"训练集形状: {X_train.shape}, 测试集形状: {X_test.shape}") # 打印训练集和测试集的形状 from sklearn.svm import SVC #支持向量机分类器 from sklearn.neighbors import KNeighborsClassifier #K近邻分类器 from sklearn.linear_model import LogisticRegression #逻辑回归分类器 import xgboost as xgb #XGBoost分类器 import lightgbm as lgb #LightGBM分类器 from sklearn.ensemble import RandomForestClassifier #随机森林分类器 from catboost import CatBoostClassifier #CatBoost分类器 from sklearn.tree import DecisionTreeClassifier #决策树分类器 from sklearn.naive_bayes import GaussianNB #高斯朴素贝叶斯分类器 from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标 from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵 import warnings #用于忽略警告信息 warnings.filterwarnings("ignore") # 忽略所有警告信息 # KNN knn_model = KNeighborsClassifier() knn_model.fit(X_train, y_train) knn_pred = knn_model.predict(X_test) print("\nKNN 分类报告:") print(classification_report(y_test, knn_pred)) print("KNN 混淆矩阵:") print(confusion_matrix(y_test, knn_pred)) knn_accuracy = accuracy_score(y_test, knn_pred) knn_precision = precision_score(y_test, knn_pred) knn_recall = recall_score(y_test, knn_pred) knn_f1 = f1_score(y_test, knn_pred) print("KNN 模型评估指标:") print(f"准确率: {knn_accuracy:.4f}") print(f"精确率: {knn_precision:.4f}") print(f"召回率: {knn_recall:.4f}") print(f"F1 值: {knn_f1:.4f}") # 随机森林 rf_model = RandomForestClassifier(random_state=42) rf_model.fit(X_train, y_train) rf_pred = rf_model.predict(X_test) print("\n随机森林 分类报告:") print(classification_report(y_test, rf_pred)) print("随机森林 混淆矩阵:") print(confusion_matrix(y_test, rf_pred)) rf_accuracy = accuracy_score(y_test, rf_pred) rf_precision = precision_score(y_test, rf_pred) rf_recall = recall_score(y_test, rf_pred) rf_f1 = f1_score(y_test, rf_pred) print("随机森林 模型评估指标:") print(f"准确率: {rf_accuracy:.4f}") print(f"精确率: {rf_precision:.4f}") print(f"召回率: {rf_recall:.4f}") print(f"F1 值: {rf_f1:.4f}") # 读取测试集数据 test_data = pd.read_csv(r'D:\FristKaggle\titanic\test.csv') # 保存PassengerId用于最终提交 passenger_ids = test_data['PassengerId'].copy() # 对测试集进行与训练集相同的预处理 # 1. 删除无用列(与训练集保持一致) test_data = test_data.drop(['PassengerId', 'Name', 'Ticket'], axis=1) # 2. Cabin列处理(与训练集保持一致) test_data['Cabin'] = test_data['Cabin'].fillna('Unknown') test_data['Cabin'] = test_data['Cabin'].str[0] # 3. 填补缺失值(使用与训练集相同的逻辑) for i in test_data.columns: if test_data[i].dtype != 'object': # 数值型列 if test_data[i].isnull().sum() > 0: # 使用训练集的均值填充,避免数据泄露 if i in data.columns: # 确保列存在于训练集中 mean_value = data[i].mean() test_data[i].fillna(mean_value, inplace=True) else: test_data[i].fillna(test_data[i].mean(), inplace=True) else: # 非数值型列 if test_data[i].isnull().sum() > 0: # 使用训练集的众数填充 if i in data.columns: mode_value = data[i].mode()[0] test_data[i].fillna(mode_value, inplace=True) else: test_data[i].fillna(test_data[i].mode()[0], inplace=True) # 4. 独热编码(使用与训练集相同的列) # 确保测试集与训练集的列一致 test_one_hot = pd.get_dummies(test_data, columns=discrete_lists, drop_first=True) # 添加训练集中有但测试集中没有的列,并填充0 missing_cols = set(X_train.columns) - set(test_one_hot.columns) for col in missing_cols: test_one_hot[col] = 0 # 确保列的顺序与训练集一致 test_one_hot = test_one_hot[X_train.columns] # 5. 选择最佳模型进行预测(以随机森林为例) # 您可以根据上面的评估结果选择表现最好的模型 best_model = rf_model # 这里使用随机森林,您可以选择其他表现更好的模型 # 进行预测 test_predictions = best_model.predict(test_one_hot) # 6. 创建提交文件 submission = pd.DataFrame({ 'PassengerId': passenger_ids, 'Survived': test_predictions }) # 7. 保存为CSV文件 submission.to_csv('titanic_predictions.csv', index=False) print("预测完成!结果已保存到 'titanic_predictions.csv'") print(f"提交文件形状: {submission.shape}") print("\n前10条预测结果:") print(submission.head(10))

注:本次比赛的代码只是为了熟悉一下Kaggle平台,只是做了一些简单处理,仍然有很大的改进空间。

最终结果:

@浙大疏锦行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/9 1:02:03

关于VM的使用

1. VM功能介绍&#xff08;1&#xff09;功能一&#xff1a;挂起操作&#xff08;将操作暂时保存起来&#xff0c;方便下次接着使用&#xff09;&#xff08;2&#xff09;功能二&#xff1a;快照操作&#xff08;将操作保存起来&#xff0c;防止操作不当&#xff0c;可以回退到…

作者头像 李华
网站建设 2026/2/9 16:21:10

3分钟搞定!文泉驿微米黑字体全平台安装终极指南

3分钟搞定&#xff01;文泉驿微米黑字体全平台安装终极指南 【免费下载链接】fonts-wqy-microhei Debian package for WenQuanYi Micro Hei (mirror of https://anonscm.debian.org/git/pkg-fonts/fonts-wqy-microhei.git) 项目地址: https://gitcode.com/gh_mirrors/fo/font…

作者头像 李华
网站建设 2026/1/30 16:04:47

Flutter 状态管理全家桶:Provider、Bloc、GetX 实战对比

Flutter 状态管理全家桶&#xff1a;Provider、Bloc、GetX 实战对比 在 Flutter 开发中&#xff0c;状态管理是贯穿项目全生命周期的核心议题。从简单的按钮点击状态切换&#xff0c;到复杂的跨页面数据共享与业务逻辑联动&#xff0c;选择合适的状态管理方案直接决定了项目的…

作者头像 李华
网站建设 2026/2/7 22:16:33

Flutter 网络请求完全指南:Dio 封装与拦截器实战

Flutter 网络请求完全指南&#xff1a;Dio 封装与拦截器实战 在 Flutter 开发中&#xff0c;网络请求是连接前端与后端服务的核心桥梁&#xff0c;直接影响应用的交互体验与数据流转效率。Dio 作为 Flutter 生态中最主流的网络请求库&#xff0c;支持 RESTful API、FormData、…

作者头像 李华
网站建设 2026/1/31 7:56:53

DPO微调

&#x1f34b;&#x1f34b;AI学习&#x1f34b;&#x1f34b;&#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主…

作者头像 李华
网站建设 2026/2/8 4:42:58

内容管理系统(CMS)的7个关键特点

一套高效的内容管理系统&#xff08;CMS&#xff09;能帮你节省时间、开辟内容个性化的空间&#xff0c;并提升在线形象——从而改善业务成效。合适的CMS可以保持数字形象井然有序、品牌风格统一&#xff0c;并让内容流程顺畅运转&#xff0c;有助于在营销各个环节吸引并留住潜…

作者头像 李华