【问题标题】:improving prediction in sklearn改进 sklearn 中的预测
【发布时间】:2016-03-30 06:39:24
【问题描述】:

我正在寻找一些指导。我是 NLP 新手。我可以在 python 中找到我的方式,并编码了一些特征提取器。我想要做的是能够使用 sklearn 预测情绪类型,如快乐、悲伤等。为此,我创建了一个特征提取器,它提取了几个特征,如起始 POS、结束 POS、标点符号的数量、WH__ 单词的数量等。它创建了这些特征的数组,我试图找到一种方法来使用这些数据进行监督学习。我已经浏览了所有 800 多个句子,并有目标可以回答这些句子。然后我将前 750 个数组和答案数组提供给 sklearn,然后尝试对最后 50 个进行预测。sklearn 预测,但预测真的很差。

当然是我的问题,而不是 sklearn。我正在寻找一些指导来帮助我完成可能正确的功能建议,建议重新:规范化数据,以及总体上任何指导。我将在下面举例说明。

文本文件每行包含一个句子,特征提取器加载每个句子并以数组的形式给出特征列表。 此时数据看起来像

特征数组:

    setx=[[1, 0, 5, 12, 5, 13, .... -1, 0, 0, -1, 0, -1, 0, -1, 17, 11, 0],..... many more arrays like this]

目标数组: sety=[0, 0, 0, 0, 0, 0, 0, ..... 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1]

然后我正在使用:

    clf=svm.SVC(gamma=0.001,C=10)
    clf.fit(setx,sety)

下面的 tstx 和 tsty 是全部特征数组和目标数组的最后 50 个

    count=0
    for n in tstx:
            print clf.predict(n),',',tsty[count]
            count=count+1
            print "-----"

关于改进预测的任何建议!我很确定我在某处缺少德克萨斯州大小的洞:-)

非常感谢

【问题讨论】:

  • 嗯,机器学习不是一门手艺,而是一门艺术。我建议阅读其他人的做法并从他们的想法中获得灵感。这不是一个真正的编程问题,所以它在 SO 上相当离题。

标签: nlp scikit-learn prediction


【解决方案1】:

您的系统的性能可能取决于多种不同的因素,但您使用的功能和您尝试预测的类(“目标”)的数量起着重要作用。您应该问自己的一些问题是:

  • 你有多少个班级?学习区分 5 个不同的班级比学习 50 个班级更容易,如果班级数量增加,你可能需要更多示例。
  • 班级分布是否平衡?一般来说,最好的办法是为每个班级(悲伤、快乐等)提供相同数量的示例,并且没有班级过度或不足代表。

尽管如此,我相信您的问题出在功能上。您在答案中列出的那些似乎对情绪分析不是很有用。句子的起始位置并不表示句子中表达了哪种感觉,我想说的是,Wh-单词的数量或标点符号的数量也不是。 我真的不能给你一个具体的答案,但我建议你阅读一些关于情绪分析的有用特性的东西,这个领域很广,你可以采取几种方法。简单搜索一下 Google Scholar 就会找到很多可以从中获取灵感的资料。例如,您可以先查看SentiWordNet,它是 WordNet 的情感注释版本,并尝试将其中包含的信息用作模型的特征。

编辑 我认为对情绪预测有用的唯一特征是正面和负面词的数量,但我可能会弄错,因为我不是该领域的专家。其他的,比如开始 POS,结束 POS,Wh-words 的数量可能对疑问与陈述预测有用。如果您在代码中没有做错任何事情并且结果不好,那么您必须尝试更多/不同的功能。此外,不要为每个任务使用所有功能:您应该为您尝试预测的每件事设计一个特定的功能集,作为对情绪有用的功能 分析可能对其他预测没有用,反之亦然,它们实际上可能会使分类器感到困惑。有很多方法可以查看一个特征是否对目标具有预测价值,例如参见this,但我从未使用过它们,因此我无法对此提供实际反馈。也许你应该看看 sklearn 中是否已经实现了一些你可以使用的东西。

