算法之线性回归

一、普通线性回归
原理:分类的目标变量是标称型数据,而回归将会对连续型的数据做出预测。
应当怎样从一大堆数据里求出回归方程呢?
假定输人数据存放在矩阵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")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值