【问题标题】:multioutput classifier/learning 5 target variables多输出分类器/学习 5 个目标变量
【发布时间】:2018-03-27 23:04:17
【问题描述】:

我是机器学习的新手。几个星期以来,我一直在为一个问题苦苦挣扎,希望有人可以在这里提供帮助:

我有一个包含一个连续变量的数据集,其余的都是分类的。我设法对分类变量进行编码,并希望构建一个多输出分类器。

这是我的数据集: Snapshot of my data set 我有这些特点:A,B 我想预测:C、D、E、F、G

数据集如下所示:A,B,C,D,E,F,G

我花了几天时间在 scikitlearn 和此处查看有关多输出分类器的文档,但我似乎都不清楚这些文档。

谁能指出我正确的方向,以找到一些关于如何创建分类器并使用一些样本数据进行预测的示例代码?

提前谢谢你 P.S:我没有使用 TensorFlow,非常感谢您对 sklearn 的帮助。

【问题讨论】:

    标签: python machine-learning scikit-learn data-science multilabel-classification


    【解决方案1】:

    这被称为multi-task learning,这基本上意味着一个模型可以学习多个函数,但共享(部分或全部)权重。这是相当普遍的,例如用于图像识别和检测的一种模型。你需要做的是定义几个损失函数(它们被称为heads)。

    这是一个非常简单的 tensorflow 示例,它从 X(来自 this post series)学习 Y1Y2

    # Define the Placeholders
    X = tf.placeholder("float", [10, 10], name="X")
    Y1 = tf.placeholder("float", [10, 1], name="Y1")
    Y2 = tf.placeholder("float", [10, 1], name="Y2")
    
    # Define the weights for the layers
    shared_layer_weights = tf.Variable([10,20], name="share_W")
    Y1_layer_weights = tf.Variable([20,1], name="share_Y1")
    Y2_layer_weights = tf.Variable([20,1], name="share_Y2")
    
    # Construct the Layers with RELU Activations
    shared_layer = tf.nn.relu(tf.matmul(X,shared_layer_weights))
    Y1_layer = tf.nn.relu(tf.matmul(shared_layer,Y1_layer_weights))
    Y2_layer_weights = tf.nn.relu(tf.matmul(shared_layer,Y2_layer_weights))
    
    # Calculate Loss
    Y1_Loss = tf.nn.l2_loss(Y1,Y1_layer)
    Y2_Loss = tf.nn.l2_loss(Y2,Y2_layer)
    

    如果您希望使用纯 scikit 进行编码,请参阅 sklearn.multiclass 包,它们支持多输出分类和多输出回归。下面是一个多输出回归的例子:

    >>> from sklearn.datasets import make_regression
    >>> from sklearn.multioutput import MultiOutputRegressor
    >>> from sklearn.ensemble import GradientBoostingRegressor
    >>> X, y = make_regression(n_samples=10, n_targets=3, random_state=1)
    >>> MultiOutputRegressor(GradientBoostingRegressor(random_state=0)).fit(X, y).predict(X)
    array([[-154.75474165, -147.03498585,  -50.03812219],
           [   7.12165031,    5.12914884,  -81.46081961],
           [-187.8948621 , -100.44373091,   13.88978285],
           [-141.62745778,   95.02891072, -191.48204257],
           [  97.03260883,  165.34867495,  139.52003279],
           [ 123.92529176,   21.25719016,   -7.84253   ],
           [-122.25193977,  -85.16443186, -107.12274212],
           [ -30.170388  ,  -94.80956739,   12.16979946],
           [ 140.72667194,  176.50941682,  -17.50447799],
           [ 149.37967282,  -81.15699552,   -5.72850319]])
    

    [更新]

    这是一个执行多目标分类的完整代码。尝试运行它:

    import numpy as np
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.multioutput import MultiOutputClassifier
    
    # The data from your screenshot
    #  A      B   C    D    E   F    G
    train_data = np.array([
      [5, 133.5, 27, 284, 638, 31, 220],
      [5, 111.9, 27, 285, 702, 36, 230],
      [5,  99.3, 25, 310, 713, 39, 227],
      [5, 102.5, 25, 311, 670, 34, 218],
      [5, 114.8, 25, 312, 685, 34, 222],
    ])
    # These I just made up
    test_data_x = np.array([
      [5, 100.0],
      [5, 105.2],
      [5, 102.7],
      [5, 103.5],
      [5, 120.3],
      [5, 132.5],
      [5, 152.5],
    ])
    
    x = train_data[:, :2]
    y = train_data[:, 2:]
    forest = RandomForestClassifier(n_estimators=100, random_state=1)
    classifier = MultiOutputClassifier(forest, n_jobs=-1)
    classifier.fit(x, y)
    print classifier.predict(test_data_x)
    

    输出(嗯,对我来说看起来很合理):

    [[  25.  310.  713.   39.  227.]
     [  25.  311.  670.   34.  218.]
     [  25.  311.  670.   34.  218.]
     [  25.  311.  670.   34.  218.]
     [  25.  312.  685.   34.  222.]
     [  27.  284.  638.   31.  220.]
     [  27.  284.  638.   31.  220.]]
    

    如果由于某种原因这不起作用或无法应用于您的情况,请更新问题。

    【讨论】:

    • 嗨马克西姆,感谢您的回答。我查看了 sklearn.multiclass 的示例,如您所见,在我看来,这些示例是基于一些人工生成的数据,主要是 numpy 数组。我很难从自己的数据集中指定训练集和测试集。
    • @PatMuk 你的数据是数字的还是分类的?数值特征可以读入numpy数组,分类特​​征可以编码——scikit-learn.org/stable/modules/…
    • 两者。我已经对所有分类变量进行了编码。如何将我的数据集从训练集拆分为测试集?在这一行:X, y1 = make_classification(n_samples=10, n_features=100, n_informative=30, n_classes=3, random_state=1),代码与我的数据集有什么关系?抱歉,这对你来说似乎微不足道,但这让我很难过。
    • 使用sklearn.model_selection.train_test_split。此外,您没有提供有关数据的任何详细信息,因此无法说明如何准备数据。
    • 数据已经准备好,我可以对单个目标进行一些预测,但正如我解释的那样,我无法预测多个目标。我附上了我的数据集的快照。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 2022-06-15
    • 2017-08-18
    • 2017-08-14
    • 2020-03-09
    • 2019-08-24
    • 2018-11-09
    相关资源
    最近更新 更多