利用Logistic回归预测疝气病症的病马的死亡率

原创 2017年04月23日 10:39:17

数据来源

http://archive.ics.uci.edu/ml/machine-learning-databases/horse-colic

处理过程

由于该数据集存在30%的缺失,那么首先必须对数据集进行预处理,这里我把缺失值用每列的平均值来代替,同时把数据集没用的几列数据舍弃。之后利用sklearn库进行Logistic回归。


代码与数据已经打包上传,如果有需要请移步:
http://download.csdn.net/detail/qq_30091945/9822726


结果:
由于有30%的数据缺失,不可避免误差过大。


Python代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/4/23 0023 7:59
# @Author  : Aries
# @Site    : 
# @File    : 疝气症预测病马死亡率.py
# @Software: PyCharm Community Edition

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression

def GetData(path):
    """
    :param path: 数据集路径
    :return: 返回数据集
    """

    Data = []
    Label = []

    #没有用的属性的下标
    index = [2,24,25,26,27]

    with open(path) as f:
        for line in f.readlines():
            LineArr = line.strip().split(" ")
            m = np.shape(LineArr)[0]
            data = []
            for i in range(m):
                if i in index:
                    #没有用的属性直接跳过
                    continue
                elif i == 22:
                    #下标为22的属性是分类
                    #1代表活着,标记设为1
                    #2,3分别代表死亡,安乐死,标记设为0
                    if LineArr[i] == '?':
                        Label.append(0)
                    elif int(LineArr[i]) == 1:
                        Label.append(1)
                    else:
                        Label.append(0)
                else:
                    #剩下的是有用数据
                    if LineArr[i] == '?':
                        #缺失数据首先由0代替
                        data.append(0.0)
                    else:
                        data.append(float(LineArr[i]))
            Data.append(data)
        Data = np.array(Data)
        Label = np.array(Label)

    return Data,Label

def ZeroProcess(data):
    """
    :param data:需要进行0值处理的数据
    :return: 返回把0值已经处理好的数据
    """

    m,n = np.shape(data)
    for i in range(n):
        avg = np.average(data[:,i])
        if np.any(data[:,i]) == 0:
            for j in range(m):
                data[j][i] = avg
        else:
            continue

    return data

def autoNorm(Data):
    """
    :param Data: 需要进行归一化的数据
    :return: 进行Max-Min标准化的数据
    """

    #求出数据中每列的最大值,最小值,以及相应的范围
    data_min = Data.min(0)
    data_max = Data.max(0)
    data_range = data_max-data_min

    #进行归一化
    m = np.shape(Data)[0]
    Norm_Data = Data - np.tile(data_min,(m,1))
    Norm_Data = Norm_Data / data_range

    return Norm_Data

def PreProcess(data):
    """
    数据预处理,包括0值处理和归一化
    :param data:需要处理的数据
    :return: 已经处理好的数据
    """

    #对数据进行0值处理
    Non_Zero_Data = ZeroProcess(data)

    #对数据进行归一化
    Norm_Data = autoNorm(Non_Zero_Data)

    return  Norm_Data

