1.diabetes数据集
共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()
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个维度。
我不太确定这k个维度和原来的n个维度有什么对应关系?
比如,对10个维度的数据降到10维。如代码所示:
explained_variance_表示降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。
explained_variance_ratio_表示降维后的各主成分的方差值占总方差值的比例。这个比例越大,则越是重要的主成分。
但并不确定降维后的10个维度和原始10个维度的对应关系?
根据笔者的理解是:降维后的10个维度似乎是原始10个维度的某种组合,并不能找到对应关系。
熟悉这块的读者,可以留言评论,共同探讨。
另外,笔者了解:如果多个变量对结果都有影响,想看哪些影响的大。可以使用使用SPSS软件.
附上两张图,作为示意
参考:
1.sklearn官方文档
2.数据挖掘-diabetes数据集分析-糖尿病病情预测_线性回归_最小平方回归