這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
目錄 [−]
- Iris資料集
- kNN K近鄰演算法
- 訓練資料和預測
- 評估
- Python代碼實現
這個系列的文章是介紹如何使用Go語言來進行資料分析和機器學習。
Go機器學習的庫目前還不是很多,功能海沒有Python的豐富,希望在未來的幾年裡能有更多的功能豐富庫面試。
這篇文章利用golearn庫, 使用kNN方法來對Iris資料集進行分析。
Iris資料集
Iris資料集也稱為鳶尾花資料集,或者叫做費雪鳶尾花卉資料集或者安德森鳶尾花卉資料集。是一類多重變數分析的資料集。它最初是埃德加·安德森從加拿大加斯帕半島上的鳶尾屬花朵中提取的地理變異資料,後由羅納德·費雪作為判別分析的一個例子,運用到統計學中。
其它比較流行的資料集還有Adult,Wine,Car Evaluation等(1)。
Iris資料集包含了150個樣本,都屬於鳶尾屬下的三個亞屬,分別是山鳶尾(setosa)、變色鳶尾(versicolor)和維吉尼亞鳶尾(virginica)。四個特徵被用作樣本的定量分析,它們分別是花萼和花瓣的長度和寬度。基於這四個特徵的集合,費雪發展了一個線性判別分析以確定其屬種。
下面是這三種鳶尾的花,非常的漂亮:
是鳶尾花資料集的散布圖, 第一個種類與另外兩個種類是線性可分離的,後兩個種類是非線性可分離的:
以上內容主要參考維基百科和百度百科關於Iris資料集的介紹。
這個資料集在網上很容易搜到,也可以在 golearn 項目中下載。
kNN K近鄰演算法
分類演算法是資料採礦分類技術中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。
kNN演算法的核心思想是如果一個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。該方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 kNN方法在類別決策時,只與極少量的相鄰樣本有關。由於kNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,kNN方法較其他方法更為適合。
簡單說, 如果你住在高檔小區,周圍都是"高端人口", 那麼可以判定你就是"高端人口", 然後就不會被......
k
代表最近的k
個鄰居。
演算法更詳細的介紹可以參考:百度百科和維基百科。
訓練資料和預測
下面就讓我們看看 golearn使用kNN演算法分析鳶尾花資料集的例子。
12345678910111213141516171819202122232425262728293031323334353637 |
package mainimport ("fmt""github.com/sjwhitworth/golearn/base""github.com/sjwhitworth/golearn/evaluation""github.com/sjwhitworth/golearn/knn")func main() {rawData, err := base.ParseCSVToInstances("../datasets/iris_headers.csv", true)if err != nil {panic(err)}//Initialises a new KNN classifiercls := knn.NewKnnClassifier("euclidean", "linear", 2)//Do a training-test splittrainData, testData := base.InstancesTrainTestSplit(rawData, 0.50)cls.Fit(trainData)//Calculates the Euclidean distance and returns the most popular labelpredictions, err := cls.Predict(testData)if err != nil {panic(err)}fmt.Println(predictions)// Prints precision/recall metricsconfusionMat, err := evaluation.GetConfusionMatrix(testData, predictions)if err != nil {panic(fmt.Sprintf("Unable to get confusion matrix: %s", err.Error()))}fmt.Println(evaluation.GetSummary(confusionMat))} |
#12 行載入鳶尾花資料集, base提供了讀取CSV文字檔的方法。
#18 行建立一個kNN分類器, 距離的計算使用歐幾裡德方法,此外還支援manhattan
、cosine
距離計算方法。第二個參數支援linear
和kdtree
。
#18 還指定了K
為2。
#21 將鳶尾花資料集按照參數分成兩份,它使用隨機數和這個參數比較,所以分成的資料的結果大致是這個比例。一部分用於訓練資料,一部分用於測試。接著#22開始訓練資料。
#25 使用測試預測資料,並將預測結果列印出來。
#32 ~ #36 是評估預測模型,並將評估結果輸出。
評估
首先看一下評估結果
12345 |
Reference ClassTrue PositivesFalse PositivesTrue NegativesPrecisionRecallF1 Score---------------------------------------------------------------------------------Iris-setosa300581.00001.00001.0000Iris-virginica271580.96430.93100.9474Iris-versicolor282570.93330.96550.9492 |
這裡有幾個概念需要說明一下。
- ConfusionMatrix: 混淆矩陣,它描繪樣本資料的真實屬性與識別結果類型之間的關係,是評價分類器效能的一種常用方法,用於有監督學習。
- True Positives: 真正,TP, 被模型預測為正的正樣本;可以稱作判斷為真的正確率
- False Positives: 假正,FP,誤判, 被模型預測為正的負樣本;可以稱作誤判率
- True Negatives: 真負,TN, 被模型預測為負的負樣本 ;可以稱作判斷為假的正確率
- False Negatives: 假負,FN,漏報, 被模型預測為負的正樣本;可以稱作漏報率
- Precision: 精確率, 正確預測正負的個數/總個數,它表示的是預測為正的樣本中有多少是真正的正樣本。 $$P = \frac{TP}{TP+FP}$$,
- Recall: 召回率,它表示的是樣本中的正例有多少被預測正確了, $$R = TPR = \frac{TP}{TP+FN}$$
- F1 Score: 為了能夠評價不同演算法的優劣,在Precision和Recall的基礎上提出了F1值的概念,來對Precision和Recall進行整體評價。F1的定義如下:
F1值 = 正確率 * 召回率 * 2 / (正確率 + 召回率)
Python代碼實現
使用sklearn
很容易實現上面的邏輯。
123456789101112131415161718192021 |
from sklearn import neighbors, datasets, metricsfrom sklearn.model_selection import train_test_split # import some data to play withIRIS = datasets.load_iris() # prepare dataX_train, X_test, Y_train, Y_test = train_test_split(IRIS.data, IRIS.target, test_size=0.5, random_state=0)# we create an instance of Neighbours Classifier and fit the data.knn = neighbors.KNeighborsClassifier(n_neighbors=2, weights='distance')knn.fit(X_train, Y_train)# make predictionpredicted = knn.predict(X_test) # evaluateprint(metrics.classification_report(Y_test, predicted))print(metrics.confusion_matrix(Y_test, predicted)) |