機器學習3-分類演算法

清風紫雪發表於2021-01-18

資料集介紹與劃分

資料集的劃分

機器學習一般的資料集會劃分為兩個部分:

  • 訓練資料:用於訓練,構建模型
  • 測試資料:在模型檢驗時使用,用於評估模型是否有效

劃分比例:

  • 訓練集:70% 80% 75%
  • 測試集:30% 20% 30%

API

  • sklearn.model_selection.train_test_split(arrays, *options)
    • x 資料集的特徵值
    • y 資料集的標籤值
    • test_size 測試集的大小,一般為float
    • random_state 隨機數種子,不同的種子會造成不同的隨機取樣結果。相同的種子取樣結果相同。
    • return ,測試集特徵訓練集特徵值值,訓練標籤,測試標籤(預設隨機取)

sklearn轉換器和估計器

轉換器和估計器

轉換器

想一下之前做的特徵工程的步驟?

  • 1、例項化 (例項化的是一個轉換器類(Transformer))
  • 2、呼叫fit_transform(對於文件建立分類詞頻矩陣,不能同時呼叫)

我們把特徵工程的介面稱之為轉換器,其中轉換器呼叫有這麼幾種形式

  • fit_transform
  • fit
  • transform

估計器(sklearn機器學習演算法的實現)

在sklearn中,估計器(estimator)是一個重要的角色,是一類實現了演算法的API

  • 1、用於分類的估計器:
    • sklearn.neighbors k-近鄰演算法
    • sklearn.naive_bayes 貝葉斯
    • sklearn.linear_model.LogisticRegression 邏輯迴歸
    • sklearn.tree 決策樹與隨機森林
  • 2、用於迴歸的估計器:
    • sklearn.linear_model.LinearRegression 線性迴歸
    • sklearn.linear_model.Ridge 嶺迴歸
  • 3、用於無監督學習的估計器
    • sklearn.cluster.KMeans 聚類

估計器工作流程

 

 

 

K-近鄰演算法

1、K-近鄰演算法(KNN)

1.1 定義

如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

1.2 距離公式

兩個樣本的距離可以通過如下公式計算,又叫歐式距離

 

 

 

2、電影型別分析

假設我們有現在幾部電影

其中? 號電影不知道類別,如何去預測?我們可以利用K近鄰演算法的思想

 

 

 

2.1 問題

  • 如果取的最近的電影數量不一樣?會是什麼結果?

2.2 K-近鄰演算法資料的特徵工程處理

  • 結合前面的約會物件資料,分析K-近鄰演算法需要做什麼樣的處理

3、K-近鄰演算法API

  • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
    • n_neighbors:int,可選(預設= 5),k_neighbors查詢預設使用的鄰居數
    • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可選用於計算最近鄰居的演算法:‘ball_tree’將會使用 BallTree,‘kd_tree’將使用 KDTree。‘auto’將嘗試根據傳遞給fit方法的值來決定最合適的演算法。 (不同實現方式影響效率)
def knn_iris():
    """
    KNN演算法對鳶尾花進行分類
    """
    #獲取資料
    iris=load_iris()
    #劃分資料集
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=3)
    #特徵工程:標準化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    #KNN演算法預估器
    estimator=KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train,y_train)

    #模型評估
    #方法1:直接比對真實值和預測值
    y_predict=estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    print("直接比對真實值和預測值:\n",y_test==y_predict)
    #方法2:計算準確率
    score=estimator.score(x_test,y_test)
    print("準確率為:\n",score)

    return None

結果為:

4.3 結果分析

準確率: 分類演算法的評估之一

  • 1、k值取多大?有什麼影響?

k值取很小:容易受到異常點的影響

k值取很大:受到樣本均衡的問題

  • 2、效能問題?

距離計算上面,時間複雜度高

5、K-近鄰總結

  • 優點:
    • 簡單,易於理解,易於實現,無需訓練
  • 缺點:使用場景:小資料場景,幾千~幾萬樣本,具體場景具體業務去測試
    • 懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大
    • 必須指定K值,K值選擇不當則分類精度不能保證

模型選擇與調優

1、為什麼需要交叉驗證

交叉驗證目的:為了讓被評估的模型更加準確可信

2、什麼是交叉驗證(cross validation)

交叉驗證:將拿到的訓練資料,分為訓練和驗證集。以下圖為例:將資料分成5份,其中一份作為驗證集。然後經過5次(組)的測試,每次都更換不同的驗證集。即得到5組模型的結果,取平均值作為最終結果。又稱5折交叉驗證。

2.1 分析

我們之前知道資料分為訓練集和測試集,但是為了讓從訓練得到模型結果更加準確。做以下處理

  • 訓練集:訓練集+驗證集
  • 測試集:測試集

 

 

問題:那麼這個只是對於引數得出更好的結果,那麼怎麼選擇或者調優引數呢?

通常情況下,有很多引數是需要手動指定的(如k-近鄰演算法中的K值),這種叫超引數。但是手動過程繁雜,所以需要對模型預設幾種超引數組合。每組超引數都採用交叉驗證來進行評估。最後選出最優引數組合建立模型。

 

3.1 模型選擇與調優

  • sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
    • 對估計器的指定引數值進行詳盡搜尋
    • estimator:估計器物件
    • param_grid:估計器引數(dict){“n_neighbors”:[1,3,5]}
    • cv:指定幾折交叉驗證
    • fit:輸入訓練資料
    • score:準確率
    • 結果分析:
      • bestscore:在交叉驗證中驗證的最好結果_
      • bestestimator:最好的引數模型
      • cvresults:每次交叉驗證後的驗證集準確率結果和訓練集準確率結果

 

def knn_iris_gscv():
    """
    KNN演算法對鳶尾花進行分類,新增網格搜尋和交叉驗證
    """
    #獲取資料
    iris=load_iris()
    #劃分資料集
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=36)
    #特徵工程:標準化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    #KNN演算法預估器
    estimator=KNeighborsClassifier()

    #加上網格搜尋與交叉驗證
    param_dict={"n_neighbors":[1,3,5,7,9,11]}
    estimator=GridSearchCV(estimator,param_grid=param_dict,cv=10)

    estimator.fit(x_train,y_train)

    #模型評估
    #方法1:直接比對真實值和預測值
    y_predict=estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    print("直接比對真實值和預測值:\n",y_test==y_predict)
    #方法2:計算準確率
    score=estimator.score(x_test,y_test)
    print("準確率為:\n",score)

    print("最佳引數:\n", estimator.best_params_)
    print("最佳結果:\n", estimator.best_score_)
    print("最佳估計器:\n", estimator.best_estimator_)
    print("每次交叉驗證的結果為:\n", estimator.cv_results_)

    return None

結果為:

相關文章