文章目录
- 使用Logistic回归预测糖尿病得病
- 前言
一、逻辑回归原理
二、数据集分析
三、主要代码和结果图
- 总结
前言
人工智能的老师布置了一个逻辑回归的作业,想偷懒结果没找到用逻辑回归预测糖尿病的,csdn上都是用KNN,那以后的学弟学妹们要是也有这个作业的就可以看我的啦
一、逻辑回归原理
Logistic Regression和Linear Regression的原理是相似的,按照我自己的理解,可以简单的描述为这样的过程:
(1)找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。
这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。
(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。
综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。
(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。
找函数的最小值有不同的方法,Logistic Regression实现时有的是梯度下降法(Gradient Descent)。
在逻辑回归中我们通常是使用sigmoid函数来对实数进行一个映射:
为了实现Logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和带入Sigmoid函数中,进而得到一个范围在0-1之间的数值,任何大于0.5的数据被分入1类,小于0.5即被归入0类。
Sigmoid函数的输入记为Z,由下面公式得出:
Z=W0X0+W1X1+W2*X2+…+WnXn
如果采用向量的写法,可以写为Z=W(T)X,它表示将这两个数值向量对应元素相乘然后全部加起来即得到Z值,其中向量X是分类器的输入数据,向量W也就是我们要找的最佳参数,从而使分类器尽可能的准确。
寻找最佳参数的方法,我采用的是梯度下降的方法。
首先给出数学公式:
此公式的意义是:J是关于Θ的一个函数,我们当前所处的位置为Θ0点,要从这个点走到J的最小值点,也就是山底。
首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了Θ1这个点!
二、数据集分析
使用Logistic回归预测糖尿病得病率:
1.准备数据:用Python解析csv文件并填充缺失值
2.分析数据:可视化并观察数据
3.训练算法:使用优化算法,找到最佳的系数
4.测试算法:为了量化回归的效果需要观察错误率,根据错误率决定是否退到训练阶段,通过改变迭代次数和步长等参数来得到更好的回归系数。
由图二得:从最小值可以判断出肯定存在无意义的零值作为缺失值处理
由图3可得SkinThickness和SkinThickness的无意义缺失值较多,我们将无意义缺失值大于百分之二十的列删除,得到图4
此时留下的列都是无意义缺失值较少的列,但根据图4、图5我们发现还有部分列有null值看,于是我们使用该列的平均值去替换null值,得到图6,图7.
对比处理数据前(图8)后(图9)的热力图,发现数据处理后的热力图相关性更好
三、主要代码和结果图
import numpy as np
# import math
from numpy.ma import exp
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno #插补库
import copy
# ----------------------------------数据处理-----------------------------------------
# 读取数据
import statsmodels.formula.api
from numpy import shape, ones, mat
diabetes_data = pd.read_csv('diabetes.csv')
diabetes_data_copy=diabetes_data.copy()
diabetes_data.head()
#
# 数据信息
diabetes_data.info(verbose=True)
# 数据描述
print(diabetes_data.describe())
# 数据形状
# diabetes_data.shape
# # 查看标签分布
# print(diabetes_data.Outcome.value_counts())
# # 使用柱状图的方式画出标签个数统计
# p=diabetes_data.Outcome.value_counts().plot(kind="bar")
# plt.show()
# # 可视化数据分布
# p=sns.pairplot(diabetes_data, hue = 'Outcome')
# plt.show()
# 把葡萄糖,血压,皮肤厚度,胰岛素,身体质量指数中的0替换为nan
colume = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']
diabetes_data[colume] = diabetes_data[colume].replace(0,np.nan)
p=msno.bar(diabetes_data)
plt.show()
#
# 设定阀值
thresh_count = diabetes_data.shape[0]*0.8
# 若某一列数据缺失的数量超过20%就会被删除
diabetes_data = diabetes_data.dropna(thresh=thresh_count, axis=1)
p = msno.bar(diabetes_data)
plt.show()
# null的数量
print(diabetes_data.isnull().sum())
# 把null替换成平均值
diabetes_data['Glucose'].fillna(diabetes_data['Glucose'].mean(), inplace=True)
diabetes_data['BloodPressure'].fillna(diabetes_data['BloodPressure'].mean(), inplace=True)
diabetes_data['BMI'].fillna(diabetes_data['BMI'].mean(), inplace=True)
print(diabetes_data.isnull().sum())
p = msno.bar(diabetes_data)
plt.show()
#
plt.figure(figsize=(12,10))
# 画热力图,数值为两个变量之间的相关系数
p=sns.heatmap(diabetes_data_copy.corr(), annot=True)
plt.show()
p=sns.heatmap(diabetes_data.corr(), annot=True)
plt.show()
#
# 把数据切分为特征x和标签y
x = diabetes_data.drop("Outcome",axis = 1)
y = diabetes_data.Outcome
dataMatIn = np.array(x)
labelMaT = np.array(y)
# print(dataMatIn)
# print(labelMaT)
#
# ----------------------------------逻辑回归-----------------------------------------
logmodel=LogisticRegression(tol=1e-10,solver="lbfgs",max_iter=10000)
logmodel.fit(dataMatIn,labelMaT)
# ----------------------------------测试模型-----------------------------------------
predictions = logmodel.predict(dataMatIn)
print(classification_report(labelMaT, predictions))
classfication_report()函数得到模型的指标,并进行打印,结果如图10
根据预测的模型指标可以看出预测的正确率达到了0.77,还是较为准确的。
本文简单介绍了怎么调用别人写好的库去完成逻辑回归,博主是个菜鸡,大佬轻喷,发出来分享给大家看看。
糖尿病的数据集是我们老师发的但是网上应该有很多,留言我邮箱发给你也是ok的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)