利用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回归&预测疝气病证的死亡率

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

Logistic回归实战篇之预测病马死亡率(二)

作 者:崔家华 编 辑:李文臣 三、从疝气病症状预测病马的死亡率 1、实战背景 本次实战内容,将使用Logistic回归来预测患疝气病的马的存活问题。原始数据集下载地址:h...

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

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C++实现优先队列——最小堆,d路堆及配对堆

C++实现三种优先队列

题目1028:继续畅通工程

题目1028:继续畅通工程 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4932 解决:2060 题目描述:     省政府“畅通工...

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

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

Logistic回归实战篇之预测病马死亡率(三)

作 者:崔家华 编 辑:李文臣 四、使用Sklearn构建Logistic回归分类器 开始新一轮的征程,让我们看下Sklearn的Logistic回归分类器! 官方英文文档地址...

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

一、部分说明 ---------------------------------------------------------------- 1、本文代码是《机器学习实战》这本书的例程。点击下载...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Logistic回归预测疝气病症的病马的死亡率
举报原因:
原因补充:

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