构建sklearn文本分类器并用coremltools进行转换

2024-10-03 02:39:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用sklearn构建一个文本分类器,然后使用coremltools包将其转换为iOS11机器学习文件。 我用Logistic RegressionRandom Forest,和{a4}构建了三个不同的分类器,它们在Python中都可以正常工作。 问题在于coremltools包以及它将sklearn模型转换为iOS文件的方式。正如its documentation所说,它只支持以下模型:

  • 线性和逻辑回归
  • 线性和虚拟现实
  • SVC和SVR
  • NuSVC和NuSVR
  • 梯度提升分类器与回归器
  • 决策树分类器与回归器
  • 随机森林分类器与回归器
  • 标准化器
  • 杂质
  • 标准定标器
  • 数字矢量器
  • 一个热编码器

所以它不允许我对文本数据集进行矢量化(我在分类器中使用了TfidfVectorizer包):

import coremltools
coreml_model = coremltools.converters.sklearn.convert(model, input_features='text', output_feature_names='category')

^{pr2}$

有没有方法可以构建一个sklearn文本分类器而不使用TfidfVectorizer或CountVectorizer模型?


Tags: 文件模型文本机器model分类器线性random
1条回答
网友
1楼 · 发布于 2024-10-03 02:39:54

现在,如果要将tf-idf矢量器转换为.mlmodel格式,则不能在管道中包含tf-idf矢量器。解决这一问题的方法是分别对数据进行矢量化,然后用矢量化的数据训练模型(线性SVC、Random Forest…)。然后需要计算设备上的tf-idf表示,然后将其插入模型中。这是我写的tf-idf函数的副本。在

func tfidf(document: String) -> MLMultiArray{
    let wordsFile = Bundle.main.path(forResource: "words_ordered", ofType: "txt")
    let dataFile = Bundle.main.path(forResource: "data", ofType: "txt")
    do {
        let wordsFileText = try String(contentsOfFile: wordsFile!, encoding: String.Encoding.utf8)
        var wordsData = wordsFileText.components(separatedBy: .newlines)
        let dataFileText = try String(contentsOfFile: dataFile!, encoding: String.Encoding.utf8)
        var data = dataFileText.components(separatedBy: .newlines)
        let wordsInMessage = document.split(separator: " ")
        var vectorized = try MLMultiArray(shape: [NSNumber(integerLiteral: wordsData.count)], dataType: MLMultiArrayDataType.double)
        for i in 0..<wordsData.count{
            let word = wordsData[i]
            if document.contains(word){
                var wordCount = 0
                for substr in wordsInMessage{
                    if substr.elementsEqual(word){
                        wordCount += 1
                    }
                }
                let tf = Double(wordCount) / Double(wordsInMessage.count)
                var docCount = 0
                for line in data{
                    if line.contains(word) {
                        docCount += 1
                    }
                }
                let idf = log(Double(data.count) / Double(docCount))
                vectorized[i] = NSNumber(value: tf * idf)
            } else {
                vectorized[i] = 0.0
            }
        }
        return vectorized
    } catch {
        return MLMultiArray()
    }
}

编辑:在http://gokulswamy.me/imessage-spam-detection/上写了一篇关于如何做到这一点的文章。在

相关问题 更多 >