实验1 线性回归 实操项目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,观察数据

from sklearn import datasets  
import matplotlib.pyplot as plt  
import numpy as np  
  
#数据集  
diabetes = datasets.load_diabetes() #载入数据  
  
#获取一个特征  
diabetes_x_temp = diabetes.data[:, np.newaxis, 2]   
  
diabetes_x_train = diabetes_x_temp[:-20]   #训练样本  
diabetes_x_test = diabetes_x_temp[-20:]    #测试样本 后20行  
diabetes_y_train = diabetes.target[:-20]   #训练标记  
diabetes_y_test = diabetes.target[-20:]    #预测对比标记  
  

print (u'划分行数:', len(diabetes_x_temp), len(diabetes_x_train), len(diabetes_x_test)) 
print (diabetes_x_test)
划分行数: 442 422 20
[[ 0.07786339]
 [-0.03961813]
 [ 0.01103904]
 [-0.04069594]
 [-0.03422907]
 [ 0.00564998]
 [ 0.08864151]
 [-0.03315126]
 [-0.05686312]
 [-0.03099563]
 [ 0.05522933]
 [-0.06009656]
 [ 0.00133873]
 [-0.02345095]
 [-0.07410811]
 [ 0.01966154]
 [-0.01590626]
 [-0.01590626]
 [ 0.03906215]
 [-0.0730303 ]]

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

#回归训练及预测  
clf = linear_model.LinearRegression()  
clf.fit(diabetes_x_train, diabetes_y_train)  #注: 训练数据集  
  
#系数 残差平法和 方差得分  
print ('系数 :\n', clf.coef_)  
print ("残差平法和: %.2f" %np.mean((clf.predict(diabetes_x_test) - diabetes_y_test) ** 2))  
print ("方差: %.2f" % clf.score(diabetes_x_test, diabetes_y_test))  
  
#绘图  
plt.title(u'标题')   #标题  
plt.xlabel(u'x轴坐标')                 #x轴坐标  
plt.ylabel(u'y轴坐标')         #y轴坐标  
#点的准确位置  
plt.scatter(diabetes_x_test, diabetes_y_test, color = 'black')  
#预测结果 直线表示  
plt.plot(diabetes_x_test, clf.predict(diabetes_x_test), color='blue', linewidth = 3)  
plt.show()  

系数 :
[938.23786125]
残差平法和: 2548.07
方差: 0.47
在这里插入图片描述

<Figure size 432x288 with 1 Axes>

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

# 1、取出特征值
df.columns  #输出结果:Index(['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6'], dtype='object')

# 2、循环对每个特征值进行建模训练,作图


plt.figure(figsize=( 2*6, 5*5)) #图像宽和高
for i, col in enumerate(df.columns):  # enumerate 枚举
    train_X = df.loc[:, col].values.reshape(-1, 1)
    # 每一次循环,都取出datafram中的一列数据,是一维Series数据格式,但是线性回归模型要求传入的是一个二维数据,因此利用reshape修改其形状
    #print("train_X=",train_X)
    train_Y = target
    linearmodel = linear_model.LinearRegression()  # 构建模型
    reg = linearmodel.fit(train_X, train_Y)  # 训练模型
    score = reg.score(train_X, train_Y) # 评估模型,Return the coefficient of determination of the prediction.
    #  以训练数据为X轴,标记为Y 轴,画出散点图,直观地看每个特征和标记直接的关系
    # 建立画板,作图5行2列的图
    axes = plt.subplot(5, 2, i + 1)
    plt.scatter(train_X, train_Y)
    # 画出每一个特征训练模型得到的拟合直线 y= kx + b
    k = linearmodel.coef_  # 回归系数
    b = linearmodel.intercept_  # 截距
    x = np.linspace(train_X.min(), train_X.max(), 100)
    y = k * x + b
    # 作图
    plt.plot(x, y, c='red')
    axes.set_title(col + ' Coefficient of determination:' + str(score))
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<Figure size 864x1800 with 10 Axes>

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

from sklearn import datasets  
import numpy as np  
  
#获取数据 10*442  
d = datasets.load_diabetes()  
x = d.data  
print (u'获取x特征') 
print (len(x), x.shape) 
print (x[:9])  
  
#获取一个特征 第3列数据  
x_one = x[:,np.newaxis, 8]  
print (x_one[:7])  
  
#获取的正确结果  
y = d.target  
print (u'获取的结果')  
print (y[:7]) 
  
