首页 > 其他分享 >机器学习日志 泰坦尼克号获救预测 决策树

机器学习日志 泰坦尼克号获救预测 决策树

时间:2023-02-23 20:13:22浏览次数:47  
标签:泰坦尼克号 nowId nowD tmpD nowA len flag 日志 决策树

我是链接

第一次做机器学习的题目

题目要求:给定一堆已知的泰坦尼克号船员信息,每个人的信息包括

PassengerId => 乘客ID
Pclass => 客舱等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 兄弟姐妹数/配偶数
Parch => 父母数/子女数
Ticket => 船票编号
Fare => 船票价格
Cabin => 客舱号
Embarked => 登船港口

其中一部分还知道是否获救

现在让你推测剩余的人是否获救?

做法是利用决策树来做

刚入门,决策树做的非常简陋

利用信息增益函数(ent)来找用哪个属性来划分决策树

因为年龄有部分船员确实所以我就忽略了

为了使属性值是离散的,我让属性值和平均值作了比较来划分

正确率77.511%,以后慢慢改进

import pandas as pd
import math

cnt = 0#树的id编号
bestA = []#树上当前位置最好的a(属性)划分
ye = []#是否是叶子节点(是否得到了分类结果)
ping = []


# 判断A是否都一样
def allSame(nowD, nowA):
    for i in range(len(nowA)):
        for j in range(len(nowD)):
            if nowD[j][i] != nowD[1][i]:
                return 0
    return 1


def ent(nowD):
    sum = 0
    flag = [0, 0];
    p = [0, 0]
    for i in range(len(nowD)):
        flag[nowD[i][0]] = flag[nowD[i][0]] + 1
    p[0] = flag[0] / (flag[0] + flag[1])
    p[1] = flag[1] / (flag[0] + flag[1])
    return -p[0] * math.log(p[0] + 0.0001, 2) - p[1] * math.log(p[1] + 0.0001, 2)


def calcGain(nowD, a):
    tmpD = [[], []]
    for i in range(len(nowD)):
        if nowD[i][a] < ping[a]:
            tmpD[0].append(nowD[i])
        else:
            tmpD[1].append(nowD[i])
    return ent(nowD) - len(tmpD[0]) / len(nowD) * ent(tmpD[0]) - len(tmpD[1]) / len(nowD) * ent(tmpD[1])


# 建决策树
def build(nowId, nowD, nowA):
    flag = [0, 0];
    tmpD = [[], []]
    global ye, cnt, bestA
    for i in range(len(nowD)):
        flag[nowD[i][0]] = flag[nowD[i][0]] + 1
    if flag[0] == 0:
        ye[nowId] = 1
        return
    if flag[1] == 0:
        ye[nowId] = 0
        return
    if len(nowA) == 0 or allSame(nowD, nowA):
        ye[nowId] = 1 if flag[1] > flag[0] else 0
        return
    bestA[nowId] = nowA[0];
    bestGain = calcGain(nowD, nowA[0])
    for i in range(1, len(nowA)):
        nowGain = calcGain(nowD, nowA[i])
        if nowGain > bestGain:
            bestA[nowId] = nowA[i];
            bestGain = nowGain
    for i in range(len(nowD)):
        if nowD[i][bestA[nowId]] < ping[bestA[nowId]]:
            tmpD[0].append(nowD[i])
        else:
            tmpD[1].append(nowD[i])
    nowA.remove(bestA[nowId])
    for i in [0, 1]:
        if len(tmpD[i]) == 0:
            ye[nowId * 2 + i] = 1 if flag[1] > flag[0] else 0
        else:
            build(nowId * 2 + i, tmpD[i], nowA)

def ask(nowId,D):
    if ye[nowId]!=-1:
        return ye[nowId]
    if D[bestA[nowId]]<ping[bestA[nowId]]:
        return ask(nowId*2,D)
    else:
        return ask(nowId*2+1,D)

myTrain = pd.read_csv('train.csv')
myTest = pd.read_csv('test.csv')

D = [];
A = [1, 2, 3, 4, 5]
PassengerId=[]
Survived=[]
# 预处理
for i in range(10000):
    ye.append(-1)
for i in range(10000):
    bestA.append(-1)
# 读入
for i in range(myTrain.shape[0]):
    D.append(
        [myTrain.values[i][1], myTrain.values[i][2], 1 if (myTrain.values[i][4] == 'male') else 0, myTrain.values[i][6],
         myTrain.values[i][7], myTrain.values[i][9]])
# 计算各个属性平均值
for i in range(len(D[1])):
    sum = 0
    for j in range(len(D)):
        sum = sum + D[j][i]
    ping.append(sum / len(D))

build(1, D, A)
for i in range(len(myTest)):
    PassengerId.append(myTest.values[i][0])
    Survived.append(ask(1,[0,myTest.values[i][1], 1 if (myTest.values[i][3] == 'male') else 0, myTest.values[i][5],myTest.values[i][6], myTest.values[i][8]]))
myAns = pd.DataFrame({'PassengerId': PassengerId, 'Survived': Survived})
myAns.to_csv("myAns.csv", index = False, sep=',')

标签:泰坦尼克号,nowId,nowD,tmpD,nowA,len,flag,日志,决策树
From: https://www.cnblogs.com/wljss/p/17149223.html

相关文章

  • springboot集成flume实现多系统日志收集
    本次demo实现的功能:使用flume框架收集目标工程的日志信息,并发送到kafka,最终完成kafka的消费1、配置工程配置logback:<!--此处为flume日志采集的配置--><appende......
  • 日志
    目录日志级别日志级别配置日志级别日志级别配置......
  • GoAccess - 可视化 Web 日志分析工具
    Centos安装:yum-yinstallgoaccess使用goaccess命令生成HTML文件LANG="en_US.UTF-8"bash-c'goaccess/usr/local/nginx/logs/access.log-o/usr/local/nginx/......
  • nginx TCP代理增加日志配置
    在straem增加一下配置stream{log_formatTCP_proxy'$remote_addr-[$time_local]''$protocol$status$bytes_sent$bytes_received''......
  • 【C#进阶】.NET Core 中的筛选器 Filter【ActionFilterAttribute 操作筛选器,实现日志
     筛选器Filter介绍:【C#进阶】.NETCore中的筛选器Filter-C#初级程序员-博客园(cnblogs.com) ActionFilterAttribute操作筛选器,实现日志记录第一步创建.NE......
  • Docker-日志以及磁盘占满解决
    磁盘占满du-x-h--max-depth=1/var/lib/docker/containers/dockerps-astepbystep01.dockerinfoDockerRootDir:/var/lib/docker02.du-x-h--m......
  • python 日志解析【案例2】
     要做的事:  1:获取日志内标红的数据(ipython模式正则捕获如下图)         2:转换相关选项的md5和反编码值  3:根据dm值和上个小时的年月日(......
  • GTD践行日志
    GTD践行日志前言以前工作时总会出现一些状况,诸如接了太多任务,做了太多承诺,结果换来的是累且干不好事情,绩效“稳定”下滑。痛定思痛,这其中一定有一些关键的东西被我忽略了......
  • Python 解析log日志【案例1】
    sudoaptinstallpython3.8#安装python3python3.8-mpipinstallpython-dateutil#安装dateutil包[2021-09-0311:03:11]**************************E......
  • 【日志级别】springboot-logging 日志级别调整
    springboot日志,配置文件中,logging:level:org.springframework.web.servlet.DispatcherServlet:INFOcom.dy.springboot.server.mapper:INFOcom.carr......