一、普通线性回归
原理:分类的目标变量是标称型数据,而回归将会对连续型的数据做出预测。
应当怎样从一大堆数据里求出回归方程呢?
假定输人数据存放在矩阵X中,而回归系数存放在向量W中。那么对于给定的数据X1, 预测结果将会通过
Y=X*W
给出。现在的问题是,手里有一些X和对应的Y,怎样才能找到W呢?
一个常用的方法就是找出使误差最小的W。这里的误差是指预测Y值和真实Y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我 们采用平方误差。
实例步骤
1. 导入库函数:from sklearn.linear_model import LinearRegression
import sklearn.datasets as datasets
import numpy as np
2.引入糖尿病数据 : data = datasets.load_diabetes()
3. 抽取特征和标签:dia_data = data.data
target = data.target
dia_data.shape,target.shape
4.创建算法模型:lgr = LinearRegression()
5.对数据进行切分:from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(dia_data,target,test_size=0.1)
6.对数据进行训练: lgr.fit(x_train,y_train)
7.预测:lgr.predict(x_test[::4]) 注:这里对测试数据每隔4个取一次 同理y_test[::4] 8.对数据进行评测:lgr.score(x_test,y_test)
二、岭回归
1、原理:如果数据的特征比样本点还多应该怎么办?是否还可以使用线性回归和之前的方法来做预测?
答案是否定的,即不能再使用前面介绍的方法。这是因为输入数据的矩阵X不是满秩矩阵。非满秩矩阵在求逆时会出现问题。
为了解决这个问题,统计学家引入了岭回归(ridge regression)的概念
【注意】在岭回归里面,决定回归模型性能的除了数据算法以外,还有一个缩减值lambda*I 岭回归是加了二阶正则项(lambda*I)的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小。
归纳总结
1.岭回归可以解决特征数量比样本量多的问题
2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果
3.缩减算法可以看作是对一个模型增加偏差的同时减少方差
岭回归用于处理下面两类问题:
1.数据点少于变量个数
2.变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大)实例步骤(岭回归一般用在样本值不够的时候):
1.导入库:from sklearn.linear_model import Ridge
2.构建训练数据:x_train = np.array([[1,1,2,2,3],[1,2,3,4,5],[2,3,4,1,2],[1,2,4,2,6]])
y_train = np.array([1,2,3,4])
3.构件普通线性回归对象:lgr = LinearRegression()
4.训练数据:lgr.fit(x_train,y_train)
5.构建测试数据并预测:x_test = [[1,4,3,2,5]]
lgr.predict(x_test)
6.构建岭回归对象:ridge = Ridge(alpha=10000)
7.训练数据:ridge.fit(x_train,y_train)
8.预测数据:ridge.predict(x_test)
9.查看回归系数:rigde.coef_
10.如何决定alpha值:x_train = 1/(np.arange(1,11) + np.arange(0,10).reshape((10,1)))
11. y_train = np.ones(10)
y_train
alphas = np.logspace(-10,-2,200)
alphas
12. 对于每一个alpha值的情况分别做一次训练,得出其中的回归系数
w = [] # 存储回归系数
ridge = Ridge(fit_intercept=False)
for a in alphas:
ridge.set_params(alpha=a)
ridge.fit(x_train,y_train)
w.append(rigde.coef_)
w
13. 对不同的alpha对应的回归系数,用图表来表示出来:
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(12,9))
axes = plt.subplot(111)
axes.plot(alphas,w)
axes.set_xscale("log")
14.从10^(-2)开始到10^5再去画一次岭迹线
alphas = np.logspace(-2,5,200)
w = [] # 存储回归系数
rigde = Ridge(fit_intercept=False)
for a in alphas:
rigde.set_params(alpha=a)
rigde.fit(x_train,y_train)
w.append(rigde.coef_)
w
plt.figure(figsize=(12,9))
axes = plt.subplot(111)
axes.plot(alphas,w) axes.set_xscale("log")
三.lasso回归
实例:普通线性回归、岭回归与lasso回归比较
1.导入包:from sklearn.linear_model import LinearRegression,Ridge,Lasso
2.使用numpy创建数据X,创建系数,对系数进行处理,对部分系数进行归零化操作,然后根据系数进行矩阵操作求得目标值
增加噪声:
x_train = np.random.randn(50,200)
x_train
3. 创建一些回归系数:
coef = np.random.randn(200)
coef
随机把回归系数中的190个设置为0
index = np.arange(200)
np.random.shuffle(index)
coef[index[:190]] = 0
coef
y_train = np.dot(x_train,coef)
y_train
4. 对以上创建好的符合现行回归数据,加一些噪声
y_train += 0.01*np.random.normal(200)
y_train
5.训练与测试数据:
x_train,x_test,y_train,y_test = train_test_split(x_train,y_train,test_size=0.3)
6.分别使用线性回归,岭回归,Lasso回归进行数据预测:
lgr = LinearRegression()
lgr.fit(x_train,y_train)
lgr.score(x_test,y_test)
7.创建对象:rg = Ridge(0.01)
rg.fit(x_train,y_train)
rg.score(x_test,y_test)
8.创建Lasso对象:ls = Lasso(0.01)
ls.fit(x_train,y_train)
ls.score(x_test,y_test)
9.数据视图,此处获取各个算法的训练数据的coef_:系数
plt.figure(figsize=(12,9))
axes1 = plt.subplot(221)
axes1.plot(coef)
axes1.set_title("True")
axes2 = plt.subplot(222)
axes2.plot(lgr.coef_)
axes2.set_title("linear")
axes3 = plt.subplot(223)
axes3.plot(rg.coef_)
axes3.set_title("rigde")
axes4 = plt.subplot(224)
axes4.plot(ls.coef_)
axes4.set_title("Lasso")