weka和matlab完成完整分类实验
本文
本文簡單介紹數據集介紹、weka的使用、weka與LIBSVM、matlab與LIBSVM以及分類的若干細節問題。
1. 數據集介紹
打開網址UCI數據集,如下圖。?
?
從右下角可以看到Iris這個數據集,這是使用最多的數據集,目前下載量超過了82萬。
打開之后跳轉到這個數據集的詳細信息,如下圖。?
?
下面的表格具有如下信息?
- 數據是多變量的?
- 數據用實數表示?
- 這是個分類問題?
- 一共有150條數據?
- 每條數據有四種屬性?
- 所有數據都沒有缺失?
- 這是個關于生活的分類問題,是鳶尾花的分類
從表格下面可以得到更多關于這個數據集的信息,比如數據集的來源、數據集的介紹、數據集中數據的含義以及使用該數據集的論文。
從數據的含義可以看出每條數據都有四種屬性,分別是花萼的長度、花萼的寬度、花瓣的長度和花瓣的寬度,單位是厘米。
這是個三分類問題,表示Setosa、VersiColour和Virginica這三種鳶尾花,每種花有50條數據,一共150條數據。
點擊圖2中的Data Folder,如下圖。?
?
下載其中的iris.data和iris.names。
打開其中的iris.data,如下圖。?
2. 數據處理
下載安裝weka,首先檢測電腦是否安裝java運行時環境jre,在windows操作系統下打開cmd,輸入java -version,如果已安裝選擇不帶jre的weka,否則選擇帶jre的weka。
打開后首頁如下圖。?
點擊Explorer,再點擊open file,打開iris.data,顯示如下圖的錯誤。?
這需要修改.data格式為.arff格式,在iris.data最前面添加如下內容。
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@RELATION</span> iris<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ATTRIBUTE</span> sepallength <span class="hljs-constant" style="box-sizing: border-box;">REAL</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ATTRIBUTE</span> sepalwidth <span class="hljs-constant" style="box-sizing: border-box;">REAL</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ATTRIBUTE</span> petallength <span class="hljs-constant" style="box-sizing: border-box;">REAL</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ATTRIBUTE</span> petalwidth <span class="hljs-constant" style="box-sizing: border-box;">REAL</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ATTRIBUTE</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> {<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Iris</span>-<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">setosa</span>,<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Iris</span>-<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">versicolor</span>,<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Iris</span>-<span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">virginica</span>}</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@DATA</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>并且將.data的后綴名強制改成.arff。
從weka中打開iris.arff,如下圖。?
關于weka每一個按鈕的作用,每一個區域的含義參考使用weka進行數據挖掘這篇帖子,介紹的非常詳細。
點擊最上方的Classify按鈕,選擇Logistic(邏輯回歸)分類方法,在Test options中選擇Percentage split,66%。這樣weka自動將大約2/3的數據作為訓練集,大約1/3的數據作為測試集,采用邏輯回歸作為分類方法,結果如下圖。?
另外也可以選擇Cross-validation,Folds設置為10,這是10-fold的交叉驗證,首先隨機將所有數據隨機分成10份,將其中9份作為訓練集,另外1份作為測試集,按照邏輯回歸進行10次分類實驗,最終保證每個數據都能作為測試集并且僅有一次,將10次分類結果綜合起來得到最終的分類結果,如下圖,顯示了分類結果中最重要的部分。?
?
- Correctly Classified Instances表示分類正確率?
- Incorrectly Classified Instances表示分類錯誤率?
- TP Rate是True Positive Rate的縮寫,表示本來是正樣本,結果也被分類成正樣本的比例?
- FP Rate是False Positive Rate的縮寫,表示本來是負樣本,結果卻被分類成了正樣本的比例?
- Precision表示查準率,公式為Precision =?TPTP+FP,含義是被分類為正樣本中真正的正樣本的比例?
- Recall表示查全率,公式為Recall =?TPTP+FN,FN Rate是False Negative Rate的縮寫,表示本來是正樣本,結果卻被分類成負樣本的比例,所以Recall的含義是真正的正樣本占整個數據集(分類正確的和錯誤的)中正樣本的比例?
- F-Measure的公式是2?P?RP+R,是很常用的判斷分類效果好壞的指標?
- 最下方有比較直觀的分類結果矩陣,斜對角上的數據表示分類正確的數量,其余表示分類錯誤的數量
3. weka+LIBSVM
在weka中,除了Logistic分類方法外,還可以選擇Libsvm這種分類方法,需要到臺灣大學林智仁教授的網站下載這個工具包。
否則會出現Problem evaluating classifier:libsvm classes not in CLASSPATH的錯誤,可以參考解決方法,實驗結果如下圖。?
4. matlab+LIBSVM
通常情況下需要調整Libsvm中-c和-g這兩個參數來獲得更好的分類效果,在weka中只能手動調整這兩個參數,這樣效率很低,所以更好的方法是在matlab中采用Libsvm的方法,參考配置流程。
配置完成后,首先另外創建一個.txt文檔,包括之前iris.data的內容,但不包括iris.arff中前面的聲明部分,另外將.txt中所有英文的分類替換成數字,這樣matlab才能處理,Iris-setosa替換成1,Iris-versicolor替換成2,Iris-virginica替換成3。
用matlab來完成Iris的分類并且尋找最佳的-c和-g兩個參數,博客參考Libsvm中c&g的調整,程序參考Github,實驗結果如下。
<code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">best cost = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.0314</span> best <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">gamma</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0625</span> best accuracy = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">98.6667</span>% cost <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> weka = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">gamma</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> weka = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>從實驗結果看出,通過調整-c和-g兩個參數將weka中默認參數的分類準確率提高了2%。
5. 總結
本文介紹了數據集的來源和處理,并且用weka自帶的兩種方法進行了分類實驗,其中libsvm的方法在matlab上進行了改進,提高了2%的正確率。
總結
以上是生活随笔為你收集整理的weka和matlab完成完整分类实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 中的Pandas库
- 下一篇: matlab人脸追踪,求大神帮助我这个菜