Python機器學習應用之監督學習-人體運動狀態信息評級

背景介紹

  • 可穿戴式設備的流行,讓我們可以更便利地使用傳感器獲取人體的各項數據,甚至生理數據。
  • 當傳感器採集到大量數據後,我們就可以通過對數據進行分析和建模,通過各項特徵的數值進行用戶狀態的判斷,根據用戶所處的狀態提供給用戶更加精準、便利的服務。

數據介紹

  • 我們現在收集了來自A,B,C,D,E 5位用戶的可穿戴設備上的傳感器數據,每位用戶的數據集包含一個特徵文件(a.feature)和一個標籤文件(a.label)。
  • 特徵文件中每一行對應一個時刻的所有傳感器數值,標籤文件中每一行記錄了和特徵文件中對應時刻的標記過的用戶姿態,兩個文件的行數相同,相同行之間互相對應。

數據介紹- feature

我們的特徵文件共包含41列特徵,數據內容。
這裏寫圖片描述
特徵文件的各項特徵,如下表所示:
這裏寫圖片描述

數據介紹- label

標籤文件內容如圖所示,每一個代表與特徵文件中對應行的用戶姿態類別。總共有0-24種共25種身體姿態,如,無活動狀態、坐態、跑態等。標籤文件作爲訓練集的標準參考準則,可以進行特徵的監督學習。
這裏寫圖片描述

任務介紹

  • 假設現在出現了一個新用戶,但我們只有傳感器採集的數據,那麼該如何得到這個新用戶的姿態呢?
  • 又或者對同一個用戶如果傳感器採集了新的數據,怎麼樣根據新的數據判斷當前用戶處於什麼樣的姿態呢?
  • 在明確這是一個分類問題的情況下,我們可以選定某種分類模型(或者說是算法),通過使用訓練數據進行模型學習,然後對每個測試樣本給出對應的分類結果。
  • 機器學習的分類算法衆多,在接下來的學習中我們將會詳細介紹經典的分類算法,如K近鄰、決策樹和樸素貝葉斯的原理和實現。

K近鄰分類器(KNN)

原理:

通過計算待分類數據點,與已有數據集中的所有數據點的距離。取距離最小的前k個點,根據“少數服從多數”的原則,將這個數據點劃分爲出現次數最多的那個類別。
這裏寫圖片描述

sklearn中的KNN

在sklearn庫中,可以使用sklearn.neighbors.KNeighborsClassifier創建一個K近鄰分類器,主要參數有:

  • n_neighbors:用於指定分類器中K的大小(默認值爲5)
  • weights:設置選中的K個點對分類結果影響的權值(默認值爲平均權值“uniform”,可以選擇“distance”代表越近的點權重越高,或者傳入自己編寫的以距離爲參數的權重計算函數)。

KNN的使用

  • 使用import語句導入K近鄰分類器:
from sklearn.neighbors import KNeighborsClassifier
  • 創建一組數據X和它對應的標籤y:
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
  • 參數n_neighbors設置爲3,即使用最近的3個近鄰作爲分類的依據,其他參數保持默認值,並將創建好的實例賦給變量neigh:
neigh = KNeighborsClassifier(n_neighbors=3)
  • 調用fit()函數,將訓練數據X和標籤y送入分類器進行學習:
neigh.fit(X, y)
  • 調用predict()函數,對未知分類樣本[1.1]分類,可以直接將需要分類的數據構造爲數組形式作爲參數傳入,得到分類標籤作爲返回值:
print(neigh.predict([[1.1]]))
>>> [0]

KNN的使用經驗

在實際使用時,我們可以使用所有訓練數據構成特徵X和標籤y,使用fit()函數進行訓練。在正式分類時,通過一次性構造測試集或者一個一個輸入樣本的方式,得到樣本對應的分類結果。有關K的取值:

  • 如果較大,相當於使用較大鄰域中的訓練實例進行預測,可以減小估計的誤差,但是距離較遠的樣本也會對預測起作用,導致預測錯誤。
  • 相反地,如果K較小,相當於使用較小地鄰域進行預測,如果鄰居恰好是噪聲點,會導致過擬合。
  • 一般情況下,K會傾向於選取較小的值,並使用交叉驗證法選取最優K值。

