【问题标题】:Can any machine learning algorithm find this pattern: x1 < x2 without generating a new feature (e.g. x1-x2) first?任何机器学习算法都可以在不首先生成新特征(例如 x1-x2)的情况下找到这种模式:x1 < x2?
【发布时间】:2018-12-29 04:23:39
【问题描述】:

如果我有 2 个特征 x1 和 x2,我知道模式是:

if x1 < x2 then 
    class1 
else 
    class2

任何机器学习算法都可以找到这样的模式吗?那会是什么算法?

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

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

我尝试了不同内核的 MLP 和 SVM,包括 svg 内核,但结果不是很好。作为我尝试的示例,这里是 scikit-learn 代码,其中 SVM 只能获得 0.992 的分数:

import numpy as np
from sklearn.svm import SVC

# Generate 1000 samples with 2 features with random values
X_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 1

svc = SVC(kernel = "rbf", C = 0.9) # tried all kernels and C values from 0.1 to 1.0

svc.fit(X_train, y_train)
print("SVC score: %f" % svc.score(X_train, y_train))

运行代码的输出:

SVC score: 0.992000

这是对我的问题的过度简化。真正的问题可能有数百个特征和不同的模式,而不仅仅是 x1

【问题讨论】:

    标签: machine-learning scikit-learn feature-extraction pattern-recognition


    【解决方案1】:

    要理解这一点,您必须进入sklearn,尤其是C 提供的所有参数的设置。它还有助于理解C 的值如何影响分类器的训练过程。

    如果您查看User Guide for SVC 中的方程式,方程式有两个主要部分 - 第一部分尝试找到解决问题的一小组权重,第二部分尝试最小化分类错误.

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

    尝试将C 设置为1e+6。您将看到您几乎总是获得 100% 的准确率。分类器已经学习了模式 x1 tol 的参数时,它认为 99.2% 的准确度就足够了。这控制了多少错误对您来说可以忽略不计,默认情况下它设置为1e-3。如果您降低容差,您也可以获得类似的结果。

    一般来说,我建议您使用 GridSearchCV (link) 之类的东西来找到像 C 这样的超参数的最佳值,因为这会在内部将数据集拆分为训练和验证。这有助于确保您不仅调整超参数以获得良好的训练准确性,而且还确保分类器在实践中表现良好。

    【讨论】:

      猜你喜欢
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多