資料分析:分類問題和預測--KNN演算法
阿新 • • 發佈:2018-12-12
資料型別可以有:數字,分類變數,二進位制,email,微博,使用者資料,json,地理位置,感測器資料等。資料定量或者定性的屬性值,比如身高,體重,年齡,性別,學科成績等。
演算法簡介:
- 分類(classification):給定一些屬性標籤,預測它們的一些屬性。比如給定一些學生的初一初二的成績,預測初三時的成績。或者給定一些學生以往的成績,預測其是否能夠進入一本線等。(根據以往見過的例子,對新的資料進行預測)演算法包括KNN/決策樹/神經網路/支援向量機等,均屬於監督學習。應用範圍廣泛,比如醫學上的診斷(患者是否得了某種疾病)。資料分為兩部分,一部分做訓練集生成模型,一部分做測試集來校驗模型。注意錯誤的代價/成本是不同的,將一個沒病的人誤診為病人和將一個有病的人誤診為健康,是兩種完全不同的錯誤。差異分析(LiftAnalysis)
- KNN K近鄰演算法
kNN(k-最近鄰)方法通常用於一個更復雜分類演算法的一部分。是分類資料最簡單最有效的演算法,是基於例項的學習,須有大量的資料集;無法給出任何資料的基礎結構資訊,無法知曉平均例項樣本和典型例項樣本具有什麼特徵。例如,我們可以用它的估計值做為一個物件的特徵,可應用於手寫識別。但它無法持久化分類器(無法儲存)。
KNN示例:鳶尾花分類問題。
from sklearn import datasets #引入資料來源 from sklearn.model_selection import train_test_split #引入模型選擇器,構建訓練模型和測試模型 from sklearn.neighbors import KNeighborsClassifier #引入K近鄰(KNN)演算法 from sklearn.model_selection import cross_val_score #引入評價函式 iris = datasets.load_iris() #獲得iris資料 featureIris = iris.feature_names #獲得iris資料的特徵 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] iris_Data = iris.data #獲得ndarray型別的 iris的所有資料值(數值) iris_Value = iris.target #獲得ndarray型別的 iris的所有分類的值(0 1 2) iris_Name = iris.target_names #獲得iris資料分類的名稱 ['setosa' 'versicolor' 'virginica'] x_train, x_test, y_train, y_test = train_test_split(iris_Data, iris_Value,test_size=0.3) # 由模型選擇器構建,第一引數是資料,第二引數是結果,測試的比例是0.3,也就是70%訓練,30%的資料用來測試 # 訓練資料 測試資料 結果訓練分類值 測試分類值 knn = KNeighborsClassifier(n_neighbors=4) # 定義knn演算法器 多次測試,n_neighbor=4準確率為95-97 knn.fit(x_train, y_train) # 將資料訓練集 和 結果訓練集 放入knn演算法訓練 result = knn.predict(x_test) # 測試集的測試結果 print('knn分類器的測試結果:',result) knnX = KNeighborsClassifier(n_neighbors=5) knnX.fit(iris_Data, iris_Value) print('knnX分類器預測這個結果:',knnX.predict([[3, 5, 4, 2]])) # 預測這個結果 print('knn分類器預測這一組結果:',knn.predict([[3, 5, 4, 2], [5, 4, 3, 2]])) # 預測一組結果 print('knn分類器的得分',knn.score(iris_Data,iris_Value)) scores = cross_val_score(knnX,iris_Data,iris_Value,cv=5,scoring='accuracy') #分批評價精確度 結果[0.96666667 1. 0.93333333 0.96666667 1. ] print('knnX分類器的分批測試精度:',scores)
Knn演算法器的predict方法,可用於直接進行預測。那麼我們怎麼評價KnnX這種分類器好還是不好呢?可以用精確度來測試。上面部分,我們可以理解為將資料切分為5塊,每塊都測試精度,評價方式用準確度的方式。這種驗證方式,被稱為交叉驗證。
【練習】那麼如果遇到普通的Excel表格,如何使用KNN進行預測呢?
學堂線上有一個這樣的表格,要求看其他特徵對性別的區分度。
# -*- coding: utf-8 -*- import pandas as pd from sklearn.model_selection import train_test_split #引入模型選擇器,構建訓練模型和測試模型 from sklearn.neighbors import KNeighborsClassifier #引入K近鄰(KNN)演算法 from sklearn.model_selection import cross_val_score #引入評價函式 dataPath = '學堂性別.xls' dataTestAll = pd.DataFrame(pd.read_excel(dataPath)) #讀取xls檔案,並轉化為dataframe dataTest = dataTestAll.drop(['編號','性別'],axis=1) #刪除編號和性別列,因為編號在分析過程中無意義,性別是需要分析的結果列 data_Train = dataTest.values[0:,1:] #獲取除了特徵(屬性)之外的dataframe的所有資料 data_values = dataTestAll['性別'].values[0:,] #獲取身高列的全部資料 x_train, x_test, y_train, y_test = train_test_split(data_Train, data_values,test_size=0.3) # 由模型選擇器構建,第一引數是資料,第二引數是結果,測試的比例是0.3 knn = KNeighborsClassifier(n_neighbors=8) # 定義knn演算法器 多次測試,n_neighbor=8準確率為97-98 knn.fit(x_train, y_train) # 將資料訓練集 和 結果訓練集 放入knn演算法訓練 result = knn.predict(x_test) # 測試集的測試結果 print('KNN得分:',knn.score(data_Train,data_values)) scores = cross_val_score(knn,data_Train,data_values,cv=5,scoring='accuracy') print('KNN評價:',scores) #分5批評價精確度,評價指標是accuracy準確度 結果[0.97979798 0.96938776 0.97938144 0.96907216 0.96907216]