我有一个自由文本描述,基于此我需要执行分类。例如,描述可以是事件的描述。根据事件的描述,我需要预测与事件相关的风险。例如:“在城里谋杀” - 这种描述是“高”风险的候选人。使用Spark的文本分类ML
我试过逻辑回归,但意识到目前仅支持二进制分类。对于基于自由文本描述的多类分类(只有三种可能的值),最适合的算法是什么? (线性回归或朴素贝叶斯)
我有一个自由文本描述,基于此我需要执行分类。例如,描述可以是事件的描述。根据事件的描述,我需要预测与事件相关的风险。例如:“在城里谋杀” - 这种描述是“高”风险的候选人。使用Spark的文本分类ML
我试过逻辑回归,但意识到目前仅支持二进制分类。对于基于自由文本描述的多类分类(只有三种可能的值),最适合的算法是什么? (线性回归或朴素贝叶斯)
由于您使用spark,我假设你有bigdata,所以-I是没有专家 - 但在阅读你的答案后,我想提出几点。
创建培训(80%)和测试数据集(20%)
我将我的数据划分到培训(60-70%),测试(15-20 %)和评估(15-20%)集..
这个想法是,你可以微调你的分类算法wrt训练集,但我们真的想要处理分类任务,就是让他们分类看不见的数据。因此,使用测试集对您的算法进行微调,当您完成时,使用评估集,以真正理解事情的工作方式!
停止的话
如果您的数据是从报纸和文章等,我个人还没有看到通过使用更复杂的停止词去除任何显著的改善方法...
但是,这只是个人陈述,但如果我是你,我不会专注于这一步。
词频
如何使用Term Frequency-Inverse Document Frequency (TF-IDF)项权重呢?你可能想要阅读:How can I create a TF-IDF for Text Classification using Spark?
我会尝试两个和比较!
多项
你有什么特别的原因,试图多项分布?如果否,则由于当n为1且k为2时,多项分布是伯努利分布,如Wikipedia中所述,其为is supported。
尝试都和比较(这是你必须习惯的东西,如果你想使你的模型更好!:))
我也看到apache-spark-mllib提供Random forests,这可能值得至少阅读! ;)
如果你的数据不是那么大,我也想尝试支持向量机(SVM),从scikit-learn,然而支持python,所以你应该切换到pyspark或纯python,放弃spark 。顺便说一句,如果你真的想要sklearn,这可能会派上用场:How to split into train, test and evaluation sets in sklearn?,因为熊猫与sklearn一起玩的很好。
希望这会有所帮助!
题外话:
这实在不是问在堆栈溢出问题的方式。阅读How to ask a good question?
就个人而言,如果我是你,我会先做你在答案中所做的所有事情,然后发表一个问题,总结我的方法。
至于赏金,你可能需要阅读:How does the Bounty System work?
这就是我解决上述问题的方法。
虽然预测准确性并不差,但为了更好的结果,模型必须进一步调整 。
专家,如果您发现任何错误,请回复。
我的输入数据帧有两列“文本”和“RiskClassification”
下面是步骤,使用朴素贝叶斯预测在Java中
sqlContext.udf().register("myUDF", new UDF1<String, Integer>() {
@Override
public Integer call(String input) throws Exception {
if ("LOW".equals(input))
return 1;
if ("MEDIUM".equals(input))
return 2;
if ("HIGH".equals(input))
return 3;
return 0;
}
}, DataTypes.IntegerType);
samplingData = samplingData.withColumn("label", functions.callUDF("myUDF", samplingData.col("riskClassification")));
对于例如:
DataFrame lowRisk = samplingData.filter(samplingData.col("label").equalTo(1));
DataFrame lowRiskTraining = lowRisk.sample(false, 0.8);
联盟所有数据构建完整的训练数据的框架
构建测试数据有点棘手。测试数据应该具有的所有数据, 没有出现在训练数据的训练数据的
开始改造和建立模型
6。标记化的文本列中的训练数据集
Tokenizer tokenizer = new Tokenizer().setInputCol("text").setOutputCol("words");
DataFrame tokenized = tokenizer.transform(trainingRiskData);
StopWordsRemover remover = new StopWordsRemover().setInputCol("words").setOutputCol("filtered");
DataFrame stopWordsRemoved = remover.transform(tokenized);
int numFeatures = 20;
HashingTF hashingTF = new HashingTF().setInputCol("filtered").setOutputCol("rawFeatures")
.setNumFeatures(numFeatures);
DataFrame rawFeaturizedData = hashingTF.transform(stopWordsRemoved);
IDF idf = new IDF().setInputCol("rawFeatures").setOutputCol("features");
IDFModel idfModel = idf.fit(rawFeaturizedData);
DataFrame featurizedData = idfModel.transform(rawFeaturizedData);
JavaRDD<LabeledPoint> labelledJavaRDD = featurizedData.select("label", "features").toJavaRDD()
.map(new Function<Row, LabeledPoint>() {
@Override
public LabeledPoint call(Row arg0) throws Exception {
LabeledPoint labeledPoint = new LabeledPoint(new Double(arg0.get(0).toString()),
(org.apache.spark.mllib.linalg.Vector) arg0.get(1));
return labeledPoint;
}
});
NaiveBayes naiveBayes = new NaiveBayes(1.0, "multinomial");
NaiveBayesModel naiveBayesModel = naiveBayes.train(labelledJavaRDD.rdd(), 1.0);
润测试数据上的所有上述转换也
环路通过测试数据帧,并执行以下操作
创建使用在测试数据帧
对于例如“标签”和“功能”一LabeledPoint:如果测试数据帧具有标签和特征在第三和第七列,然后
LabeledPoint labeledPoint = new LabeledPoint(new Double(dataFrameRow.get(3).toString()),
(org.apache.spark.mllib.linalg.Vector) dataFrameRow.get(7));
double predictedLabel = naiveBayesModel.predict(labeledPoint.features());
同时放入预测标签作为所述测试数据帧的列。
现在测试数据帧具有预期标签和预测标签。
您可以将测试数据导出到csv并进行分析,或者也可以以编程方式计算精度。
感谢gsamaras。我会按照你所提到的建议 – lives
@lives太棒了!我也更新了我的答案,因为我现在正在做SVM,而且我感觉你非常棒! – gsamaras