线性模型学习

最基本的线性模型-线性回归

线性回归,也称之为最小二乘法(OLS),是在回归分析中最简单也是最经典的线性模型。它的基本原理是:找到当训练数据集中y的预测值和其真实值的平方差最小的时候,所对应的w值和b值。
下面是用线性回归来测试一下:

from sklearn.datasets import make_regression
from sklearn.linear_model import  LinearRegression
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
X,y = make_regression(n_samples=50,n_features=1,n_informative=1,noise=50,random_state=1)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=8)
#训练模型
reg = LinearRegression()
reg.fit(X_train,y_train)
#测试数据并作图
z = np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X,y,c='b',s=60)
plt.plot(z,reg.predict(z),c='k')
plt.title("Linear Regression")
plt.show()
print("线性方程为:")
print("y = {:.3f}".format(reg.coef_[0]),"x","+ {:.3f}".format(reg.intercept_))
print("===============================")
print("训练数据得分:{:.2f}".format(reg.score(X_train,y_train)))
print("测试数据得分:{:.2f}".format(reg.score(X_test,y_test)))

运行结果如下:
在这里插入图片描述
可以看到,这条直线尽量穿过更多的点,距离这50个点的距离之和是最小的,但是还是有很多点没有经过,得分也不是很高。

使用L2正则化的线性模型-岭回归

岭回归也是回归分析中常用的线性模型,它实际上是一种改良的最小二乘法。在岭回归中,模型回保留所有的特征变量,但是会减少特征变量的系数值,让特征变量对预测结果的影响变小。实际上,就是一种能够避免过拟合的线性模型。在岭回归中是通过改变其alpha参数来控制减少特征变量系数的程度,较高的alpha值代表模型代表模型的限制更加严格。
下面是一个在有400多个样本的糖尿病数据集上训练测试的例子:

from sklearn.datasets import load_diabetes
from sklearn.model_selection import learning_curve,KFold
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
X,y = load_diabetes().data,load_diabetes().target
#定义一个绘制学习曲线的函数
def plot_learning_curve(est,X,y):
#将数据进行20此拆分用来对模型进行评分
    training_set_size,train_scores,test_scores = learning_curve(
    est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,random_state=1))
#     print("train_set_size: {}".format(training_set_size))
#     print("train_scores: {}".format(train_scores))
#     print("test_scores: {}".format(test_scores))
    estimator_name = est.__class__.__name__
    line = plt.plot(training_set_size,train_scores.mean(axis=1),'--',label='training'+estimator_name)
    plt.plot(training_set_size,test_scores.mean(axis=1),'-',label='test'+estimator_name,c=line[0].get_color())
    plt.xlabel("Training set size")
    plt.ylabel("Score")
    plt.ylim(0,1.1)
#作图   
plot_learning_curve(Ridge(),X,y)
plot_learning_curve(LinearRegression(),X,y)
plt.legend(loc=(0,1.05),ncol=2,fontsize=11)

运行结果如下:
在这里插入图片描述
从图中可以清楚的看到,不管是在岭回归或者是在线性回归中,训练集的得分都比测试集的得分要高。然而,岭回归在测试集的得分中与训练集的差异就明显较线性回归小一些,尤其是在数据子集比较小的情况下。在图中可以明显看到,在数据量小于50条的时候,线性回归几乎没什么用,但是随着数据集的规模越来越大,线性回归的表现越来越好,后面就和岭回归基本持平了。

使用L1正则化的线性模型-套索回归

和岭回归一样,套索回归也会将系数限制在非常接近0的范围内,但它进行限制的方式不同,我们称之为L1正则化。与L2正则化有所不同,L1正则化会导致在使用套索回归的时候,有一部分特征的系数会正好等于0。也就是说,有一些特征会被模型忽略掉。
下面简单测试一下套索回归在同一个数据集下的表现:

from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
import numpy as np
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8)
lasso = Lasso(alpha=0.1,max_iter=100000).fit(X_train,y_train)#设置参数
print("==============================")
print("训练集得分:{:.2f}".format(lasso.score(X_train,y_train)))
print("测试集得分:{:.2f}".format(lasso.score(X_test,y_test)))
print("使用的特征数:{}".format(np.sum(lasso.coef_ != 0)))
print("===============================")

运行结果如下:
在这里插入图片描述
从结果可以看出来,只用了10个特征中对的7个。

总结

在本文中主要介绍了三种线性模型,当然还有更多的模型。在实际应用中,我们常常要先决定使用L1正则化的模型还是L2正则化的模型。大体的原则如下:若你的数据集中有很多特征,而这些特征中并不是每一个都对结果又重大影响,那么就可以选L1正则化的模型,如本文介绍的套索回归。而数据集中的特征数本来就不多并且每一个特征都很重要的情况下,那么就应该使用L2正则化的模型,如岭回归。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值