監督學習


1 監督學習

  利用一組帶標簽的數據, 學習從輸入到輸出的映射, 然后將這種映射關系應用到未知數據, 達到分類或者回歸的目的

  (1) 分類: 當輸出是離散的, 學習任務為分類任務

    

    輸入: 一組有標簽的訓練數據(也叫觀察和評估), 標簽表明了這些數據(觀察)的所屬類別, 圖中"貓"和"狗"就是標簽

    輸出: 分類模型根據這些訓練數據, 訓練自己的模型參數, 學習出一個適合這組數據的分類器, 當有新數據(非訓練數據)需要進行類別判斷, 就可以將這組數據作為輸入送給學習好的分類器進行判斷(得到標簽)

    訓練集: 訓練模型已經標注的數據, 用來建立模型發現規律

    測試集: 已標注的數據, 只不過把標注隱藏了, 再送給訓練好的模型, 比對結果與原來的標注, 評判該模型的學習能力  

    一般來說, 獲得了一組標注好的數據, 70%當做訓練集, 30%當做測試集, 另外還有交叉驗證法, 自助法來評估學習模型

    評價標准

      1) 准確率

        所有預測對的

        把正類預測成正類(TP)

        把負類預測成負類(TN)

        准確率 = (TP+TN)/總數量

      2) 精確率

        以二分類為例

        預測為正的樣本是真的正樣本

        把正類預測為正類(TP)

        把負類預測為正類(FP)

        

      3) 召回率

        樣本中的正比例有多少被預測正確

        把正類預測成正類(TP)

        把正類預測成負類(FN)

        

    sklearn提供的分類函數有:

      K近鄰(knn), 朴素貝葉斯(naivebayes), 支持向量機(svm), 決策樹(decision tree), 神經網絡模型(Neural networks)

  (2) 回歸: 當輸出是連續的, 學習任務是回歸任務

    通過回歸, 可以了解兩個或多個變數是否相關, 方向及其強度, 可以建立數學模型來觀察特定變數以及預測特定的變數

    回歸可以根據給出的自變量估計因變量的條件期望

    

    sklearn提供的回歸函數放在了兩個子模塊

      sklearn.linear_model, 線性函數: 普通線性回歸函數(LinearRegression), 嶺回歸(Ridge), Lasso

      sklearn.preprocessing, 非線性回歸: 多項式回歸(PolynomialFeatures)

    回歸應用

      對一些帶有時序信息的數據進行預測或者趨勢擬合, 在金融以及其他涉及時間序列分析的領域

      股票趨勢預測

      交通流量預測

2 分類

2.1 人體運動信息評級實例

  可穿戴設備可以獲取人體各項數據, 通過這些數據可以進行分析和建模, 可以對用戶狀況進行判斷

  在數據源中有一個特征文件*.feature, 一個標簽文件*.label

  特征文件包含41列特征 

  

  

  溫度: 靜止時人體一般維持在36.5度上下, 當溫度高於37度時, 可能是進行短時間的劇烈運動

   一型/二型三軸加速區: 這是兩個型號的加速度傳感器, 兩個加速度傳感器可以相互印證來保證數據的完整性准確性, 獲得的數據是在x,y,z三個軸上的加速度, 如z軸上加速度劇增, 很有可能就是人體向上跳

  陀螺儀: 獲得用戶當前身體的角度, 可以判斷姿態

  磁場: 檢測用戶周圍磁場強度和數值大小, 可以幫助我們理解用戶所在的環境, 一般地, 人在一個辦公場所, 用戶座位的周圍的磁場大體上是固定的, 因此當磁場發生改變時, 可以推測用戶的位置和場景發生了變化

  標簽文件對應於特征文件的每一行, 總共有25中姿態

2.2 基本分類模型

  (1) k近鄰分類器(KNN)

    原有已經分類好的點, 現加入新的點, 判斷其類別就是查看所有點與它的距離, 取前K個, 這K個點哪一部分的的點的數量多, 這個新加入的點就屬於哪一部分

    

    創建knn分類器

      sklearn.neighbors.KNeighborsClassifier()

      n_neighbors: 用於指定分類器中K的大小, 默認為5

      weights: 設置K個點對分類結果影響的權重, 默認平均權重uniform, 距離權重(越近權重越高)distance, 或者是自定義計算函數

      algorithm: 尋找臨近點的方法, 默認為auto(根據數據自動選擇), ball_tree, kd_tree, brute等

    使用kkn

X = [[0],[1],[2],[3]] y = [0,0,1,1] from sklearn.neighbors import KNeighborsClassifier neight = KNeighborsClassifier(n_neighbors=3) neight.fit(X,y) Out[5]: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=3, p=2, weights='uniform') neight.predict([[1.1]]) Out[6]: array([0])

 

      其中X是數據, y是標簽, 使用predict()來預測新的點, 檢查前3個點, 應該是[1],[2],[0]主要是標簽0的數據點, 因此[1.1]被划分到標簽0中    

    關於k的選取

      較大的k值, 由於鄰域較大, 有可能和他就近的分類點不多, 所以可能結果出錯

      較小的k值, 鄰域較小, 有可能鄰居是噪聲點, 導致過擬合

      一般來說, 選擇較小的k, 然后使用交叉驗證選取最優的k值

  (2) 決策樹

    一般是詢問分類點的屬性決定走向的分支, 不斷查詢獲得最終的分類

    無房產單身年收入55k的決策效果

    

    創建決策樹

      sklearn.tree.DecisionTree.Classifier()

      criterion: 選擇屬性的准則, gini(基尼系數), entropy(信息增益)

      max_features: 從多少個特征中選擇最優特征, 默認是所有特征個數, 還可以是固定數目, 百分比等

    決策樹的使用