決策樹

原理:

決策樹是一種樹形結構的分類器,通過順序詢問分類點的屬性決定分類點最終的類別。通常根據特徵的信息增益或其他指標,構建一顆決策樹。在分類時,只需要按照決策樹中的節點依次進行判斷,即可得到樣本所屬類別。
這裏寫圖片描述

  • 決策樹本質上是尋找一種對特徵空間上的劃分,旨在構建一個訓練數據擬合的好,並且複雜度小的決策樹。
  • 實際使用中,需要根據數據情況,調整DecisionTreeClassifier類中傳入的參數,比如選擇合適的criterion,設置隨機變量等。

sklearn中的決策樹

在sklearn庫中,可以使用sklearn.tree.DecisionTreeClassifier創建一個決策樹用於分類,其主要參數有:

  • criterion:用於選擇屬性的準則,可以傳入“gini”代表基尼係數,或者“entropy”代表信息增益。
  • max_features:表示在決策樹節點進行分裂時,從多少個特徵中選擇最優特徵。可以設定固定數目、百分比或其他標準。默認值時使用所有特徵個數。

決策樹的使用

  • 首先,導入sklearn內嵌的鳶尾花數據集
from sklearn.datasets import load_iris
  • 使用import語句導入決策樹分類器,同時導入計算交叉驗證值的函數cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
  • 使用默認參數,創建一顆基於基尼係數的決策樹,並將該決策樹分類器賦值給變量clf
clf = DecisionTreeClassifier()
  • 將鳶尾花數據賦值給變量iris
iris = load_iris()
  • 這裏我們將決策樹分類器做爲待評估的模型,iris.data鳶尾花數據做爲特徵,iris.target鳶尾花分類標籤做爲目標結果,通過設定cv=10,使用10折交叉驗證。得到最終的交叉驗證得分
cross_val_score(clf, iris.data, iris.target, cv=10)
  • 實驗結構:
[1.         0.93333333 1.         0.93333333 0.93333333 0.86666667
 0.93333333 0.93333333 1.         1.        ]

實例編寫

import pandas as pd
import numpy as np  

from sklearn.preprocessing import Imputer
from sklearn.cross_validation import train_test_split 
from sklearn.metrics import classification_report

from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB

def load_datasets(feature_paths, label_paths):
    feature = np.ndarray(shape=(0,41))
    label = np.ndarray(shape=(0,1))
    for file in feature_paths:
        df = pd.read_table(file, delimiter=',', na_values='?', header=None)
        imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
        imp.fit(df)
        df = imp.transform(df)
        feature = np.concatenate((feature, df))

    for file in label_paths:
        df = pd.read_table(file, header=None)
        label = np.concatenate((label, df))

    label = np.ravel(label)
    return feature, label

if __name__ == '__main__':
    ''' ����·�� '''
    featurePaths = ['A/A.feature','B/B.feature','C/C.feature','D/D.feature','E/E.feature']
    labelPaths = ['A/A.label','B/B.label','C/C.label','D/D.label','E/E.label']
    ''' ��������  '''
    x_train,y_train = load_datasets(featurePaths[:4],labelPaths[:4])
    x_test,y_test = load_datasets(featurePaths[4:],labelPaths[4:])
    x_train, x_, y_train, y_ = train_test_split(x_train, y_train, test_size = 0.0)

    print('Start training knn')
    knn = KNeighborsClassifier().fit(x_train, y_train)
    print('Training done')
    answer_knn = knn.predict(x_test)
    print('Prediction done')

    print('Start training DT')
    dt = DecisionTreeClassifier().fit(x_train, y_train)
    print('Training done')
    answer_dt = dt.predict(x_test)
    print('Prediction done')

    print('Start training Bayes')
    gnb = GaussianNB().fit(x_train, y_train)
    print('Training done')
    answer_gnb = gnb.predict(x_test)
    print('Prediction done')

    print('\n\nThe classification report for knn:')
    print(classification_report(y_test, answer_knn))
    print('\n\nThe classification report for DT:')
    print(classification_report(y_test, answer_dt))
    print('\n\nThe classification report for Bayes:')
    print(classification_report(y_test, answer_gnb))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章