1. 程式人生 > >資料分析:分類問題和預測--KNN演算法

資料分析:分類問題和預測--KNN演算法

資料型別可以有:數字,分類變數,二進位制,email,微博,使用者資料,json,地理位置,感測器資料等。資料定量或者定性的屬性值,比如身高,體重,年齡,性別,學科成績等。

演算法簡介:

  1. 分類(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]