2

我对 SKLearn 比较陌生,并且有一个关于特征选择的问题。

我正在尝试构建一个 SVM 模型,我的数据具有大约 30 个特征,所有大约 10k 数据点,我目前正在尝试尽可能多地消除无用的特征。我首先删除了与其他功能高度相关的功能,现在想使用 RFECV 来优化剩余的功能。

首先,我在 sklearn 网站上找到了这段代码,我遇到了一些问题,想知道是否有人可以提供帮助。

X = df.drop(['label'], axis=1)
y = df['label']

rfe = RFECV(SVR(kernel='linear'), step=1, scoring='accuracy')
rfe.fit(X, y)
print(rfe.ranking_)

首先,如果我按原样运行它,它需要永远运行,我已经离开它很长时间了,我还没有真正设法让它完成。但是,如果我删除kernel='linear'它运行得相当快,但随后会产生一条错误消息,该消息似乎来自rfe.fit(X, y)

RuntimeError: The classifier does not expose "coef_" or "feature_importances_" attributes

我已经将我的功能减少到大约 10 个,只是为了看看我是否可以加快速度作为测试,并且还使用了step变量,但是那里的kernel='linear'变量似乎没有任何帮助加速它,它只是运行几个小时什么都不做。我想要的只是使用 RFECV 方法使用的功能列表。有没有人对我做错了什么或我可以做些什么来加快速度有什么建议?

非常感谢

4

2 回答 2

3
  1. 删除“kernel='linear'”时它运行得很快的原因是它很快就失败了。
  2. 只有 SVR(kernel='linear') 返回 RFECV 可以使用的 coef_。如果您使用任何其他内核,则不会返回任何 coef_,因此 RFECV 无法使用它。
  3. 通过设置“step=1”,您将强制 RFECV(SVR(kernel='linear'), step=1,scoring='accuracy') 拟合所有 n 个特征,排除系数最低的特征,再次拟合在 n-1 个特征上,再次排除系数最低的特征,等等。这很耗时。

试试这个来加快这个过程:

RFECV(SVR(kernel='linear'), step=5, scoring='accuracy', min_features_to_select = 10)

这应该明显更快。根据您的特定需求调整“step”和“min_features_to_select”。

于 2019-11-11T08:04:21.140 回答
2

SVR 模型更适用于缩放/标准化数据。尝试这个:

from sklearn.preprocessing import MinMaxScaler

X = df.drop(['label'], axis=1)
X_norm = MinMaxScaler().fit_transform(X)
y = df['label']

rfe = RFECV(SVR(kernel='linear'), step=1, scoring='accuracy')
rfe.fit(X_norm, y)
print(rfe.ranking_)

根据我的个人经验,这应该会加快速度。

或者,我相信您也可以使用标准缩放器来缩放您的功能:https ://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

于 2022-01-25T15:34:26.483 回答