【讨论】:

  • 感谢您的回答。分类方面我只寻找少数类 - 情感类型是 6 类,其他东西,如情感强度是 4,情感模式只是积极与​​消极等。所以不是很多类。评论回复:选定的功能很有帮助。我已经提取了总共 126 个特征。有些类别比其他类别更平衡-我试图预测几个不同的类别-但不是同时。在任何时候,我都在使用一个目标和一个预测类。那么在您看来,除了选择正确的功能之外,其余的是否都在正确的轨道上?
  • 我不确定我是否正确理解了你所说的一切,但我相信问题出在功能上。除了您在问题中列出的功能之外,您还使用了哪些 126 项功能?您提供的内容并不能真正描述句子中的情绪。
  • 您好,我提取了正面词的数量、负面词的数量、辅音和元音的模式、句子长度、大写字母的数量、重复/重复的单词数量、标点符号的类型和数量、所有 POS ,名词短语的数量,POS 位置。我从 penn 树中获得了所有可能的 POS,并与它们一起创建了一个列表。现在对于这个列表中的每种类型的 POS,如果这个 POS 存在于给定的句子中,我把这个 POS 的列表索引放在 else -1。还提取了开头和结尾的词性,WH字的个数。我可以在这里给出整个脚本——只是不想惹恼别人。续……
  • 我试图预测多个事物,而不是同时预测所有事物。例如,我想预测句子的类型,疑问句 vs 陈述句 vs ... 我有这 800 个左右的句子,我已经评分为一种或其他类型的句子,具有一种或其他类型的情感,一定程度的强度等等,所以我一次使用这些功能和一个目标。如果我提取的特征没有意义,我将不胜感激任何正确方向的建议。
  • cont ... 我想知道是否有一种方法可以将每个特征与所选目标一起加载,然后绘制它以查看该特征是否真的对该特定目标有任何预测价值?谢谢,周末愉快
【解决方案2】:

阅读 @The Coding Monk 的答案,这可能不是一个完整的解决方案,但它可能适用于情绪分析。

  1. 尝试使用 sklearn 的TfIdfVectorizer,而不是显式提取特征。 TfIdfVectorizer 将根据 TF-IDF 分数从您的句子中提取单词

  2. 由于您已经有了一个分类句子列表,即情感值从 0 到 6 的句子,您可以结合 TfIdfVectorizer 轻松训练分类器

  3. 您可以使用sklearn Pipeline结合这两个步骤

这是它的外观

from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model.logistic import LogisticRegression

pipeline=Pipeline([
    ('vect', TfidfVectorizer(stop_words='english',sublinear_tf=True)),
    ('clf', LogisticRegression())
    ])

from sklearn.grid_search import GridSearchCV
parameters={}#for simplicity, keep this blank for now

gridSearchClassifier = GridSearchCV(pipeline, parameters, n_jobs=3, verbose=1, scoring='accuracy')

一旦我们建立了管道,我们就可以引入我们的训练数据

import pandas as pd
traindf = pd.read_csv('path to your data')
# Create learning matrix
X, y = traindf['sentenceColumn'], traindf['sentimentColumn'].as_matrix()
# Split into Training and Validation Sets

from sklearn.cross_validation import train_test_split
Xtrain, Xvalidate, ytrain, yValidate = train_test_split(X, y, train_size=0.7)

最后,为了训练,你所要做的就是

gridSearchClassifier.fit(Xtrain, ytrain)

现在您可以评估您在验证集上的表现

# Evaluate performance of gridSearchClassifier on Validation Set
    predictions = gridSearchClassifier.predict(Xvalidate)
    print ('Accuracy:', accuracy_score(yValidate, predictions))
    print ('Confusion Matrix:', confusion_matrix(yValidate, predictions))
    print ('Classification Report:', classification_report(yValidate, predictions))

如果您满意,则将最后 50 个句子作为您的测试集

testdf = pd.read_csv("path to test data") 
# Predict Sentiment on Test Set
predictions=gridSearchClassifier.predict(testdf['sentenceColumn'])
# Create new column in Test dataframe
testdf['predictedSentiment'] = predictions
# Save the dataframe with the new column
testdf.to_csv("result.csv",index=False)

【讨论】:

  • 您好 AbtPst,感谢您的回答。我正在尝试这个并且现在也在阅读 scikit 书籍。再次感谢您的指导。一旦我走得更远,我会更新。
  • 很高兴为您提供帮助 :) 一切顺利
猜你喜欢
  • 2018-03-23
  • 2018-10-15
  • 1970-01-01
  • 2017-08-22
  • 2018-12-27
  • 2019-08-31
  • 2018-12-20
  • 2018-12-01
  • 1970-01-01
相关资源
最近更新 更多