机器学习实验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>
仅供学习交流使用,如有错误欢迎在评论区指正

浙公网安备 33010602011771号