news 2026/4/15 8:29:36

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/4/9 22:32:48

基于图像识别技术的FGO自动化辅助工具实战指南

基于图像识别技术的FGO自动化辅助工具实战指南 【免费下载链接】FGA FGA - Fate/Grand Automata&#xff0c;一个为F/GO游戏设计的自动战斗应用程序&#xff0c;使用图像识别和自动化点击来辅助游戏&#xff0c;适合对游戏辅助开发和自动化脚本感兴趣的程序员。 项目地址: ht…

作者头像 李华
网站建设 2026/4/12 9:38:38

鸣潮自动化工具:新手也能轻松掌握的3大核心功能详解

鸣潮自动化工具&#xff1a;新手也能轻松掌握的3大核心功能详解 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 鸣潮自动化…

作者头像 李华
网站建设 2026/4/13 4:30:59

在一个事务里面死循环select一条数据,当我开启事务时,数据是1,每过5秒我就select一次,这个时候mybatis的一级缓存起作用了,所以不会去数据库查数据,等别的线程更新了数据表的数据,会使m

这个问题涉及到 MyBatis 一级缓存、事务隔离级别和数据库的并发控制。让我详细分析一下&#xff1a;1. MyBatis 一级缓存的行为MyBatis 一级缓存&#xff08;Local Cache&#xff09;是 SqlSession 级别​ 的缓存&#xff1a;在同一个 SqlSession 中执行相同的查询&#xff0c;…

作者头像 李华
网站建设 2026/4/13 20:25:47

Linux网络配置

一、网络配置&#xff08;操作顺序不能乱&#xff09;1、在终端输入ifconfig查看网卡信息&#xff0c;记住IP地址与子网掩码2、记住网关地址3、终端输入以下命令4、终端输入以下命令&#xff08;我这里显示的是ens160&#xff0c;每个人不一样&#xff09;5、修改ens160网关配置…

作者头像 李华
网站建设 2026/4/11 5:13:17

告别命令行:Applite让Mac软件管理变得简单直观

告别命令行&#xff1a;Applite让Mac软件管理变得简单直观 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为复杂的Homebrew命令而头疼吗&#xff1f;Applite这款免费开源…

作者头像 李华