#x特征划分  
x_train = x_one[:-42]  
x_test = x_one[-42:]  
print (len(x_train), len(x_test))  
y_train = y[:-42]  
y_test = y[-42:]  
print (len(y_train), len(y_test))  
  
  
#第二步 线性回归实现  
from sklearn import linear_model  
clf = linear_model.LinearRegression()  
print (clf)  
clf.fit(x_train, y_train)  
pre = clf.predict(x_test)  
print (u'预测结果')  
print (pre)  
print (u'真实结果')  
print (y_test)    
     
     
#第三步 评价结果  
cost = np.mean(y_test-pre)**2  
print (u'次方', 2**5)  
print (u'平方和计算:', cost)  
print (u'系数', clf.coef_   )
print (u'截距', clf.intercept_)    
print (u'方差', clf.score(x_test, y_test)) 
  
  
#第四步 绘图  
import matplotlib.pyplot as plt  
plt.title("diabetes")  
plt.xlabel("x")  
plt.ylabel("y")  
plt.plot(x_test, y_test, 'k.')  
plt.plot(x_test, pre, 'g-')  
  
for idx, m in enumerate(x_test):  
    plt.plot([m, m],[y_test[idx],   
              pre[idx]], 'r-')  
  
plt.savefig('power.png', dpi=300)  
 
plt.show()  
获取x特征
442 (442, 10)
[[ 0.03807591  0.05068012  0.06169621  0.02187235 -0.0442235  -0.03482076
  -0.04340085 -0.00259226  0.01990842 -0.01764613]
 [-0.00188202 -0.04464164 -0.05147406 -0.02632783 -0.00844872 -0.01916334
   0.07441156 -0.03949338 -0.06832974 -0.09220405]
 [ 0.08529891  0.05068012  0.04445121 -0.00567061 -0.04559945 -0.03419447
  -0.03235593 -0.00259226  0.00286377 -0.02593034]
 [-0.08906294 -0.04464164 -0.01159501 -0.03665645  0.01219057  0.02499059
  -0.03603757  0.03430886  0.02269202 -0.00936191]
 [ 0.00538306 -0.04464164 -0.03638469  0.02187235  0.00393485  0.01559614
   0.00814208 -0.00259226 -0.03199144 -0.04664087]
 [-0.09269548 -0.04464164 -0.04069594 -0.01944209 -0.06899065 -0.07928784
   0.04127682 -0.0763945  -0.04118039 -0.09634616]
 [-0.04547248  0.05068012 -0.04716281 -0.01599922 -0.04009564 -0.02480001
   0.00077881 -0.03949338 -0.06291295 -0.03835666]
 [ 0.06350368  0.05068012 -0.00189471  0.06662967  0.09061988  0.10891438
   0.02286863  0.01770335 -0.03581673  0.00306441]
 [ 0.04170844  0.05068012  0.06169621 -0.04009932 -0.01395254  0.00620169
  -0.02867429 -0.00259226 -0.01495648  0.01134862]]
[[ 0.01990842]
 [-0.06832974]
 [ 0.00286377]
 [ 0.02269202]
 [-0.03199144]
 [-0.04118039]
 [-0.06291295]]
获取的结果
[151.  75. 141. 206. 135.  97. 138.]
400 42
400 42
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
预测结果
[121.0917672  113.84342264 166.20310697 207.73768109 127.75173479
 185.18672034 101.60840925 108.62931622 204.45345992 179.71171991
 211.66640109 105.89257678 157.77575723 119.92728554 201.46787342
 165.5329434  125.5912264  109.96421687 132.91661891  85.45956012
 122.23996187 197.00511274 188.81293799 166.20310697 173.84532622
 133.91171692 184.12054197 111.27775818 211.66640109 128.8110344
 143.25070492 138.71393849 202.33203488 105.89257678 111.27775818
 117.54756585  97.08829993 180.27594605 135.86644215 109.96421687
 192.28573411 148.38328742]
真实结果
[175.  93. 168. 275. 293. 281.  72. 140. 189. 181. 209. 136. 261. 113.
 131. 174. 257.  55.  84.  42. 146. 212. 233.  91. 111. 152. 120.  67.
 310.  94. 183.  66. 173.  72.  49.  64.  48. 178. 104. 132. 220.  57.]
次方 32
平方和计算: 0.27899026132100835
系数 [900.5956388]
截距 152.18367466529097
方差 0.3722441838388856

在这里插入图片描述

<Figure size 432x288 with 1 Axes>

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值