机器学习实验1.1——糖尿病情预测

实验内容:糖尿病预测

 diabetes 是一个关于糖尿病的数据集, 该数据集包括442个病人的生理数据及一年以后的病情发展情况。
 
 该数据集共442条信息,特征值总共10项, 如下:

  age:年龄

  sex:性别

  bmi(body mass index):身体质量指数,是衡量是否肥胖和标准体重的重要指标,理想BMI(18.5~23.9) = 体重(单位Kg) ÷ 身高的平方 (单位m)

  bp(blood pressure):血压(平均血压)

  s1,s2,s3,s4,s4,s6:六种血清的化验数据,是血液中各种疾病级数指针的6的属性值。
  
    s1——tc,T细胞(一种白细胞)
  
    s2——ldl,低密度脂蛋白
  
    s3——hdl,高密度脂蛋白
  
    s4——tch,促甲状腺激素
  
    s5——ltg,拉莫三嗪
  
    s6——glu,血糖水平
  
【注意】:以上的数据是经过特殊处理, 10个数据中的每个都做了均值中心化处理,然后又用标准差乘以个体数量调整了数值范围。验证就会发现任何一列的所有数值平方和为1。

       这10个特征变量中的每一个都以平均值为中心,并按标准差乘以“n_samples”(即每列的平方和总计为1)进行缩放。

实验要求:

一、加载糖尿病数据集diabetes ,观察数据

1.载入糖尿病情数据库diabetes ,查看数据。

2.切分数据,组合成DateFrame数据,并输出数据集前几行,观察数据。

二、基于线性回归对数据集进行分析

3.查看数据集信息,从数据集中抽取训练集和测试集。

4.建立线性回归模型,训练数据,评估模型。

三、考察每个特征值与结果之间的关联性,观察得出最相关的特征

5.考察每个特征值与结果之间的关系,分别以散点图展示。

思考:根据散点图结果对比,哪个特征值与结果之间的相关性最高?

四、使用回归分析找出XX特征值与糖尿病的关联性,并预测出相关结果

6.把5中相关性最高的特征值提取,然后进行数据切分。

8.创建线性回归模型,进行线性回归模型训练。

9.对测试集进行预测,求出权重系数。

10.对预测结果进行评价,结果可视化。

一、加载糖尿病数据集diabetes,观察数据

import matplotlib.pyplot as plt  #导入matplotlib库
import numpy as np      #导入numpy库
import pandas as pd     #导入pandas库
from sklearn.datasets import load_diabetes  #从sklearn数据集库导入diabetes数据

#1.载入糖尿病情数据库diabetes,查看数据。
diabetes=load_diabetes()#从读取的糖尿病数据存储在diabetes变量中
print(diabetes.keys()) #打印diabetes包含元素
print(diabetes.feature_names)#打印diabetes变量名

