一、普通线性回归  


原理:分类的目标变量是标称型数据,而回归将会对连续型的数据做出预测。  


应当怎样从一大堆数据里求出回归方程呢?  


假定输人数据存放在矩阵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")