def run_main():
    """
        这是主函数
    """

    #导入训练与测试数据集
    path1 = "./horse_colic_train.txt"
    path2 = "./horse_colic_test.txt"
    Train_Data,Train_Label = GetData(path1)
    Test_Data,Test_Label = GetData(path2)

    #数据预处理,包括0值处理和归一化
    Train_Data_Precess = PreProcess(Train_Data)
    Test_Data_Process = PreProcess(Test_Data)

    #设置matplotlib,能让它显示中文
    mpl.rcParams['font.sans-serif'] = [u'simHei']
    mpl.rcParams['axes.unicode_minus'] = False

    #训练Logistic回归算法
    logistiic_regression = LogisticRegression()
    model = logistiic_regression.fit(Train_Data_Precess,Train_Label)
    print("Logistic回归的系数为:", logistiic_regression.coef_, "常数项为:", logistiic_regression.intercept_)

    #对Logistic回归算法进行测试
    Train_Label_Predict = logistiic_regression.predict(Train_Data_Precess)
    error = 0.0
    for i in range(len(Train_Label)):
        if Train_Label[i] != Train_Label_Predict[i]:
            error = error + 1.0
    error = error / len(Train_Label)
    avg = np.average(Train_Label)
    TSS = np.sum((Train_Label-avg)**2)
    RSS = np.sum((Train_Label_Predict-Train_Label)**2)
    R2 = 1 - RSS/TSS
    print("训练样本的误差为:",error)
    print("R2为:",R2)

    #测试新数据
    Test_Label_Predict = logistiic_regression.predict(Test_Data_Process)
    err = 0.0
    for i in range(len(Test_Label_Predict)):
        print(Test_Label[i],Test_Label_Predict[i])
        if Test_Label_Predict[i] != Test_Label[i]:
            err = err + 1.0
    err = err / len(Test_Label)
    print("误差为:",err)

if __name__ == "__main__":
    run_main()
版权声明:本文为博主原创文章,未经博主允许不得转载。若需转载,请注明http://blog.csdn.net/qq_30091945 举报

相关文章推荐

利用Logistic回归预测疝气病症的病马的死亡率

数据来源http://archive.ics.uci.edu/ml/machine-learning-databases/horse-colic处理过程由于该数据集存在30%的缺失,那么首先必须对数据...

logistic回归算法学习笔记-从疝气症预测病马死亡率

#coding=utf-8 from numpy import * #数据集的获取 def loadDataSet(): dataMat=[];labelMat=[] fr = ope...
  • lxslx
  • lxslx
  • 2017-06-25 11:19
  • 59

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

《机器学习实战》Logisic回归算法(2)之从疝气病症预测病马的死亡率

============================================================================================ 《机器学习实战...

python实现logistics回归,以及从 疝 气 病 症 预 测 病 马 的 死 亡 率

logistics回 归 的 目 的 是 寻 找 一 个 非 线 性 函 数sigmod的 最 佳 拟 合 参 数。通过迭代来更改参数。选取出最佳拟 合的参数。可以通过梯度上升算法,随机梯度上升算法,...

《机器学习实战》学习笔记:Logistic回归&预测疝气病证的死亡率

生活中,人们经常会遇到各种最优化问题,比如如何在最短时间从一个地点到另外一个地点?如何在投入最少的资金而却能得到最高的受益?如何设计一款芯片使其功耗最低而性能最好?这一节就要学习一种最优化算法——Lo...

【机器学习实战三:Logistic回归之点的二分类和预测病马的死亡率】

一、部分说明 ---------------------------------------------------------------- 1、本文代码是《机器学习实战》这本书的例程。点击下载...

机器学习-Logistic回归之使用随机梯度上升算法预测病马死亡率

运行环境:ubuntu16.10+MATLAB2016a数据集:该数据集来自2010年1月11日的UCI机器学习数据库,该数据最早由加拿大安大略省圭尔夫大学计算机系Mary McLeish和Matt ...

机器学习实战--chapter 5 Logistic Regression(二)疝气预测马死亡

1 LR模型与算法LR模型与算法原理参见上一篇博客。2 模型场景注:疝气:描述马胃肠病的术语。得到一批数据集,包含了368个样本,大部分有tag,每个样本的特征28个,通过这些训练出一个模型。下次我们...

我国人群疾病死亡谱变化:慢性肾病死亡率增加

http://club.jd.com/CommunityGroupDetail/18011507_1.html http://club.jd.com/CommunityGrou叶刀》杂志近日刊发最新...

AI可预测心脏病人何时死亡:准确率达80%

导读 据英国广播公司1月17日报道,英国科学家在《影像诊断学》杂志上发表文章说,人工智能(AI)可以预测心脏病人何时死亡。 英国医学研究委员会伦敦医学研究所的这个研究小组说...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)