#2.切分数据,组合成DateFrame数据,并输出数据集前几行,观察数据。
dia = pd.DataFrame(diabetes.data)    #将data转换为DataFrame格式以方便展示
print (dia[:5])   #输出数据集前5行
dia_target = pd.DataFrame(diabetes.target)    #将target转换为DataFrame格式以方便展示
print(dia_target.head())
dict_keys(['data', 'target', 'DESCR', 'feature_names', 'data_filename', 'target_filename'])
['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
          0         1         2         3         4         5         6  \
0  0.038076  0.050680  0.061696  0.021872 -0.044223 -0.034821 -0.043401   
1 -0.001882 -0.044642 -0.051474 -0.026328 -0.008449 -0.019163  0.074412   
2  0.085299  0.050680  0.044451 -0.005671 -0.045599 -0.034194 -0.032356   
3 -0.089063 -0.044642 -0.011595 -0.036656  0.012191  0.024991 -0.036038   
4  0.005383 -0.044642 -0.036385  0.021872  0.003935  0.015596  0.008142   

          7         8         9  
0 -0.002592  0.019908 -0.017646  
1 -0.039493 -0.068330 -0.092204  
2 -0.002592  0.002864 -0.025930  
3  0.034309  0.022692 -0.009362  
4 -0.002592 -0.031991 -0.046641  
       0
0  151.0
1   75.0
2  141.0
3  206.0
4  135.0

二、基于线性回归对数据集进行分析

#3.查看数据集信息,从数据集中抽取训练集和测试集。
from sklearn.model_selection import train_test_split  #导入数据划分包 
x_train,x_test,y_train,y_test=train_test_split(diabetes.data,diabetes.target,test_size=0.25)# 以25%的数据构建测试样本,剩余作为训练样本
print(x_train.shape,x_test.shape,y_train.shape,y_test.shape)#观察分割情况
#4.建立线性回归模型,训练数据,评估模型。
from sklearn.linear_model import LinearRegression  #使用LinearRegression库
lr=LinearRegression()   #设定回归算法
lr.fit(x_train,y_train) #使用训练数据进行参数求解
print ('求解截距项为:',lr.intercept_)  #打印截距的值
print ('求解系数为:',lr.coef_)         #打印权重向量的值
print('整体拟合得分为:',lr.score(x_test, y_test)) #基于Linear-Regression()的回归算法得分函数,来对预测集的拟合优度进行评价
(331, 10) (111, 10) (331,) (111,)
求解截距项为: 152.6040645241181
求解系数为: [    3.27315286  -270.45964646   520.45571644   363.69598103
 -1310.12699493   829.24757349   374.44915607   342.27738177
   905.20980612    84.32506192]
整体拟合得分为: 0.45533340531553074

三、考察每个特征值与结果之间的关联性,观察得出最相关的特征

#5.考察每个特征值与结果之间的关系,分别以散点图展示。
scores=np.zeros(10)
for n in range(10):#共10种不同特征
    x_single=dia.iloc[:,n].values.reshape(-1,1)#在最新版本的sklearn中,所有的数据都应该是二维矩阵,哪怕它只是单独一行或一列。
    lr.fit(x_single,dia_target)
    score=lr.score(x_single,dia_target)
    scores[n]=score
    #绘制散点图
    plt.figure()
    plt.scatter(x_single,dia_target)
    #绘制拟合直线
    b=lr.intercept_[0]#就算只有一个数据sklearn也默认输出为ndarry,此处转化为float方便后面计算    
    k=lr.coef_[0,0]

    x1=x_single.min()#两点确定一条直线
    y1=k*x1+b
    x2=x_single.max()
    y2=k*x2+b
    plt.plot([x1,x2],[y1,y2],color="red")
    plt.title(diabetes.feature_names[n]+'(score:'+str(score)+')')
    plt.show()
    
    #思考:根据散点图结果对比,哪个特征值与结果之间的相关性最高?
print(diabetes.feature_names[np.argmax(scores)],"相关性最高,其score为:"+str(scores.max()))
    
    
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
<Figure size 432x288 with 1 Axes>
bmi 相关性最高,其score为:0.3439237602253803

四、使用回归分析找出XX特征值与糖尿病的关联性,并预测出相关结果

#6.把5中相关性最高的特征值提取,
x_best=dia.iloc[:,np.argmax(scores)].values.reshape(-1,1)
#7.进行数据切分。
x_best_train,x_best_test,y_best_train,y_best_test=train_test_split(x_best,diabetes.target,test_size=0.25)# 以25%的数据构建测试样本,剩余作为训练样本
print(x_best_train.shape,x_best_test.shape,y_best_train.shape,y_best_test.shape)#观察分割情况
#8.创建线性回归模型,进行线性回归模型训练。
lr=LinearRegression()   #设定回归算法
lr.fit(x_best_train,y_best_train) #使用训练数据进行参数求解

#9.对测试集进行预测,求出权重系数。
b=lr.intercept_#就算只有一个数据sklearn也默认输出为ndarry,此处转化为float方便后面计算    
k=lr.coef_[0]
testLen=len(x_best_test)
y_best_hat=np.zeros(testLen)#准备好存放预测值的变量
for i in range(testLen):
    y_best_hat[i]=x_best_test[i]*k+b
#10.对预测结果进行评价,结果可视化。
print ("r2_score:",r2_score(y_best_test, y_best_hat)) #使用metrics的r2_score来对预测集的拟合优度进行评价
#绘制散点图
#y_test与y_hat的可视化
plt.figure()  #设置图片尺寸
t = np.arange(len(X_test))  #创建t变量
plt.plot(t, y_best_test, 'r', linewidth=2, label='y_test') #绘制y_test曲线
plt.plot(t, y_best_hat, 'g', linewidth=2, label='y_hat')   #绘制y_hat曲线
plt.legend() #设置图例
plt.show()
(331, 1) (111, 1) (331,) (111,)
r2_score: 0.41116746214974953
<Figure size 432x288 with 1 Axes>

仅供学习交流使用,如有错误欢迎在评论区指正

posted @ 2022-03-10 12:38  XDawned  阅读(1750)  评论(0)    收藏  举报