文章目录

  • 机器学习实验之糖尿病预测
  • **实验内容:**
  • **实验要求:**
  • 加载糖尿病数据集diabetes,观察数据
  • 载入糖尿病情数据库diabetes,查看数据
  • 切分数据,组合成DateFrame数据,并输出数据集前几行,观察数据
  • 基于线性回归对数据集进行分析
  • 查看数据集信息,从数据集中抽取训练集和测试集
  • 建立线性回归模型,训练数据,评估模型
  • 考察每个特征值与结果之间的关联性,观察得出最相关的特征
  • 考察每个特征值与结果之间的关系,分别以散点图展示。
  • 使用回归分析找出bmi特征值与糖尿病的关联性,并预测出相关结果
  • 把相关性最高的特征值提取,然后进行数据切分
  • 创建线性回归模型,进行线性回归模型训练
  • 对测试集进行预测,求出权重系数
  • 对预测结果进行评价,结果可视化


机器学习实验之糖尿病预测

实验内容:

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.对预测结果进行评价,结果可视化。
from jupyterthemes import jtplot
jtplot.style(theme='monokai') #选择一个绘图主题
from sklearn.datasets import load_diabetes
import matplotlib.pyplot as plt  #导入matplotlib库
import numpy as np      #导入numpy库
import pandas as pd     #导入pandas库

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

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

diabetes = load_diabetes()
keys = diabetes.keys()
print(keys)
data = diabetes.data
print(data)
target = diabetes.target
print(target)
feature_names = diabetes.feature_names
print(feature_names)
dict_keys(['data', 'target', 'frame', 'DESCR', 'feature_names', 'data_filename', 'target_filename', 'data_module'])
[[ 0.03807591  0.05068012  0.06169621 ... -0.00259226  0.01990842
  -0.01764613]
 [-0.00188202 -0.04464164 -0.05147406 ... -0.03949338 -0.06832974
  -0.09220405]
 [ 0.08529891  0.05068012  0.04445121 ... -0.00259226  0.00286377
  -0.02593034]
 ...
 [ 0.04170844  0.05068012 -0.01590626 ... -0.01107952 -0.04687948
   0.01549073]
 [-0.04547248 -0.04464164  0.03906215 ...  0.02655962  0.04452837
  -0.02593034]
 [-0.04547248 -0.04464164 -0.0730303  ... -0.03949338 -0.00421986
   0.00306441]]
[151.  75. 141. 206. 135.  97. 138.  63. 110. 310. 101.  69. 179. 185.
 118. 171. 166. 144.  97. 168.  68.  49.  68. 245. 184. 202. 137.  85.
 131. 283. 129.  59. 341.  87.  65. 102. 265. 276. 252.  90. 100.  55.
  61.  92. 259.  53. 190. 142.  75. 142. 155. 225.  59. 104. 182. 128.
  52.  37. 170. 170.  61. 144.  52. 128.  71. 163. 150.  97. 160. 178.
  48. 270. 202. 111.  85.  42. 170. 200. 252. 113. 143.  51.  52. 210.
  65. 141.  55. 134.  42. 111.  98. 164.  48.  96.  90. 162. 150. 279.
  92.  83. 128. 102. 302. 198.  95.  53. 134. 144. 232.  81. 104.  59.
 246. 297. 258. 229. 275. 281. 179. 200. 200. 173. 180.  84. 121. 161.
  99. 109. 115. 268. 274. 158. 107.  83. 103. 272.  85. 280. 336. 281.
 118. 317. 235.  60. 174. 259. 178. 128.  96. 126. 288.  88. 292.  71.
 197. 186.  25.  84.  96. 195.  53. 217. 172. 131. 214.  59.  70. 220.
 268. 152.  47.  74. 295. 101. 151. 127. 237. 225.  81. 151. 107.  64.
 138. 185. 265. 101. 137. 143. 141.  79. 292. 178.  91. 116.  86. 122.
  72. 129. 142.  90. 158.  39. 196. 222. 277.  99. 196. 202. 155.  77.
 191.  70.  73.  49.  65. 263. 248. 296. 214. 185.  78.  93. 252. 150.
  77. 208.  77. 108. 160.  53. 220. 154. 259.  90. 246. 124.  67.  72.
 257. 262. 275. 177.  71.  47. 187. 125.  78.  51. 258. 215. 303. 243.
  91. 150. 310. 153. 346.  63.  89.  50.  39. 103. 308. 116. 145.  74.
  45. 115. 264.  87. 202. 127. 182. 241.  66.  94. 283.  64. 102. 200.
 265.  94. 230. 181. 156. 233.  60. 219.  80.  68. 332. 248.  84. 200.
  55.  85.  89.  31. 129.  83. 275.  65. 198. 236. 253. 124.  44. 172.
 114. 142. 109. 180. 144. 163. 147.  97. 220. 190. 109. 191. 122. 230.
 242. 248. 249. 192. 131. 237.  78. 135. 244. 199. 270. 164.  72.  96.
 306.  91. 214.  95. 216. 263. 178. 113. 200. 139. 139.  88. 148.  88.
 243.  71.  77. 109. 272.  60.  54. 221.  90. 311. 281. 182. 321.  58.
 262. 206. 233. 242. 123. 167.  63. 197.  71. 168. 140. 217. 121. 235.
 245.  40.  52. 104. 132.  88.  69. 219.  72. 201. 110.  51. 277.  63.
 118.  69. 273. 258.  43. 198. 242. 232. 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.]
['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']

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

df = pd.DataFrame(data,columns = feature_names)
df.head()

