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

24/9/3算法笔记 kaggle泰坦尼克

题目:

这次我用两种算法做了这道题

逻辑回归二分类算法

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score,classification_report
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, LabelEncoder

读入数据

train_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\train.csv")
test_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")

**这边有一点我居然现在才懂,训练模型后面会拆分为一部分的训练和一部分的测试模型用来训练模型,而不是用所给的测试数据来做

然后接下来是固定的特征处理,处理不需要的特征,我的理解就是和预测的目标特征无关的,然后将有些字符串可以用独热编码一系列操作合并。

还有就是特征缩放,特征缩放可以帮助算法更有效地收敛,并提高模型的性能。这里用的是最小-最大缩放

data = train_data
#删除一些无关信息
data.drop(['Name','PassengerId','Ticket','Cabin'],axis=1,inplace=True)
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Fare']=data['Fare'].fillna(data['Fare'].mean())
data['Embarked']=data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
 
#将性别与登船港口进行独热编码
dumm=pd.get_dummies(data[['Sex','Embarked']],drop_first=True)
data=pd.concat([data,dumm],axis=1)
data.drop(['Sex','Embarked'],axis=1,inplace=True)
 
#数据缩放
data['Age']=(data['Age']-data['Age'].min()) / (data['Age'].max()-data['Age'].min())
data['Fare']=(data['Fare']-data['Fare'].min()) / (data['Fare'].max()-data['Fare'].min())
print(data)

划分训练集和测试集

from sklearn.model_selection import train_test_split
X=data.drop('Survived',axis=1)
y=data['Survived']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)

然后使用逻辑回归模型

from sklearn.linear_model import LogisticRegression
LR=LogisticRegression()
LR.fit(X_train,y_train)
print('训练集准确率:\n',LR.score(X_train,y_train))
print('验证集准确率:\n',LR.score(X_test,y_test))

同样的测试数据也要进行相同的特征处理,一开始没做,然后报错了。

**哦对在,查看别的大佬的时候我看见了一个大佬不一样的特征处理,他将不同情况的人分成

不同段的人(比如Mr,Miss,Master等),非常有意思。

下面是我的训练集的处理

test_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
data = test_data
#删除一些无关信息
data.drop(['Name','PassengerId','Ticket','Cabin'],axis=1,inplace=True)
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Fare']=data['Fare'].fillna(data['Fare'].mean())
data['Embarked']=data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
 
#将性别与登船港口进行独热编码
dumm=pd.get_dummies(data[['Sex','Embarked']],drop_first=True)
data=pd.concat([data,dumm],axis=1)
data.drop(['Sex','Embarked'],axis=1,inplace=True)
 
#数据缩放
data['Age']=(data['Age']-data['Age'].min()) / (data['Age'].max()-data['Age'].min())
data['Fare']=(data['Fare']-data['Fare'].min()) / (data['Fare'].max()-data['Fare'].min())
print(data)

最后就可以预测测试集了

y_pred = LR.predict(data)
print(y_pred)

结合数据保存

df = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")

# 提取 'PassengerId' 列
passenger_ids = df['PassengerId']


result=pd.DataFrame({'PassengerId':passenger_ids ,'Survived':y_pred.astype(np.int32)})

result.to_csv('combined_columns.csv', index=False)

此算法的分数是

还有用了决策树算法

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
import graphviz
from sklearn.model_selection import train_test_split
from sklearn import tree
import pandas as pd
train_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\train.csv")
test_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
data = train_data
#删除一些无关信息
data.drop(['Name','PassengerId','Ticket','Cabin'],axis=1,inplace=True)
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Fare']=data['Fare'].fillna(data['Fare'].mean())
data['Embarked']=data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
 
#将性别与登船港口进行独热编码
dumm=pd.get_dummies(data[['Sex','Embarked']],drop_first=True)
data=pd.concat([data,dumm],axis=1)
data.drop(['Sex','Embarked'],axis=1,inplace=True)
 
#数据缩放
data['Age']=(data['Age']-data['Age'].min()) / (data['Age'].max()-data['Age'].min())
data['Fare']=(data['Fare']-data['Fare'].min()) / (data['Fare'].max()-data['Fare'].min())
print(data)

和二分类不一样的是这边多提取了一个特征名称这一步

#划分训练集和测试集,既预留一部分数据(30%),用于评估模型。
from sklearn.model_selection import train_test_split
X=data.drop('Survived',axis=1)
y=data['Survived']

feature_names = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked_Q','Embarked_S']

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)

使用模型

model = DecisionTreeClassifier()
model.fit(X_train,y_train)

画出决策树

