线性回归做糖尿病分析(diabetes数据集),并分析单个特征值与病情的关系

1.diabetes数据集

线性回归做糖尿病分析(diabetes数据集),并分析单个特征值与病情的关系_第1张图片
共442个样本,每个样本有十个特征,分别是 [‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’],对应年龄、性别、体质指数、平均血压、S1~S6一年后疾病级数指标。
Targets为一年后患疾病的定量指标,值在25到346之间。

2.线性回归做糖尿病分析

# 导数据分析常用包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 导包获取糖尿病数据集
from sklearn.datasets import load_diabetes

data_diabetes = load_diabetes()
print(data_diabetes)

# 我们先看一下数据是什么样:
# diabetes 是一个关于糖尿病的数据集, 该数据集包括442个病人的生理数据及一年以后的病情发展情况。


data = data_diabetes['data']
target = data_diabetes['target']
feature_names = data_diabetes['feature_names']

# 现在三个数据都是numpy的一维数据形式,将她们组合成dataframe,可以更直观地观察数据
df = pd.DataFrame(data, columns=feature_names)
df.head()  # 查看前几行数据
# 查看数据集的基本信息
df.info()

# 1、抽取训练集合测试集
from sklearn.model_selection import train_test_split

train_X, test_X, train_Y, test_Y = train_test_split(data, target, train_size=0.8)

# 2、建立模型
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

model = linear_model.LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

# 3、训练数据
model.fit(train_X, train_Y)


# 4、评估模型
# Make predictions using the testing set
y_pred = model.predict(test_X)

# The coefficients
print("Coefficients: \n", model.coef_)
# The mean squared error
print("Mean squared error: %.2f" % mean_squared_error(test_Y, y_pred))
# The coefficient of determination: 1 is perfect prediction
print("Coefficient of determination: %.2f" % r2_score(test_Y, y_pred))



'''
考察单个特征值与结果之间的关系,以图表形式展示
'''

# 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()

线性回归做糖尿病分析(diabetes数据集),并分析单个特征值与病情的关系_第2张图片

Coefficient of determination为可决系数,表示一个随机变量与多个随机变量关系的数字特征,用来反映回归模式说明因变量变化可靠程度的一个统计指标。

从中可以看出,糖尿病数据集中10的特征,对target的影响大小,从大到小分别是:

 [[0.3439237602253803, 'bmi'], [0.32022405096453443, 's5'], [0.19490798886682947, 'bp'], [0.18528968598509687, 's4'], [0.1558585524453051, 's3'], [0.14629361572293453, 's6'], [0.04495353245556555, 's1'], [0.03530218264671636

3.使用PCA方法看哪写特征是重要的特征

import numpy as np
from sklearn.decomposition import PCA

# 导包获取糖尿病数据集
from sklearn.datasets import load_diabetes

data_diabetes = load_diabetes()
feature_names = data_diabetes['feature_names']

print(feature_names)

X = data_diabetes['data']
print("X=",X)  #打印原始特征
pca = PCA(n_components=10)
#pca.fit(X)
newX = pca.fit_transform(X)
print("newX=",newX) #打印降维后的特征
list =[] #存放每个特征值的名字和其对应的Coefficient of determination

#用zip对两个list打包,实现对两个list的同时遍历
for (i,j) in zip(pca.explained_variance_ratio_,feature_names):
    list_temp = []
    list_temp.append(i)
    list_temp.append(j)
    list.append(list_temp)

#标需要按照list中子元素中的第一列数值排序(降序)
print(list)
list.sort(key = lambda x:x[0], reverse=True)
print(list)
#它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。
print("explained_variance_ =",pca.explained_variance_)

#它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分
print("explained_variance_ratio_ =",pca.explained_variance_ratio_)
#主成分的奇异值
print("singular_values_ =",pca.singular_values_)

输出:

E:\anaconda3\envs\pytorch\python.exe D:/PycharmProjects/pytorchProject/PCA_Test.py
['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
X= [[ 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]]
newX= [[ 0.02793062 -0.09260116  0.02802696 ...  0.03602797 -0.00861296
  -0.00232861]
 [-0.13468605  0.06526341  0.00132778 ... -0.00896163  0.0240261
   0.00207334]
 [ 0.01294474 -0.07776417  0.0351635  ...  0.0401086  -0.00120629
  -0.0025774 ]
 ...
 [-0.00976257 -0.05733724  0.02359604 ... -0.02338733 -0.00538618
   0.00279971]
 [ 0.03295629  0.00999424 -0.04132126 ...  0.00374222 -0.00605083
  -0.00216612]
 [-0.09056089  0.18910814 -0.00230125 ...  0.05638256  0.03474472
  -0.00735209]]
[[0.4024214175678732, 'age'], [0.149231823521442, 'sex'], [0.1205962311527604, 'bmi'], [0.09554763877888944, 'bp'], [0.06621855792501147, 's1'], [0.060271921090787786, 's2'], [0.05365604569827698, 's3'], [0.043368320256738285, 's4'], [0.00783199101811801, 's5'], [0.0008560529901023446, 's6']]
[[0.4024214175678732, 'age'], [0.149231823521442, 'sex'], [0.1205962311527604, 'bmi'], [0.09554763877888944, 'bp'], [0.06621855792501147, 's1'], [0.060271921090787786, 's2'], [0.05365604569827698, 's3'], [0.043368320256738285, 's4'], [0.00783199101811801, 's5'], [0.0008560529901023446, 's6']]
explained_variance_ = [9.12520221e-03 3.38394158e-03 2.73460842e-03 2.16661312e-03
 1.50155460e-03 1.36671023e-03 1.21669038e-03 9.83408623e-04
 1.77596168e-04 1.94116324e-05]
explained_variance_ratio_ = [0.40242142 0.14923182 0.12059623 0.09554764 0.06621856 0.06027192
 0.05365605 0.04336832 0.00783199 0.00085605]
singular_values_ = [2.00604441 1.22160478 1.09816315 0.97748473 0.81374786 0.77634993
 0.73250287 0.65854628 0.27985695 0.09252313]

Process finished with exit code 0


需要注意的是,使用PCA对原始n个维度的数据降低到k个维度。
线性回归做糖尿病分析(diabetes数据集),并分析单个特征值与病情的关系_第3张图片
我不太确定这k个维度和原来的n个维度有什么对应关系?

比如,对10个维度的数据降到10维。如代码所示:

explained_variance_表示降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。

explained_variance_ratio_表示降维后的各主成分的方差值占总方差值的比例。这个比例越大,则越是重要的主成分。

但并不确定降维后的10个维度和原始10个维度的对应关系?

根据笔者的理解是:降维后的10个维度似乎是原始10个维度的某种组合,并不能找到对应关系。

熟悉这块的读者,可以留言评论,共同探讨。

另外,笔者了解:如果多个变量对结果都有影响,想看哪些影响的大。可以使用使用SPSS软件.
线性回归做糖尿病分析(diabetes数据集),并分析单个特征值与病情的关系_第4张图片
线性回归做糖尿病分析(diabetes数据集),并分析单个特征值与病情的关系_第5张图片
附上两张图,作为示意

参考
1.sklearn官方文档
2.数据挖掘-diabetes数据集分析-糖尿病病情预测_线性回归_最小平方回归

你可能感兴趣的:(python,线性回归,糖尿病,diabetes,sklearn)