改进sklearn中的预测

时间:2015-12-23 19:14:56

标签: nlp scikit-learn prediction

我正在寻找一些指导。我是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 "-----"

有关改进预测的任何建议!我很确定我错过了某个德克萨斯州大小的洞: - )

非常感谢

2 个答案:

答案 0 :(得分:3)

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

  • 你有多少课程?学习区分5个不同的课程比学习50更容易,如果课程数量增加你可能需要更多的例子。
  • 课程分布是否平衡?一般情况下,最好的方法是为每个课程(悲伤,快乐等等)提供相同数量的例子,没有课程超过 - 或者代表不足。

尽管如此,我相信你的问题在于功能。你在答案中列出的那些似乎对情绪分析没有用。句子的起始POS并不表示在句子中表达了哪种感觉,也不是说,Wh-words的数量或标点符号的数量。 我无法给你一个具体的答案,但我建议你阅读一些关于情感分析的有用功能,这个领域很广泛,你可以采取几种方法。只需搜索一下Google学术搜索,您就会发现许多材料可以从中获取灵感。例如,您可以首先查看SentiWordNet,这是WordNet的情感注释版本,并尝试将其中包含的信息用作模型的功能。

修改 我认为对情绪预测有用的唯一功能是正面和负面的单词,但我可能会错,因为我不是该领域的专家。其他如开始POS,结束POS,Wh字的数量可能对疑问与声明预测有用。如果您在代码中没有做任何错误而且结果不佳,那么您必须尝试更多/不同的功能。此外,不要为每项任务使用所有功能:您应该为您要预测的每件事设计一个特定的功能集,作为对情感有用的功能 分析可能对其他预测没有用,反之亦然,它们实际上可能会对分类器造成混淆。有很多方法可以查看某个要素是否具有目标的预测值,例如,请参阅this,但我从未使用它们,因此我无法就此提供实际反馈。也许您应该查看是否已经在sklearn中实现了可以使用的内容。

答案 1 :(得分:1)

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

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

  2. 由于您已经有一个分类句子列表,即情绪值为0-6的句子,您可以轻松地与TfIdfVectorizer一起训练分类器

  3. 您可以使用sklearn Pipeline

  4. 组合这两个步骤

    以下是它的外观

    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)