我在一个在线课程中学习了反向消除的方法,老师使用了一个(50,5)的数据集,通过查看各列的p值手动消除列。
import statsmodels.api as sm X = np.append(arr = np.ones((2938, 1)).astype(int), values = X, axis = 1) X_opt = X[:, [0,1,2,3,4,5]] regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit() regressor_OLS.summary() # 第二步 X_opt = X[:, [0,1,,3,4,5]] regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit() regressor_OLS.summary() # 依此类推
现在我在练习时使用了一个较大的数据集(2938, 214),我是否需要自己手动消除所有的列?因为这工作量很大,有没有某种算法或方法可以自动完成?
这可能是一个愚蠢的问题,但我是一个机器学习的新手,所以任何帮助都会被感激。谢谢
回答:
你正在尝试做的事情被称为“递归特征消除”,简称RFE
。
来自sklearn.feature_selection.RFE
的例子:
from sklearn.datasets import make_friedman1from sklearn.feature_selection import RFE from sklearn.svm import SVR X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)estimator = SVR(kernel="linear")selector = RFE(estimator, 5, step=1)selector = selector.fit(X, y)
这将使用SVR
逐一消除特征,直到只剩下最重要的5
个。你可以使用任何提供feature_importances_
对象成员的算法。
关于p值
,你可以消除所有大于阈值的(假设原假设是这个系数没有意义,例如为零),但请看下面的内容。
请记住,通常当一些系数被移除时,系数的权重会发生变化(如这里或在RFE中),所以这只是一个依赖于许多因素的近似值。你可以进行其他预处理,比如移除相关特征,或使用带L1惩罚的OLS,这将只选择最有信息量的因素。