码农小屋 码农小屋
  • 首页
  • 文章
    • Python
    • 计算机基础
    • C语言
    • Java
    • 数据库
    • Linux
  • 资源
  • 随笔
  • 优秀软件
  • 24h新鲜事
  • 专题
  • 留言板
  • 注册
    登录
立即登录
  • 首页
  • 博客中心
    • 文章
    • 资源
  • 随笔
  • 优秀软件
  • 24h新鲜事
  • 专题
  • 留言板

Logistic回归实战——病症状预测

Mr Gu5月前

实战背景

使用Logistic回归来预测患疝气病的马的存活问题。
数据包含了368个样本和28个特征。这种病不一定源自马的肠胃问题,其他问题也可能引发马疝病。该数据集中包含了医院检测马疝病的一些指标,有的指标比较主观,有的指标难以测量,例如马的疼痛级别。
另外需要说明的是,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有30%的值是缺失的。

准备数据

如何处理数据中的缺失值?

  • 使用可用特征的均值来填补缺失值;
  • 使用特殊值来填补缺失值,如-1;
  • 忽略有缺失值的样本;
  • 使用相似样本的均值添补缺失值;
  • 使用另外的机器学习算法预测缺失值。

案例中预处理数据:

  1. 如果一 条数据的特征值已经缺失——选择实数0来替换所有缺失。(sigmoid(0)=0.5,即它对结果的预测不具有任何倾向性,因此这样做不会影响回归系数的值)
  2. 如果一 条数据的类别标签已经缺失——将该类别数据丢弃。

原始的数据集经过处理,保存为两个文件: horseColicTest.txt和horseColicTraining.txt

加载数据

import numpy as np
import pandas as pd


# 加载数据
def loadDataSet(filename):
    data = pd.read_csv(filename)
    xArr = data.iloc[:, :-1].values
    labelMat = data. iloc[:, -1].values
    data_num, features_num = np.shape(xArr)
    dataMat = np.ones((data_num, features_num + 1))
    dataMat[:, 1:] = np.mat(xArr)
    return dataMat, labelMat

Parameters:
filename - 文件名
Returns:
dataMat - 数据列表
labelMat - 标签列表

sigmoid函数

# sigmoid函数
def sigmoid(inX):
    if inX >= 0:
        return 1.0 / (1 + np.exp(-inX))
    else:
        return np.exp(inX) / (1 + np.exp(inX))

Parameters:
inX - 数据
Returns:
sigmoid函数

改进的随机梯度上升算法

# 改进的随机梯度上升算法
def stocGradAscent(dataMatrix, classLabels, numlter=150):
    m, n = np.shape(dataMatrix)
    weights = np.ones(n)
    for j in range(numlter):
        randnums = np.random.permutation(m)
        i = 0
        for index in randnums:
            alpha = 4/(1.0+j+i)+0.01
            h = sigmoid(sum(dataMatrix[index]*weights))
            error = classLabels[index] - h
            weights = weights + alpha * error * dataMatrix[index]
            i += 1
    return weights

Parameters:
dataMatrix - 数据数组
classlabels - 数据标签
numlter - 迭代次数
Returns:
weights - 求得的回归系数数组(最优参数)

分类函数

# 分类函数
def classifyVector(inX, weights, p=0.5):
    prob = sigmoid(sum(inX*weights))
    if prob > p:
        return 1.0
    else:
        return 0.0

Parameters:
inX - 特征向量
weights - 回归系数
Returns:
分类结果

循环预测,得出最优回归系数和最小错误率

# 对测试数据进行预测,计算出错误率
def colicTest():
    dataMat1, labelMat1 = loadDataSet("horseColicTraining.csv")
    dataMat2, labelMat2 = loadDataSet("horseColicTest.csv")
    re0 = []
    re1 = []
    for j in range(50):
        weights = stocGradAscent(dataMat1, labelMat1)
        total = len(dataMat2)
        err = 0.0
        for i in range(total):
            res = classifyVector(dataMat2[i], weights)
            if res - labelMat2[i] != 0:
                err += 1
        re0.append(err/total)
        re1.append(weights)
    print("循环执行50次后,")
    print("最小的错误率为:", end=" ")
    print(min(re0))
    print("对应的回归系数为:",)
    print(re1[re0.index(min(re0))])

做出以上处理后,大致的结果如下:

Logistic回归实战——病症状预测-码农小屋
2
分享
Mr Gu 管理员
文章 43评论 1
赞赏
Mr Gu
相关文章
  • 机器学习——K-均值聚类算法
  • 机器学习——Logistic回归
  • 线性回归实战——使用岭回归预测二手乐高的价格
  • 机器学习——线性回归算法
  • 使用Python绘制决策树
评论 (0)
再想想
    沙发抢一发
Mr Gu
管理员
Better late than never.
43文章
1评论
51获赞
文章推荐
ZIP Pro 3 – 文件压缩分享加密管理套件
5月前
Uninstall Tool-专业的软件卸载工具
6月前
Speccy:优秀的硬件检测工具
6月前
CleanMyPC-专为 Windows打造的清理工具
6月前
Internet Downloader Manager-一款专业的Win下载工具
7月前
Wise Care 365-Windows 系统清理和加速工具
7月前
新鲜事
新Mac太牛:在电脑上运行iPhone、iPad的软件、游戏
5月前
苹果发布会总结:一个芯片,三款产品!苹果这把棋下得可真深
5月前
荣耀命运落定:救了自己,也救华为
5月前
发布会停不下来,苹果下月发布新Mac
6月前
iPhone 12 开启 5G 续航锐减,苹果回应
6月前
华为Mate40正式发布
6月前
更多
  • 专题
  • 文章
  • 友情链接
  • 留言板
Copyright © 2020-2021 码农小屋. 苏ICP备20033168号