如何处理机器学习中的大量特征?

数据挖掘 机器学习 神经网络 深度学习 特征工程 降维
2021-09-23 03:54:55

我尝试对高维传统柱状数据(数百列)进行正常分类。特征是不同类型的。在这种情况下,显然不可能逐一检查每个特征以弄清楚它们到底是什么以及可以用它们进行哪些优化或特征工程。

尽管如此,我还是必须完成所有必要的预处理步骤,如插补、标准化等。但即使是分类特征编码或插补等基本步骤也是有问题的,因为 R/Python-pandas 有时会被错误地识别为某些变量的数字/分类性质(以及因此,错误地尝试对 NA 进行编码或均值估算),更不用说其他非常有问题的问题,如果可以逐个监督这些特征,则可以解决这些问题。

当然,我可以求助于能够使用 NA 处理非标准化功能的模型,但这一方面限制了可能模型的数量,另一方面似乎我非常不专业。有什么方法可以解决这个问题?

3个回答

我知道 Python 有 4 种方法。在下文中,我复制了我为回归目的编写的代码。分类将非常相似:

第一选择KBest

from sklearn.feature_selection import SelectKBest, f_regression
train_data = train_data.apply(pd.to_numeric).astype('float32')

kb = SelectKBest(score_func=f_regression, k=70)
kb.fit(train_data.loc[:, train_data.columns != 'SalePriceLog'], train_data.SalePriceLog)
indices = np.argsort(kb.scores_)[::-1]
selected_features = []
for i in range(5):
  selected_features.append(train_data.columns[indices[i]])
plt.figure()
plt.bar(selected_features, kb.scores_[indices[range(5)]], color='r', align='center')
plt.xticks(rotation=45)

结果: 在此处输入图像描述

二:RFE

 from sklearn.linear_model import LogisticRegression, LinearRegression
    from sklearn.feature_selection import RFE
    model = LinearRegression()
    rfe = RFE(model, 10)
    fit_rfe = rfe.fit(train_data.loc[:, train_data.columns != 'SalePriceLog'], train_data.SalePriceLog)
indices_rfe = np.argsort(fit_rfe.ranking_)
selected_features_rfe = []
for i in range(10):
    selected_features_rfe.append(train_data.columns[indices_rfe[i]])
selected_features_rfe
plt.figure()
plt.bar(selected_features_rfe, fit_rfe.ranking_[indices[range(10)]], color='r', align='center')
plt.xticks(rotation=45)

结果:在此处输入图像描述

第三:PCA

from sklearn.decomposition import PCA
# pca = PCA(n_components=5)
pca = PCA(0.999)
fit = pca.fit(train_data.loc[:, train_data.columns != 'SalePriceLog'])

第四:ExtraTrees

from sklearn.ensemble import ExtraTreesRegressor

model_extra_tree = ExtraTreesRegressor()
model_extra_tree.fit(train_data.loc[:, train_data.columns != 'SalePriceLog'], train_data.SalePriceLog)
indices_extra_tree = np.argsort(model_extra_tree.feature_importances_)[::-1]
selected_feature_extra_tree = []
for i in range(10):
    selected_feature_extra_tree.append(train_data.columns[indices_extra_tree[i]])
plt.figure
plt.bar(selected_feature_extra_tree, model_extra_tree.feature_importances_[indices_extra_tree[range(10)]])
plt.xticks(rotation=45)

结果:在此处输入图像描述

我认为你应该首先检查特征之间的相关性,它告诉你如果你没有先完成这一步,哪些特征可以被忽略。通过不选择依赖于其他的特征,这将在一定程度上降低特征维度。

你可以做很多事情。我提出两件非常合理的事情。

  1. 尝试使用PCA. 尽管它是线性的,但您可以灵活地减少特征数量并调查丢失了多少信息。
  2. 尝试找出每个特征与输出之间的相关性。如果它们不相关,您可能会考虑忽略该功能。但要注意交叉功能。例如:您的基础数据可能是这样的:
F1 F2 L
A  X  1
A  Y  0
B  X  0
B  Y  1

现在,F1 和 F2 分别与数据不相关,但它们一起完全确定了标签。

虽然你有太多的功能,但它可以自动完成。