数据挖掘:特征工程——特征提取与选择( 八 )


在这个例子当中,尽管数据中存在一些噪音,但这种特征选择模型仍然能够很好的体现出数据的底层结构 。当然这也是因为例子中的这个问题非常适合用线性模型来解:特征和响应变量之间全都是线性关系,并且特征之间均是独立的 。
然而,在很多实际的数据当中,往往存在多个互相关联的特征,这时候模型就会变得不稳定,对噪声很敏感,数据中细微的变化就可能导致模型的巨大变化(模型的变化本质上是系数,或者叫参数),这会让模型的预测变得困难,这种现象也称为多重共线性 。例如,假设我们有个数据集,它的真实模型应该是Y=X1+X2,当我们观察的时候,发现Y′=X1+X2+e,e是噪音 。如果X1和X2之间存在线性关系,例如X1约等于X2,这个时候由于噪音e的存在,我们学到的模型可能就不是Y=X1+X2了,有可能是Y=2X1,或者Y=?X1+3X2 。【在X1约等于X2的线性关系下,学到的这三种模型,理论上来说都是正确的,注意他们有个共同的特点是,系数之和为2】
size = 100# 另外一个种子为5的随机采样,若要执行相同的结果,以种子号来区分随机采样的结果np.random.seed(seed=5)X_seed = np.random.normal(0, 1, size)X1 = X_seed + np.random.normal(0, .1, size)X2 = X_seed + np.random.normal(0, .1, size)X3 = X_seed + np.random.normal(0, .1, size)X = np.array([X1, X2, X3]).TY = X1 + X2 + X3 + np.random.normal(0, 1, size)lr = LinearRegression()lr.fit(X, Y)print("Linear model:", pretty_print_linear(lr.coef_))>>> Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2
这个例子和上个例子中,三个特征都来源于标准正态分布的随机采样,这里系数之和接近3,基本上和上上个例子的结果一致,应该说学到的模型对于预测来说还是不错的 。但是,如果从系数的字面意思上去解释特征的重要性的话,X2对于输出变量来说具有很强的正面影响,而X0具有负面影响,而实际上所有特征与输出变量之间的影响是均等的 。同样的方法和套路可以用到类似的线性模型上,比如逻辑回归 。
5.3.1.2 L1正则化(Lasso)
正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力 。损失函数由原来的L(X,Y)变为 L ( X , Y ) + α ∣ w ∣,w L(X,Y)+\alpha \left| w \right|,w L(X,Y)+α∣w∣,w是模型系数组成的向量(有些地方也叫参数,),∥?∥一般是L1或者L2范数(w开几次方),α是一个可调的参数,控制着正则化的强度 。当用在线性模型上时,L1正则化称为Lasso(leastand)Ridge,L2正则化称为Ridge 。
L1正则化将系数w的l1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成0 。因此L1正则化往往会使学到的模型很稀疏(系数w经常为0),这个特性使得L1正则化成为一种很好的特征选择方法 。
-learn为线性回归模型提供了Lasso,为分类模型提供了L1逻辑回归 。下面的例子在波士顿房价数据上运行了Lasso,其中参数alpha是通过grid 进行优化的 。
from sklearn.linear_model import Lassofrom sklearn.preprocessing import StandardScalerfrom sklearn.datasets import load_bostonimport numpy as npboston = load_boston()scaler = StandardScaler()X = scaler.fit_transform(boston["data"])Y = boston["target"]names = boston["feature_names"]lasso = Lasso(alpha=.3)lasso.fit(X, Y)print("Lasso model: ", pretty_print_linear(lasso.coef_, names, sort=True))Lasso model: -3.707 * LSTAT + 2.992 * RM + -1.757 * PTRATIO + -1.081 * DIS + -0.7 * NOX + 0.631 * B + 0.54 * CHAS + -0.236 * CRIM + 0.081 * ZN + -0.0 * INDUS + -0.0 * AGE + 0.0 * RAD + -0.0 * TAX
可以看到,很多特征的系数都是0 。如果继续增加α的值,得到的模型就会越来越稀疏,即越来越多的特征系数会变成0 。然而,L1正则化像非正则化线性模型一样也是不稳定的,如果特征集合中具有相关联的特征,当数据发生细微变化时也有可能导致很大的模型差异 。