偏差与方差理论( 三 )


顺便重温了一下%%的默认重复次数是7次(不包含自身) 。
lm=ols("Price~LSTAT+RM+PTRATIO+DIS+NOX+CHAS+B+ZN+CRIM+RAD+TAX",data=http://www.kingceram.com/post/boston_data).fit()lm.summary()

偏差与方差理论

文章插图
四、压缩估计(正则化)
除了刚刚讨论的直接对特征自身进行选择以外,我们还可以对回归的系数进行约束或者加罚的技巧对p个特征的模型进行拟合,显著降低模型方差,这样也会提高模型的拟合效果 。
具体步骤就是在损失函数后加入一个额外的项,添加对系数的约束或者惩罚 。
1、岭回归(L2正则化)
J ( ω ) = ∑ i = 1 N ( y i ? ω 0 ? ∑ j = 1 p ω j x i j ) 2 + λ ∑ j = 1 p ω j 2 J(\omega) = \sum_{i=1}^{N}(y_{i}-\{0}-\sum_{j=1}^{p}\{j}x_{ij})^2 + \ \sum_{j=1}^{p}\omega _{j}^2 J(ω)=i=1∑N?(yi??ω0??j=1∑p?ωj?xij?)2+λj=1∑p?ωj2?
调节参数的大小是影响压缩估计的关键,越大,惩罚的力度越大,系数则越趋近于0,反之,选择合适的对模型精度来说十分重要 。岭回归通过牺牲线性回归的无偏性降低方差,有可能使得模型整体的测试误差较小,提高模型的泛化能力 。
from sklearn import linear_modelfrom sklearn import datasetsfrom sklearn.model_selection import train_test_splitimport matplotlib.pyplot as pltboston = datasets.load_boston()X = boston.datay = boston.target#选取人口中地位较低人群的百分数LSTAT和Price进行回归分析X_train,X_test,y_train,y_test = train_test_split(X[:,-1].reshape(-1,1),y.reshape(-1,1),test_size=0.2,random_state=0)reg_rid = linear_model.Ridge(alpha=.5)reg_rid.fit(X_train,y_train)reg_rid.score(X_test,y_test)y_pred=reg_rid.predict(X_test)#显示plt.scatter(X_test, y_test,color='black')plt.plot(X_test, y_pred, color='blue', linewidth=3)plt.show()
2、Lasso回归(L1正则化)
岭回归的一个很显著的特点是:将模型的系数往零的方向压缩,但是岭回归的系数只能呢个趋于0但无法等于0,换句话说,就是无法做特征选择 。能否使用压缩估计的思想做到像特征最优子集选择那样提取出重要的特征呢?答案是肯定的!我们只需要对岭回归的优化函数做小小的调整就行了,我们使用系数向量的L1范数替换岭回归中的L2范数:
J ( ω ) = ∑ i = 1 N ( y i ? ω 0 ? ∑ j = 1 p ω j x i j ) 2 + λ ∑ j = 1 p ∣ ω j ∣ J(\omega) = \sum_{i=1}^{N}(y_{i}-\{0}-\sum_{j=1}^{p}\{j}x_{ij})^2 + \ \sum_{j=1}^{p}\left | \omega _{j} \right | J(ω)=i=1∑N?(yi??ω0??j=1∑p?ωj?xij?)2+λj=1∑p?∣ωj?∣
为什么Losso能做到特征选择而岭回归却不能呢个做到呢?(如图:左边为lasso,右边为岭回归)
椭圆形曲线为RSS等高线,菱形和圆形区域分别代表了L1和L2约束,Lsaao回归和岭回归都是在约束下的回归,因此最优的参数为椭圆形曲线与菱形和圆形区域相切的点 。但是Lasso回归的约束在每个坐标轴上都有拐角,因此当RSS曲线与坐标轴相交时恰好回归系数中的某一个为0,这样就实现了特征提取 。反观岭回归的约束是一个圆域,没有尖点,因此与RSS曲线相交的地方一般不会出现在坐标轴上,因此无法让某个特征的系数为0,因此无法做到 特征提取 。
采用相同数据集进行测验:
reg_las = linear_model.Lasso(alpha=.5)reg_las.fit(X_train,y_train)reg_las.score(X_test,y_test)y_pred=reg_las.predict(X_test)#显示plt.scatter(X_test, y_test,color='black')plt.plot(X_test, y_pred, color='blue', linewidth=3)plt.show()
五、降维
降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式 。y是数据点映射后的低维向量表达,通常y的维度小于x的维度(当然提高维度也是可以的) 。f可能是显式的或隐式的、线性的或非线性的 。