Spark MLlib SVM 文字分類器實現
好久沒寫部落格了,最近搞了一個文字分類器,在此記錄一下:
簡介:
支援向量機,因其英文名為support vector machine,故一般簡稱SVM,通俗來講,它是一種二類分類模型,其基本模型定義為特徵空間上的間隔最大的線性分類器,其學習策略便是間隔最大化,最終可轉化為一個凸二次規劃問題的求解。
1 “機” —— Classification Machine,分類器
2 “支援向量” —— 他們就是離分界線最近的向量。也就是說分介面是靠這些向量確定的,他們支撐著分類面。名字就是這麼來的...(就是離最優分類平面最近的離散點,也可以稱為向量)
spark自帶了一個svm實現的dome,該dome直接讀取儲存libsvm所需稀疏向量的檔案,但是並未提供向量化方法,需自己呼叫HashingTF、IDF轉換為稀疏向量
程式碼:
-
/**
-
* SVM分類物件
-
* @author wangzengxu
-
*/
-
object SVM{
-
-
def main(args: Array[String]){
-
-
val Array(
-
rightPath, // 正面訓練集路徑
-
negativePath, // 負面訓練集路徑
-
waitData, // 待分類資料存放路徑
-
vectorsLocl, // 向量存放路徑
-
iterativeNum // 迭代次數
-
) = args
-
-
var sparkconf = new SparkConf().setAppName("wzx_svm_classificationsV2")
-
var sc = new SparkContext(sparkconf)
-
-
sc.addJar("/usr/wzx/spark/svm/SVM_WZX_lib/IKAnalyzer2012_u6.jar");
-
sc.addJar("/usr/wzx/spark/svm/SVM_WZX_lib/lucene-analyzers-common-4.3.0.jar");
-
sc.addJar("/usr/wzx/spark/svm/SVM_WZX_lib/lucene-core-4.3.0.jar");
-
sc.addJar("/usr/wzx/spark/svm/SVM_WZX_lib/lucene-queryparser-4.3.0.jar");
-
-
val train_vectors_local = vectorsLocl+"/train-"+DateUtils.getNowDate() //訓練向量存放目錄
-
val wait_vectors_local = vectorsLocl+"/wait-"+DateUtils.getNowDate() //待分向量存放目錄
-
-
val data_path_right = rightPath //正面訓練集文章路徑檔案 每行一篇
-
val data_path_negative = negativePath //負面訓練集文章路徑檔案 每行一篇
-
val data_path_wait = waitData //待分資料存放路徑
-
val iterative_number = iterativeNum.toInt //訓練模型迭代次數
-
-
/***********************start 分詞******************************************/
-
-
val right_data = sc.textFile(data_path_right)
-
-
val negative_data = sc.textFile(data_path_negative)
-
-
val wait_data = sc.textFile(data_path_wait)
-
-
//去停用詞
-
-
val right_text = right_data.map { x =>
-
val str = IKUtils.participle(x)
-
(1,str) //正面1
-
}
-
-
val negative_text = negative_data.map { x =>
-
val str = IKUtils.participle(x)
-
(0,str) //負面0
-
}
-
-
val wait_text = wait_data.map { x =>
-
val str = IKUtils.participle(x)
-
(2,str) //待分2
-
}
-
-
val data_all_train = right_text.++(negative_text) //訓練集RDD合併
-
-
/***********************end 分詞******************************************/
-
-
-
-
/***********************start 向量化******************************************/
-
-
val hashingTF = new HashingTF(Math.pow(2, 18).toInt)
-
-
//訓練集TF向量化
-
val documents_train = data_all_train.map{
-
case(num,str) =>
-
(num,str.split(" ").toSeq)
-
}
-
-
val tf_num_pairs_train = documents_train.map {
-
case (num,seq) =>
-
val tf = hashingTF.transform(seq)
-
(num,tf)
-
}
-
-
//待分類TF向量化
-
val documents_wait = wait_text.map{
-
case(num,str) =>
-
(num,str.split(" ").toSeq)
-
}
-
-
val tf_num_pairs_wait = documents_wait.map {
-
case (num,seq) =>
-
val tf = hashingTF.transform(seq)
-
(num,tf)
-
}
-
-
tf_num_pairs_train.cache()
-
tf_num_pairs_wait.cache()
-
-
-
//利用訓練集TF構建IDF MODEL
-
val idf = new IDF().fit(tf_num_pairs_train.values)
-
-
-
//將訓練集tf向量轉換成tf-idf向量
-
val num_idf_pairs_train = tf_num_pairs_train.mapValues(v => idf.transform(v))
-
//將待分類資料集tf向量轉換成tf-idf向量
-
val num_idf_pairs_wait = tf_num_pairs_wait.mapValues(v => idf.transform(v))
-
-
//格式轉換
-
val trainCollection = num_idf_pairs_train.map{
-
case(num,vector) =>
-
val vectorStr = num +" "+VectorToStr.change(vector)
-
vectorStr
-
}
-
-
val waitCollection = num_idf_pairs_wait.map{
-
case(num,vector) =>
-
val vectorStr = num +" "+VectorToStr.change(vector)
-
vectorStr
-
}
-
-
//落地 (後期可參看MLUtils原始碼來直接轉換為LabeledPoint避免落地)
-
trainCollection.coalesce(1).saveAsTextFile(train_vectors_local)
-
waitCollection.coalesce(1).saveAsTextFile(wait_vectors_local)
-
-
/***********************end 向量化******************************************/
-
-
/***********************start SVM模型訓練******************************************/
-
-
val vectors_train = MLUtils.loadLibSVMFile(sc,train_vectors_local).cache()
-
val vectors_wait = MLUtils.loadLibSVMFile(sc,wait_vectors_local).cache()
-
-
-
//1 新建SVM模型,並設定訓練引數
-
-
val numIterations = iterative_number //迭代次數,並非越大越好,需根據訓練集不斷調整來確定該值
-
-
val stepSize = 1
-
-
val miniBatchFraction = 1.0 //步長
-
-
val model = SVMWithSGD.train(vectors_train, numIterations, stepSize, miniBatchFraction)
-
/***********************start SVM模型訓練******************************************/
-
-
-
/***********************start 分類******************************************/
-
-
//4 對待分類資料向量進行分類
-
-
println("---------------訓練完成------------------------")
-
-
val prediction_wait = model.predict(vectors_wait.map(_.features))
-
-
println("---------------分類完成------------------------")
-
-
prediction_wait.saveAsTextFile("/user/wzx/cs1")
-
-
println("---------------儲存完成------------------------")
-
-
/***********************end 分類******************************************/
-
-
-
}
- }
-
/**
-
* IK分詞 去掉停用詞處理
-
* @author wangzengxu
-
*
-
*/
-
public class IKUtils {
-
-
-
-
public static String participle(String text){
-
StringBuffer result = new StringBuffer();
-
//讀入停用詞檔案
-
BufferedReader StopWordFileBr = new BufferedReader(new InputStreamReader(IKUtils.class.getResourceAsStream("/stopword.dic"))); //注意jar包路徑問題
-
//用來存放停用詞的集合
-
Set<String> stopWordSet = new HashSet<String>();
-
//初如化停用詞集
-
String stopWord = null;
-
try {
-
for(; (stopWord = StopWordFileBr.readLine()) != null;){
-
stopWordSet.add(stopWord);
-
}
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
//建立分詞物件
-
StringReader sr=new StringReader(text);
-
IKSegmenter ik=new IKSegmenter(sr, false);
-
Lexeme lex=null;
-
//分詞
-
try {
-
while((lex=ik.next())!=null){
-
//去除停用詞
-
if(stopWordSet.contains(lex.getLexemeText())) {
-
continue;
-
}
-
result.append(lex.getLexemeText()+" ");
-
}
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
//關閉流
-
try {
-
StopWordFileBr.close();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
return result.toString();
-
}
- }
dome中提供了評分程式碼,在模型訓練時需要根據評分來不斷調整迭代次數等來達到滿意的精度。當然,這個dome還有很多最佳化空間
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1967758/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spark MLlib NaiveBayes 貝葉斯分類器SparkAI
- 用Python實現一個SVM分類器策略Python
- 樸素貝葉斯/SVM文字分類文字分類
- 學習SVM(一) SVM模型訓練與分類的OpenCV實現模型OpenCV
- python中的scikit-learn庫來實現SVM分類器。Python
- Spark機器學習實戰 (十一) - 文字情感分類專案實戰Spark機器學習
- opencv svm分類OpenCV
- 『sklearn學習』不同的 SVM 分類器
- 使用sklearn實現svm--用於機械故障分類
- opencv SVM分類DemoOpenCV
- SVM多分類器的實現(Opencv3,C++)OpenCVC++
- 貝葉斯實現文字分類C++實現文字分類C++
- SVM分類器演算法總結&應用演算法
- Bert文字分類實踐(一):實現一個簡單的分類模型文字分類模型
- Pytorch實現分類器PyTorch
- SVM實現多分類的三種方案
- 教程 | 用Scikit-Learn實現多類別文字分類文字分類
- 從Spark MLlib到美圖機器學習框架實踐Spark機器學習框架
- CNN+pytorch實現文字二分類CNNPyTorch
- Spark MLlib FPGrowth演算法Spark演算法
- 如何透過Scikit-Learn實現多類別文字分類?文字分類
- 如何通過Scikit-Learn實現多類別文字分類?文字分類
- 利用Hog特徵和SVM分類器進行行人檢測HOG特徵
- 自己訓練SVM分類器進行HOG行人檢測HOG
- 基於spark2.0文字分詞+多分類模型Spark分詞模型
- 《機器學習實戰》基於樸素貝葉斯分類演算法構建文字分類器的Python實現機器學習演算法文字分類Python
- opencv中的SVM影像分類(二)OpenCV
- opencv中的SVM影像分類(一)OpenCV
- 【NLP】TensorFlow實現CNN用於文字分類(譯)CNN文字分類
- AI開源專案 - Spark MLlibAISpark
- python ubuntu人臉識別 -1 SVM binary 分類器PythonUbuntu
- 圖卷積實戰——文字分類卷積文字分類
- 【NLP】TensorFlow實現CNN用於中文文字分類CNN文字分類
- 分類演算法-支援向量機 SVM演算法
- 機器學習庫Spark MLlib簡介與教程機器學習Spark
- Spark MLlib學習(1)--基本統計Spark
- Spark MLlib 核心基礎:向量 And 矩陣Spark矩陣
- Spark Multilayer perceptron classifier (MLPC)多層感知器分類器Spark