根据美国疾病控制预防中心的数据,现在美国1/7的成年人患有糖尿病。但是到2050年,这个比例将会快速增长至高达1/3。在UCL机器学习数据库里一个糖尿病数据集,通过这一数据集,学习如何利用线性回归分析来预测糖尿病:
数据地址:
https://github.com/susanli2016/Machine-Learning-with-Python/blob/master/diabetes.csv
数据特征属性:
index([‘Pregnancies’, ‘Glucose’, ‘BloodPressure’, ‘SkinThickness’, ‘Insulin’,‘BMI’, ‘DiabetesPedigreeFunction’, ‘Age’, ‘Outcome’], dtype=‘object’)
特征(怀孕次数,血糖,血压,皮脂厚度,胰岛素,BMI身体质量指数,糖尿病遗传函数,年龄,结果)
“结果”是要预测的特征,0意味着未患糖尿病,1意味着患有糖尿病。在768个数据点中,500个被标记为0,268个标记为1。
实验模型为线性回归模型,使用最小二乘法来计算回归系数,构建出相应的多元线性回归模型,并利用线性回归模型来进行糖尿病相关性预测,最后使用MSE,r^2 和校正r^2来评价模型的好坏。
import pandas as pd
import numpy as np
from numpy.linalg import inv#矩阵求逆
from numpy import dot #矩阵点乘
#矩阵转置.T
data=pd.read_csv("线性回归分析数据.csv")
x_train=np.array(data.iloc[0:616,0:8])
y_train=np.array(data.ix[0:615,['Outcome']])
x_test=np.array(data.iloc[616:768,0:8])
y_test=np.array(data.ix[616:768,['Outcome']])
#第一步,读入数据并划分测试集,训练集,(按照2/8原则划分)
b=dot(dot(inv(dot(x_train.T,x_train)),x_train.T),y_train)
#第二步,根据数学推导公式计算
print(b)
y_predict=dot(x_test,b)
#print(y_predict[10][0])
i=0
for i in range(0,152):
if y_predict[i][0]>0.5:
y_predict[i][0]=1
else:
y_predict[i][0]=0
#第三步,根据回归系数矩阵和测试集得出预测矩阵
e=(y_test-y_predict)*(y_test-y_predict)
#print(e)
sse=0
for i in range(0,152):
sse=sse+e[i][0]
mse=sse/152
#print(mse)
#第四步,计算mse 0.26973684210526316
m=0
sum=0
for i in range(0,152):
sum=sum+y_test[i][0]
m=sum/152
#mean=np.full((152,1),fill_value=m)
#print(mean)
if m>0.5:
mean=np.ones((152,1))
else:
mean=np.zeros((152,1))
d=(y_test-mean)*(y_test-mean)
bd=0
for i in range(0,152):
bd=bd+d[i][0]
r=1-(sse/bd)
#第五步,计算决定系数r方 0.2407407407407407
n=152
p=8
r_adj=1-(((1-r)*(n-1))/(n-p-1))
#print(r_adj)
#第六步,计算校正决定系数 0.19826469826469828
from warnings import simplefilter
simplefilter(action='ignore',category=FutureWarning)
import pandas as pd
import numpy as np
data=pd.read_csv("线性回归分析数据.csv")
#print(data.columns)
#print(data.groupby('Outcome').size())
#print(data.info())
#第一步,读入数据集,并查看数据集基本信息
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
x_train,x_test,y_train,y_test=train_test_split(data.loc[:,data.columns!='Outcome'],data['Outcome'],stratify=data['Outcome'],random_state=66)
#第二步,划分训练集和测试集
model=LinearRegression()
model.fit(x_train,y_train)
a=model.intercept_
b=[]
b=model.coef_
#print(a)
#print(b)
#第三步,调用线性回归模型
score=model.score(x_test,y_test)
#print(score)
#第四步,调用评价函数进行评价 0.29204611312836626