我有一個自由文本描述,基於此我需要執行分類。例如,描述可以是事件的描述。根據事件的描述,我需要預測與事件相關的風險。例如:「在城裏謀殺」 - 這種描述是「高」風險的候選人。使用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