使用scikit learn的GaussianNB和nltk不起作用

时间:2015-08-20 20:27:40

标签: python scikit-learn nltk

我正在尝试将nltk的包装器用于scikit-learn的分类器。我使用此代码来训练分类器:

classifier = SklearnClassifier(GaussianNB())
classifier.train(self.training_set)

training_set看起来像

[({'name':'Alpha Hotel', 'clicks':765, 'zip_code':75025},'no bookings')]

我得到的错误是

  

TypeError:传递了稀疏矩阵,但需要密集数据。使用   X.toarray()转换为密集的numpy数组。

我不知道如何转换为密集数组,特别是因为nltk的train方法文档需要A list of (featureset, label) where each featureset is a dict mapping strings to either numbers, booleans or strings.

2 个答案:

答案 0 :(得分:1)

也许这已经很晚了,但也许可以帮助其他人解决同样的问题(因为我昨天遇到了这个问题)。

  

TypeError:传递了稀疏矩阵,但需要密集数据。使用X.toarray()转换为密集的numpy数组。

像错误一样说,它需要转换为数组,所以我只是将其转换为数组,因为错误说

<?php
include("connection/mysqlconnect.php");

$sql="  SELECT course.duration, course.id, students.ID 
    FROM course, students 
    where course.id=course_id and course.duration = '2'";

$result = $conn->query($sql);
$count=mysqli_num_rows($result);


if($count>=1)
{
    while($row = mysqli_fetch_array($result)) {
            $id = $row['ID'];
            $stat = 'Active';
            $year = '2nd Year';
            $Graduated = 'Graduated';

    $sql1 = "UPDATE students SET Year='$Graduated', Status='non-Active' 
WHERE ID = '$id' and (status='$stat' and Year='$year')";
    echo "$id</br>";
    }

}
?>

所以只需添加.toarray()就可以解决这个问题 ;)

当我切换到MultinomialNB或BernoulliNB时,他们都没有错误。有或没有toarray()。

注意:不要忘记转换为适合并将文本转换为单词表示(数值)。

答案 1 :(得分:0)

你有三个功能,其中只有两个是数字格式。你首先应该转换&#39;名称&#39;功能到一个数字。如果name变量是分类的,那么您可以按照这里描述的有意义的方式对其进行编码:

http://scikit-learn.org/stable/modules/preprocessing.html#encoding-categorical-features

我认为你的标签也有限,所以你也可以对它们进行编码。最后一步非常简单,只需将nltk格式转换为numpy数组格式即可。只需读取循环中的每个特征,然后在X(特征)和Y(标签)中插入所需的特征:

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html