一、问题描述
糖尿病预测糖尿病数据集是Sklearn 提供的数据集。它从442例糖尿病患者的资料中取10个特征:年龄、性别、体重、血压和6个血清测试量值,以及患者在一年后疾病发展的量化值(标签)。
糖尿病预测任务是:根据上述10个特征,预测病情发展的量化值。
请用线性回归算法完成糖尿病预测任务。
二、实验目的
1.采用自定义的线性回归算法(正规方程求解法)解决糖尿病预测问题。输出R2模型的的值。
2.采用自定义的岭回归算法解决糖尿病预测问题,输出R2模型的的值(下周做)。
3.采用Sklearn的 LinearRegression线性回归算法解决糖尿病预测问题。输出R2模型的的值。
4.比较3种算法的实验结果(用表格表示),并分析3种算法在思想上有什么不同。
三、实验内容
(1)正规方程算法
import sklearn.datasets
import numpy as np
import linear_regression as lib
from sklearn.model_selection import train_test_split
def process_features(X):
m, n = X.shape
X = np.c_[np.ones((m, 1)), X]
return X
np.random.seed(100)
X, y = sklearn.datasets.load_diabetes(return_X_y=True)
# 1.正规方程求解法
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=5)
x_train = process_features(x_train) # 特征处理
x_test = process_features(x_test)
model = lib.LinearRegression()
model.fit(x_train, y_train) # 训练数据
y_pred = model.predict(x_test)
mse = lib.mean_squared_error(y_test, y_pred) # h的均方误差
r2 = lib.r2_score(y_test, y_pred) # R^2的决定系数
print("mse={}andr2={}".format(mse, r2))
运行结果:
(2)岭回归算法
import sklearn.datasets
import numpy as np
import linear_regression as lib
import ridge_regression as Rg
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
def process_features(X):
m, n = X.shape
X = np.c_[np.ones((m, 1)), X]
return X
np.random.seed(100)
X, y = sklearn.datasets.load_diabetes(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=5)
polt = PolynomialFeatures(degree = 2)
x_poly = polt.fit_transform(x_train) #特征处理
model = Rg.RidgeRegression(Lambda = 0.2)
model.fit(x_poly,y_train) #训练数据
x_test = polt.fit_transform(x_test) #X特征标准化
y_pred = model.predict(x_test) #预测数据
mse = lib.mean_squared_error(y_test,y_pred) #h的均方误差
r2 = lib.r2_score(y_test,y_pred) #R^2的决定系数
print("mse={} and r2={}".format(mse,r2))
当λ值不同时,目标函数的均方误差和决定系数不同
(3)采用Sklearn的 LinearRegression线性回归算法解决糖尿病预测问题
import sklearn.datasets
import numpy as np
import linear_regression as lib
from sklearn import linear_model
from sklearn.model_selection import train_test_split
def process_features(X):
m, n = X.shape
X = np.c_[np.ones((m, 1)), X]
return X
np.random.seed(100)
X, y = sklearn.datasets.load_diabetes(return_X_y=True)
#2.Scikit-learn
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=5)
x_train = process_features(x_train) #特征处理
x_test = process_features(x_test) #h的均方误差
clf = linear_model.LinearRegression()
clf.fit(x_train, y_train) #训练数据
y_pred=clf.predict(x_test) #预测数据
mse = lib.mean_squared_error(y_test,y_pred) #h的均方误差
r2 = lib.r2_score(y_test,y_pred) #R^2的决定系数
print("mse={}andr2={}".format(mse,r2))
运行结果:
五、实验结果及分析
(1)对比正规方程算法和Sklearn的 LinearRegression线性回归算法
算法\数值 均方误差(mse) 决定系数(r2)
正规方程算法 3052.853258418155 0.5070180640403985
线性回归算法 3052.853258418156 0.5070180640403983
(2)由上表的数据可以看出,正规方程算法和Sklearn的 LinearRegression线性回归算法,这两种算法的模型拟合效果相似,决定系数都大于50%,说明模型的拟合效果比较理想。
(3)对于岭回归,根据运行结果可以看出,随着λ的增大,决定系数R2变得越来越小,岭回归的目标函数越来越偏离训练数据的均方误差,因此,求得岭回归的最优解在训练数据上的决定系数变得越来越小。
六、遇到的问题及解决办法
(1)如果特征处理之前未做标准化处理,特征矩阵X的首列(常数1)将被标准画成全0列,给正规方程求解带来了困难。因此,特征处理必须在标准化之后实施。
(2)正规方程具有两种局限性:第一,所选的特征之间相互不独立,或者训练数据的个数m小于特征的个数n,导致XTX不可逆;第二,时间复杂度比较大,对于求解特征较多的回归问题是无法接受的。