【问题标题】:Multiple Output Machine Learning Model - Python多输出机器学习模型 - Python
【发布时间】:2020-03-01 07:45:49
【问题描述】:

大家好,我已经尝试搜索此主题,但未能找到好的答案,所以我希望有人能帮助我。 假设我正在尝试使用 scikit-learn 和 python 创建一个 ML 模型。我有一个这样的数据集:

| Features | Topic   | Sub-Topic        |
|----------|---------|------------------|
| ...      | Science | Space            |
| ...      | Science | Engineering      |
| ...      | History | American History |
| ...      | History | European History |

我的功能列表仅由文本组成,例如某篇文章中的一小段。现在我希望能够使用 ML 来预测该文本的主题和子主题。

我知道我需要使用某种 NLP 来分析文本,例如 spaCy。我感到困惑的部分是有两个输出变量:主题和子主题。我读过 scikit-learn 有一个叫做 MultiOutputClassifier 的东西,但是还有一个叫做 MultiClass Classification 的东西,所以我只是有点困惑要走什么路线。

有人可以为我指出正确的方向吗?使用什么回归器或如何实现这一点?

【问题讨论】:

    标签: python machine-learning scikit-learn nlp


    【解决方案1】:

    所以 MultiClass 只是说一个目标变量中有多个类。 MultiOutput 意味着我们有多个目标变量。这里我们有一个MultiClass-MultiOutput 问题。

    scikit-learn 原生支持 MultiClass-MultiOutput 用于以下分类器。

    sklearn.tree.DecisionTreeClassifier
    sklearn.tree.ExtraTreeClassifier
    sklearn.ensemble.ExtraTreesClassifier
    sklearn.neighbors.KNeighborsClassifier
    sklearn.neighbors.RadiusNeighborsClassifier
    sklearn.ensemble.RandomForestClassifier
    

    我建议选择 RandomForest,因为大多数情况下它开箱即用,效果很好。

    所以举一个虚拟的例子来演示RandomForestClassifier的api对于多个目标。

    ### Dummy Example only to test functionality
    np.random.seed(0)
    X = np.random.randn(10,2)
    y1 = (X[:,[0]]>.5).astype(int) # make dummy y1
    y2 = (X[:,[1]]<.5).astype(int) # make dummy y2
    y = np.hstack([y1,y2]) # y has 2 columns
    print("X = ",X,sep="\n",end="\n\n")
    print("y = ",y,sep="\n",end="\n\n")
    rfc = RandomForestClassifier().fit(X, y) # use the same api for multi column y!
    out = rfc.predict(X)
    print("Output = ",out,sep="\n")
    

    输出

    X = 
    [[ 1.76405235  0.40015721]
     [ 0.97873798  2.2408932 ]
     [ 1.86755799 -0.97727788]
     [ 0.95008842 -0.15135721]
     [-0.10321885  0.4105985 ]
     [ 0.14404357  1.45427351]
     [ 0.76103773  0.12167502]
     [ 0.44386323  0.33367433]
     [ 1.49407907 -0.20515826]
     [ 0.3130677  -0.85409574]]
    
    y = 
    [[1 1]
     [1 0]
     [1 1]
     [1 1]
     [0 1]
     [0 0]
     [1 1]
     [0 1]
     [1 1]
     [0 1]]
    
    Output = 
    [[1 1]
     [1 0]
     [1 1]
     [1 1]
     [0 1]
     [0 0]
     [1 1]
     [0 1]
     [1 1]
     [0 1]]
    

    顺便说一句,当您正在做一个与 NLP 相关的模型时,我建议您使用 Keras's multi-output NN api 来训练神经网络以获得更好的输出!

    【讨论】:

    • 那么对于训练,我的 Y 可以是一个数组吗?例如,我可以制作:X = df.features 和 y = [df.topic, df.subtopic] 这仍然有效吗?
    • 是的,我更新了答案以包含一个简单的示例来展示这一点,干杯!
    猜你喜欢
    • 2017-08-14
    • 2016-10-27
    • 2020-03-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多