任何机器学习算法能否在不生成新特征(例如 x1-x2)的前提下发现这种模式:x1 < x2?

如果我有两个特征 x1 和 x2,我知道模式是这样的:

if x1 < x2 then     class1 else     class2

任何机器学习算法都能发现这样的模式吗?哪种算法可以做到这一点?

我知道我可以创建第三个特征 x3 = x1-x2。然后,特征 x3 可以很容易地被一些机器学习算法使用。例如,决策树可以使用 x3 和仅三个节点(一个决策节点和两个叶节点)100%解决这个问题。

但是,在不创建新特征的情况下解决这个问题是否可能?这似乎是一个如果机器学习算法能找到这种模式,就应该能轻松解决100%的问题。

我尝试了使用不同核的多层感知器(MLP)和支持向量机(SVM),包括 svg 核,结果并不理想。作为我尝试的一个例子,这里是 scikit-learn 代码,其中 SVM 只能得到 0.992 的分数:

import numpy as npfrom sklearn.svm import SVC# Generate 1000 samples with 2 features with random valuesX_train = np.random.rand(1000,2)# Label each sample. If feature "x1" is less than feature "x2" then label as 1, otherwise label is 0.y_train = X_train[:,0] < X_train[:,1]y_train = y_train.astype(int) # convert boolean to 0 and 1svc = SVC(kernel = "rbf", C = 0.9) # tried all kernels and C values from 0.1 to 1.0svc.fit(X_train, y_train)print("SVC score: %f" % svc.score(X_train, y_train))

运行代码的输出:

SVC score: 0.992000

这是我问题的简化。真实问题可能有数百个特征和不同的模式,而不仅仅是 x1 < x2。然而,首先了解如何解决这种简单模式将会有很大帮助。


回答:

要理解这一点,你必须深入了解 sklearn 提供的所有参数设置,特别是 C。了解 C 的值如何影响分类器的训练过程也很有帮助。

如果你查看 SVC 用户指南中的方程,你会发现方程有两个主要部分 – 第一部分试图找到解决问题的较小权重集,第二部分试图最小化分类错误。

C 是与分类错误相关的惩罚乘数。如果你降低 C,那么你就减少了惩罚(训练准确性降低但测试泛化性更好),反之亦然。

尝试将 C 设置为 1e+6。你会发现你几乎总是能得到100%的准确率。分类器已经学会了 x1 < x2 的模式。但它认为99.2%的准确率已经足够了,当你查看另一个称为 tol 的参数时。这控制了你认为可以忽略的误差量,默认值设置为 1e-3。如果你降低容忍度,你也可以期望得到类似的结果。

一般来说,我建议你使用像 GridSearchCV 这样的工具(链接)来寻找像 C 这样的超参数的最优值,因为它在内部将数据集分割成训练和验证集。这有助于你确保你不仅是在调整超参数以获得良好的训练准确性,而且还在确保分类器在实践中表现良好。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注