是否存在用于神经网络增量特征学习的良好算法?是否有任何 python ML 库实现了这样的算法?

数据挖掘 Python 机器学习
2022-02-10 16:32:58

我正在使用高维数据集,并且发现我的降维尝试损害了下游分类器的准确性,这表明我在特征压缩过程中有效地丢失了信息。

此外,当我按重要性对特征进行排序(通过随机森林进行估计),然后在不同数量的最重要特征上训练神经网络时,我发现在我用尽所有看似有用的特征之前,得到的分类器准确度就停止了增加. 我怀疑同时训练数千个特征是问题所在,我想通过逐步学习特征来简化问题,即:

我想探索训练神经网络一次添加一些特征:例如使用前 100 个特征进行训练,然后添加下 100 个特征,再次训练(使用前一轮的系数加上随机系数作为新部分输入层),冲洗,重复。

请注意,这种“增量”是跨特征的,而不是样本;它不影响关于样本的训练是否是增量的(“在线”)。

我收集这种事情之前已经尝试过并取得了一些成功,但我无法在我检查过的 Python ML 库中找到实现,也找不到成功算法细节的良好解释。

我有大约 70K 个示例,分为 6 个平衡的类。对于我的大部分工作,我只关心总共 4 个类之间的区别,所以我合并了两对初始类并最终得到总共 4 个(结果,我最终得到了不平衡的训练集,但是由于这两个较大的类是分类最重要的类,我现在很好)。我总共有大约 28K 个特征,但我发现当使用不超过前 4K 个特征(通过随机森林按重要性预先排序)时,我得到了最好的分类器性能。

  1. 我的方法看起来合理吗?
  2. 是否有公认的已发布详细算法(例如,将特征添加为原始输入层的扩展是否合理,或者是否首选其他方法)?
  3. 是否有任何 Python 库,特别是与 scikit-learn 兼容的库,实现了这样的算法?
1个回答

与您描述的相反,使用频率更高。你从许多特征开始,然后在最后修剪神经网络。

我不相信任何 python 神经网络包都能满足你的要求。

但是实现起来非常简单。

例如,使用 sklearn,您可以只传递warm_start=True,这样它就不会在每次调用时重新初始化权重fit(),然后您可以增加特征层或您希望的任何层中的节点数。

from sklearn import datasets
from sklearn.neural_network import MLPClassifier
import numpy as np

X, y = datasets.load_iris(True)
X = (X-np.mean(X, 0))/np.std(X, 0)  # normalize

nhidden = 10
m = MLPClassifier(nhidden, max_iter=1000, warm_start=True).fit(X[:, :1], y)

# every 1,000 iterations, throw in a new feature
for nfeatures in range(2, X.shape[1]+1):
    m.coefs_[0] = np.r_[m.coefs_[0], np.random.randn(1, nhidden)]
    m.fit(X[:, :nfeatures], y)

# in the end, we have a neural network trained with all features
print(m.score(X, y))