当前位置: 首页 > news >正文

python学习DAY22打卡

作业:

自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码

kaggle泰坦尼克号人员生还预测

import warnings
warnings.filterwarnings("ignore") #忽略警告信息
# 数据处理清洗包
import pandas as pd
import numpy as np
import random as rnd
# 可视化包
import seaborn as sns
import matplotlib.pyplot as plt
# 机器学习算法相关包
from sklearn.linear_model import LogisticRegression, Perceptron, SGDClassifier
# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
data_train = pd.read_csv(r'train.csv')    #读取训练集数据
data_test = pd.read_csv(r'test.csv')    #读取测试集数据
combine = [data_train, data_test] # 合并数据
#这只是放到一个列表,以便后续合并,现在还没合并
print(data_train.isnull().sum())
print(data_test.isnull().sum())
#删除无用特征 Ticket 
print("Before", data_train.shape, data_test.shape, combine[0].shape, combine[1].shape)
data_train = data_train.drop(['Ticket'], axis=1)
data_test = data_test.drop(['Ticket'], axis=1)
combine = [data_train, data_test]
print("After", data_train.shape, data_test.shape, combine[0].shape, combine[1].shape)# 转换分类特征Sex
for dataset in combine:dataset['Sex'] = dataset['Sex'].map( {'female': 1, 'male': 0} ).astype(int)  #男性赋值为0,女性赋值为1,并转换为整型数据
data_test.head()# 创建空数组
guess_ages = np.zeros((2,3))
guess_ages# 遍历 Sex (0 或 1) 和 Pclass (1, 2, 3) 来计算六种组合的 Age 猜测值
for dataset in combine:# 第一个for循环计算每一个分组的Age预测值for i in range(0, 2):for j in range(0, 3):guess_df = dataset[(dataset['Sex'] == i) & \(dataset['Pclass'] == j+1)]['Age'].dropna()age_guess = guess_df.median()# 将随机年龄浮点数转换为最接近的 0.5 年龄(四舍五入)guess_ages[i,j] = int( age_guess/0.5 + 0.5 ) * 0.5# 第二个for循环对空值进行赋值        for i in range(0, 2):for j in range(0, 3):dataset.loc[ (dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j+1),\'Age'] = guess_ages[i,j]dataset['Age'] = dataset['Age'].astype(int)
data_train.head()# Embarked: 仅2个缺失,用众数填充
data_train['Embarked'].fillna(data_train['Embarked'].mode()[0], inplace=True)
data_test['Embarked'].fillna(data_test['Embarked'].mode()[0], inplace=True)
print(data_train.isnull().sum())
# Fare: 极少数缺失,用中位数填充
data_test['Fare'].fillna(data_test['Fare'].median(), inplace=True)# 姓名对预测生存率的影响较小,除非从中提取出有用的信息(如头衔、家庭关系等)
data_train['Title'] = data_train['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
data_train['Title'] = data_train['Title'].replace(['Lady', 'Countess', 'Dr', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
data_train['Title'] = data_train['Title'].replace('Mlle', 'Miss').replace('Ms', 'Miss').replace('Mme', 'Mrs')
data_test['Title'] = data_test['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
data_test['Title'] = data_test['Title'].replace(['Lady', 'Countess', 'Dr', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
data_test['Title'] = data_test['Title'].replace('Mlle', 'Miss').replace('Ms', 'Miss').replace('Mme', 'Mrs')
# 计算家庭成员数量,家庭规模可能影响生存率
data_train['FamilySize'] = data_train['SibSp'] + data_train['Parch'] + 1
data_test['FamilySize'] = data_test['SibSp'] + data_test['Parch'] + 1
# 结合 FamilySize 创建新特征(如是否独自乘船):
data_train['IsAlone'] = (data_train['FamilySize'] == 1).astype(int)
data_test['IsAlone'] = (data_test['FamilySize'] == 1).astype(int)
# 客舱甲板
# 提取客舱首字母(如果有的话)
data_train['Deck'] = data_train['Cabin'].str[0]
data_train['Deck'] = data_train['Deck'].fillna('Unknown') # 填充缺失值
data_test['Deck'] = data_test['Cabin'].str[0]
data_test['Deck'] = data_test['Deck'].fillna('Unknown') # 填充缺失值
# 删除冗余特征
data_train.drop([ 'Name', 'Cabin'], axis=1, inplace=True)
data_test.drop(['Name', 'Cabin'], axis=1, inplace=True)
# 先筛选字符串变量
discrete_features = data_train.select_dtypes(include=['object']).columns.tolist()
print("离散变量:", discrete_features)  # 打印离散变量列名data_train.rename(columns={'Sex': 'isFemale'}, inplace=True)  # 重命名列名 -> 是否女性
data_test.rename(columns={'Sex': 'isFemale'}, inplace=True)  # 重命名列名
print(data_train['isFemale'].value_counts())  # 打印Sex列的取值分布
# 对embarked和deck进行独热编码(无序)
data_train = pd.get_dummies(data_train, columns=['Embarked', 'Deck'], dtype=int, drop_first=True)
data_test = pd.get_dummies(data_test, columns=['Embarked', 'Deck'], dtype=int, drop_first=True)# 确保训练集和测试集的列顺序一致
# 排除标签列'Survived',仅比较特征列
feature_columns = [col for col in data_train.columns if col != 'Survived']
missing_cols = set(feature_columns) - set(data_test.columns)
for col in missing_cols:data_test[col] = 0
# 按照训练集特征列的顺序排序测试集列
data_test = data_test[feature_columns]print(data_train.head())
title_mapping = {'Mr': 0,'Rare': 1,'Master': 2,'Miss': 3,'Mrs': 4
}
data_train['Title'] = data_train['Title'].map(title_mapping)
data_test['Title'] = data_test['Title'].map(title_mapping)
print(data_train['Title'].value_counts())  # 打印Title列的取值分布
# 对Age, Fare 进行标准化(均值为0,方差为1)
from sklearn.preprocessing import StandardScaler, MinMaxScaler
scaler = StandardScaler()
data_train[['Age', 'Fare']] = scaler.fit_transform(data_train[['Age', 'Fare']])print(data_train.head())  # 打印前几行数据
print(data_train.info())# 划分一下测试集
from sklearn.model_selection import train_test_split
X = data_train.drop(['Survived'], axis=1)  # 特征,axis=1表示按列删除
y = data_train['Survived'] # 标签
# 按照8:2划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 80%训练集,20%测试集# --- 1. 默认参数的随机森林 ---
from sklearn.ensemble import RandomForestClassifier #随机森林分类器
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") # 忽略所有警告信息
import time
print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
start_time = time.time() # 记录开始时间
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train) # 在训练集上训练
rf_pred = rf_model.predict(X_test) # 在测试集上预测
end_time = time.time() # 记录结束时间
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
print("\n默认随机森林 在测试集上的分类报告:")
print(classification_report(y_test, rf_pred))
print("默认随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred))

@浙大疏锦行

http://www.dtcms.com/a/297678.html

相关文章:

  • 深入解析Hadoop高频面试题:HDFS读/写流程的RPC调用链
  • yolov8通道级剪枝讲解(超详细思考版)
  • 解密负载均衡:如何轻松提升业务性能
  • JS事件流
  • 疯狂星期四第19天运营日记
  • 网络资源模板--基于Android Studio 实现的天气预报App
  • LeetCode 127:单词接龙
  • 三维图像识别中OpenCV、PCL和Open3D结合的主要技术概念、部分示例
  • 水库大坝安全监测的主要内容
  • MySQL 全新安装步骤(Linux版yum源安装)
  • Lua(面向对象)
  • 深度学习水论文:特征提取
  • NBIOT模块 BC28通过MQTT协议连接到EMQX
  • 如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi
  • 智能网关:物联网时代的核心枢纽
  • ABP VNext + Razor 邮件模板:动态、多租户隔离、可版本化的邮件与通知系统
  • 智能网关芯片:物联网连接的核心引擎
  • 酷暑来袭,科技如何让城市清凉又洁净?
  • 制造业低代码平台实战评测:简道云、钉钉宜搭、华为云Astro、金蝶云·苍穹、斑斑低代码,谁更值得选?
  • 使用 FFmpeg 实现 RTP 音频传输与播放
  • 【Redis】初识Redis(定义、特征、使用场景)
  • Spring框架
  • 认识编程(3)-语法背后的认知战争:类型声明的前世今生
  • vue3单页面连接多个websocket并实现断线重连功能
  • 机器学习笔记(三)——决策树、随机森林
  • Git指令
  • git将本地文件完和仓库文件目录完全替换-------还有将本地更新的文件放到仓库中,直接提交即可
  • C# WPF 实现读取文件夹中的PDF并显示其页数
  • STM32与ADS1220多通道采样数据
  • vscode 登录ssh记住密码直接登录设置