age

sex

bmi

bp

s1

s2

s3

s4

s5

s6

0

0.038076

0.050680

0.061696

0.021872

-0.044223

-0.034821

-0.043401

-0.002592

0.019908

-0.017646

1

-0.001882

-0.044642

-0.051474

-0.026328

-0.008449

-0.019163

0.074412

-0.039493

-0.068330

-0.092204

2

0.085299

0.050680

0.044451

-0.005671

-0.045599

-0.034194

-0.032356

-0.002592

0.002864

-0.025930

3

-0.089063

-0.044642

-0.011595

-0.036656

0.012191

0.024991

-0.036038

0.034309

0.022692

-0.009362

4

0.005383

-0.044642

-0.036385

0.021872

0.003935

0.015596

0.008142

-0.002592

-0.031991

-0.046641

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

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

from sklearn.model_selection import train_test_split  #导入数据划分包 
x_train,x_test,y_train,y_test=train_test_split(data,target,train_size=0.25)
x_train.shape,x_test.shape,y_train.shape,y_test.shape
((110, 10), (332, 10), (110,), (332,))

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

from sklearn.linear_model import LinearRegression
model = LinearRegression() # 建立模型
model.fit(x_train,y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
model.score(x_train,y_train) # 评估模型
0.42370530869688006

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

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

# 作图5行2列的图
plt.figure(figsize=(2*10,5*8))
# enumerate 枚举 相当于 
# for j in df.columns:
#     i+=1
result = {}
for i,j in enumerate(df.columns):  
#     print(i , j) 
    train_y = target
    train_x = df.loc[:,j].values.reshape(-1, 1)
    linear_model = LinearRegression()    # 构建模型
    linear_model.fit(train_x,train_y)    #训练模型
    score = linear_model.score(train_x,train_y)   # 评估模型
    axes = plt.subplot(5,2,i+1)
    plt.scatter(train_x,train_y,color="blue")
    axes.set_title("the result of " + j + " is " + str(score))
    result[j] = score
    plt.scatter(train_x,train_y)
#     # 画拟合直线
#     k =  linear_model.coef_     # 回归系数
#     b =  linear_model.intercept_   # 截距
#     x = np.linspace(train_x.min(),train_x.max(),100)
#     y = x * k + b
#     plt.plot(x,y,c='red')
print(result)
{'age': 0.03530218264671636, 'sex': 0.0018543357106460823, 'bmi': 0.3439237602253803, 'bp': 0.19490798886682947, 's1': 0.04495353245556555, 's2': 0.030294651136685613, 's3': 0.1558585524453051, 's4': 0.18528968598509687, 's5': 0.32022405096453443, 's6': 0.14629361572293453}

knn 糖尿病预测机器学习实验 糖尿病预测筛查_knn 糖尿病预测机器学习实验

import operator
result = sorted(result.items(),key=operator.itemgetter(1),reverse=True)
resMax = result[0]
print("The greatest impact on diabetes is",resMax[0])
print("corresponding coefficient of determination is",resMax[1])
The greatest impact on diabetes is bmi
corresponding coefficient of determination is 0.3439237602253803

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

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

diabetes = load_diabetes()
df = pd.DataFrame(diabetes.data,columns = diabetes.feature_names)
y = target
x = df.loc[:,'bmi'].values.reshape(-1, 1)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)

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

linear_model = LinearRegression()    # 构建模型
linear_model.fit(train_x,train_y)    # 训练模型
LinearRegression()

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

y_hat = linear_model.predict(x_test) # 对测试集的预测
print("the Weight factor is", linear_model.coef_[0])
the Weight factor is 619.2228206843333

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

#y_test与y_hat的可视化
plt.figure(figsize=(10,6))  #设置图片尺寸
t = np.arange(len(x_test))  #创建t变量

plt.plot(t, y_test, 'r', linewidth=2, label='y_test') #绘制y_test曲线
plt.plot(t, y_hat, 'g', linewidth=2, label='y_hat')   #绘制y_hat曲线
plt.show()

knn 糖尿病预测机器学习实验 糖尿病预测筛查_python_02

plt.figure(figsize=(10,6))   #绘制图片尺寸
plt.plot(y_test,y_hat,'o',color='blue')   #绘制散点
plt.plot([30,320],[30,320], color="red", linestyle="--", linewidth=1.5) 
plt.axis([30,320,30,320])
plt.xlabel('ground truth')   #设置X轴坐标轴标签
plt.ylabel('predicted')      #设置y轴坐标轴标签
plt.grid()  #绘制网格线

knn 糖尿病预测机器学习实验 糖尿病预测筛查_数据集_03

from sklearn import metrics
from sklearn.metrics import r2_score
# 拟合优度R2的输出方法一
print ("r2:",linear_model.score(x_test, y_test))  #基于Linear-Regression()的回归算法得分函数,来对预测集的拟合优度进行评价
# 拟合优度R2的输出方法二
print ("r2_score:",r2_score(y_test, y_hat)) #使用metrics的r2_score来对预测集的拟合优度进行评价
# 用scikit-learn计算MAE
print ("MAE:", metrics.mean_absolute_error(y_test, y_hat)) #计算平均绝对误差
# 用scikit-learn计算MSE
print ("MSE:", metrics.mean_squared_error(y_test, y_hat))  #计算均方误差
# # 用scikit-learn计算RMSE
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat))) #计算均方根误差
r2: 0.27725246428335715
r2_score: 0.27725246428335715
MAE: 55.71388594300793
MSE: 4181.8215824825365
RMSE: 64.66700536195052