#构建决策树
dot_data = tree.export_graphviz(model,filled = True,rounded = True,feature_names = feature_names)

graphviz.Source(dot_data)

model.fit(X_train,y_train)
print('训练集准确率:\n',model.score(X_train,y_train))
print('验证集准确率:\n',model.score(X_test,y_test))

测试集特征处理

test_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
data = test_data
#删除一些无关信息
data.drop(['Name','PassengerId','Ticket','Cabin'],axis=1,inplace=True)
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Fare']=data['Fare'].fillna(data['Fare'].mean())
data['Embarked']=data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
 
#将性别与登船港口进行独热编码
dumm=pd.get_dummies(data[['Sex','Embarked']],drop_first=True)
data=pd.concat([data,dumm],axis=1)
data.drop(['Sex','Embarked'],axis=1,inplace=True)
 
#数据缩放
data['Age']=(data['Age']-data['Age'].min()) / (data['Age'].max()-data['Age'].min())
data['Fare']=(data['Fare']-data['Fare'].min()) / (data['Fare'].max()-data['Fare'].min())
print(data)

模型预测

y_pred = model.predict(data)
print(y_pred)

df = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")

# 提取 'PassengerId' 列
passenger_ids = df['PassengerId']


result=pd.DataFrame({'PassengerId':passenger_ids ,'Survived':y_pred.astype(np.int32)})

result.to_csv('决策树combined_columns.csv', index=False)

最后的分数

两个算法的对比

逻辑回归:

  • 模型相对简单,易于理解和解释。
  • 特征权重可以直接解释为特征对事件发生概率的影响。
  • 线性模型,用于二分类问题,可以输出事件发生的概率。
  • 可以处理特征之间存在线性关系的情况。
  • 相对于决策树,逻辑回归通常更不容易过拟合。
  • 可以通过正则化技术(如L1或L2正则化)来控制模型复杂度。
  • 通常需要一些技巧来处理多分类问题,如“一对多”(One-vs-Rest)策略。
  • 通常需要对缺失数据进行处理,如填充或删除。

决策树:

  • 非线性模型,可以处理更复杂的决策边界。
  • 通过树状图的形式进行决策,可以直观地展示特征之间的非线性关系。
  • 模型可能非常复杂,具有很高的灵活性。
  • 易于可视化,决策过程直观,但可能难以解释深层次的逻辑。
  • 容易过拟合,尤其是在特征数量多于训练样本的情况下。
  • 需要剪枝(pruning)或其他技术来控制模型复杂度。
  • 可以直接处理多分类问题。
  • 可以输出每个类别的概率,但这些概率的解释可能不如逻辑回归直观。
  • 可以处理缺失数据,甚至可以在分裂时使用缺失数据作为条件。

http://www.kler.cn/a/290182.html

相关文章:

  • 【大数据学习 | flume】flume的概述与组件的介绍
  • 【HarmonyOS NEXT】一次开发多端部署(以轮播图、Tab栏、列表为例,配合栅格布局与媒体查询,进行 UI 的一多开发)
  • Could not initialize class sun.awt.X11FontManager
  • 车-路-站-网”信息耦合的汽车有序充电
  • 详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
  • ssm100医学生在线学习交流平台+vue(论文+源码)_kaic
  • goalng http client的MaxIdleConnsPerHost,MaxIdleConns,MaxConnsPerHost参数设置总结
  • 鸿蒙模拟器篇
  • stream流常见方法
  • Spring Cloud Gateway之路由配置
  • 谷粒商城实战笔记-285~290-分布式事务
  • 设计模式 18 备忘录模式
  • LeetCode的高频SQL50题(基础版)学习笔记
  • 惠中科技RDS自清洁膜层:光伏领域的绿色革命
  • Spark MLlib模型训练—回归算法 Survival Regression
  • 【Selenium】Selenium运行时报cannot find Chrome binary错误的解决办吧
  • linux之网络子系统-MAC帧、数据报、段 的头部信息
  • 【C++】如何解决“pointer to incomplete class type is not allowed”。
  • 一篇文章讲清楚什么是Spring AOP
  • 从汇编角度分析C语言中的局部变量是如何产生的
  • pikachu文件包含漏洞靶场通关攻略
  • 运维管理体系及其实践要点:为高效运维保驾护航
  • zabbix通过OMSA监控Dell服务器_zabbix dell http
  • 为什么我会有使用gradle,需要花长时间去下载依赖?使用maven就不会有这种感受?
  • c++ websocket简单讲解
  • 大势智慧携“实景三维+AI”信创产品体系亮相2024中国地理信息产业大会