from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import cross_val_score clf = DecisionTreeClassifier() iris = load_iris() cross_val_score(clf, iris.data, iris.target, cv=10) Out[12]: array([ 1.        ,  0.93333333,  1.        ,  0.93333333,  0.93333333, 0.86666667,  0.93333333,  1.        ,  1.        ,  1.        ])

      cross_val_score是一個計算交叉驗證值的函數

      iris.data作為數據集, iris.target作為目標結果

      cv=10表示使用10折交叉驗證

      同樣可以使用 clf.fit(X,y)來生成, clsf.predict(x)進行函數預測

  (3) 朴素貝葉斯

    朴素貝葉斯是以貝葉斯定理為基礎的多分類的分類器

    

    sklearn實現了三個朴素貝葉斯分類器

    

    區別在於假設某一特征的所有屬於某個類別的觀測值符合特定分布, 分類問題的特征包括人的身高, 身高符合高斯分布, 這類問題適合高斯朴素貝葉斯   

     創建朴素貝葉斯

      sklearn.naive_bayes.GaussianNB()

      priors: 給定各個類別的先驗概率, 空(按訓練數據的實際情況進行統計), 給定先驗概率(訓練過程不能更改)

    朴素貝葉斯的使用

import numpy as np X = np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]]) Y = np.array([1,1,1,2,2,2]) from sklearn.naive_bayes import GaussianNB clf = GaussianNB(priors=None) clf.fit(X,Y) Out[18]: GaussianNB(priors=None) clf.predict([[-0.8,-1]]) Out[19]: array([1])

    朴素貝葉斯是典型的生成學習方法, 由訓練數據學習聯合概率分布, 並求得后驗概率分布

    朴素貝葉斯一般在小規模數據上的表現很好, 適合進行多分類任務

2.3 運動狀態程序

  程序流程:

    從特征文件和標簽文件中將所有的數據加載到內存中, 並對缺失值進行簡單的數據預處理

    創建分類器, 使用訓練集進行訓練

    測試集預測, 通過計算模型整體的准確率和召回率, 評估模型

    

  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

  導入numpy庫和pandas庫

  從sklearn庫中導入預處理模塊Imputer

  導入自動生成訓練集和測試集的模塊train_test_split

  導入預測結果評估模塊classification_report

  再導入三個算法: K近鄰分類器KNeighborsClassifier, 決策樹分類器DecisionTreeClassifier和高斯朴素貝葉斯函數GaussianNB

  2) 數據導入函數

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

  編寫數據導入函數,設置傳入兩個參數,分別是特征文件的列表feature_paths和標簽文件的列表label_paths。

  定義feature數組變量,列數量和特征維度一致為41;定義空的標簽變量,列數量與標簽維度一致為1。

  使用pandas庫的read_table函數讀取一個特征文件的內容,其中指定分隔符為逗號、缺失值為問號且文件不包含表頭行。

  使用Imputer函數,通過設定strategy參數為‘ mean’,使用平均值對缺失數據進行補全。 fit()函數用於訓練預處理器,transform()函數用於生成預處理結果。

  將預處理后的數據加入feature,依次遍歷完所有特征文件

  遵循與處理特征文件相同的思想,我們首先使用pandas庫的read_table函數讀取一個標簽文件的內容,其中指定分隔符為逗號且文件不包含表頭行。

  由於標簽文件沒有缺失值,所以直接將讀取到的新數據加入label集合,依次遍歷完所有標簽文件,得到標簽集合label。

  最后函數將特征集合feature與標簽集合label返回。

  3) 主函數的編寫

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))

  設置數據路徑feature_paths和label_paths。

  使用python的分片方法,將數據路徑中的前4個值作為訓練集,並作為參數傳入load_dataset()函數中,得到訓練集合的特征x_train,訓練集的標簽y_train。

  將最后一個值對應的數據作為測試集,送入load_dataset()函數中,得到測試集合的特征x_test,測試集的標簽y_test。

  使用train_test_split()函數,通過設置測試集比例test_size為0,將數據隨機打亂,便於后續分類器的初始化和訓練。

  使用默認參數創建K近鄰分類器,並將訓練集x_train和y_train送入fit()函數進行訓練,訓練后的分類器保存到變量knn中。

  使用測試集x_test,進行分類器預測,得到分類結果answer_knn。

  使用默認參數創建決策樹分類器dt,並將訓練集x_train和y_train送入fit()函數進行訓練。訓練后的分類器保存到變量dt中。

  使用測試集x_test,進行分類器預測,得到分類結果answer_dt。

  使用默認參數創建貝葉斯分類器,並將訓練集x_train和y_train送入fit()函數進行訓練。訓練后的分類器保存到變量gnb中。  

  使用測試集x_test,進行分類器預測,得到分類結果answer_gnb。

  使用classification_report函數對分類結果,從精確率precision、召回率recall、 f1值f1-score和支持度support四個維度進行衡量。

  分別對三個分類器的分類結果進行輸出

3 回歸

3.1 線性回歸

  線性回歸(Linear Regression)是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法。

  線性回歸利用稱為線性回歸方程的最小平方函數對一個或多個自變量和因變量之間關系進行建模。 這種函數是一個或多個稱為回歸系數的模型參數的線性組合。只有一個自變量的情況稱為簡單回歸,大於一個自變量情況的叫做多元回歸

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM