機器學習3-分類算法

數據集介紹與劃分

數據集的劃分

機器學習通常的數據集會劃分爲兩個部分:算法

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

劃分比例:api

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

API

  • sklearn.model_selection.train_test_split(arrays, *options)
    • x 數據集的特徵值
    • y 數據集的標籤值
    • test_size 測試集的大小,通常爲float
    • random_state 隨機數種子,不一樣的種子會形成不一樣的隨機採樣結果。相同的種子採樣結果相同。
    • return ,測試集特徵訓練集特徵值值,訓練標籤,測試標籤(默認隨機取)

sklearn轉換器和估計器

轉換器和估計器

轉換器

想一下以前作的特徵工程的步驟?數組

  • 一、實例化 (實例化的是一個轉換器類(Transformer))
  • 二、調用fit_transform(對於文檔創建分類詞頻矩陣,不能同時調用)

咱們把特徵工程的接口稱之爲轉換器,其中轉換器調用有這麼幾種形式dom

  • fit_transform
  • fit
  • transform

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

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

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

估計器工做流程

 

 

 

K-近鄰算法

一、K-近鄰算法(KNN)

1.1 定義

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

1.2 距離公式

兩個樣本的距離能夠經過以下公式計算,又叫歐式距離學習

 

 

 

二、電影類型分析

假設咱們有如今幾部電影測試

其中? 號電影不知道類別,如何去預測?咱們能夠利用K近鄰算法的思想spa

 

 

 

2.1 問題

  • 若是取的最近的電影數量不同?會是什麼結果?

2.2 K-近鄰算法數據的特徵工程處理

  • 結合前面的約會對象數據,分析K-近鄰算法須要作什麼樣的處理

三、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

結果爲:code

4.3 結果分析

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

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

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

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

  • 二、性能問題?

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

五、K-近鄰總結

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

模型選擇與調優

一、爲何須要交叉驗證

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

二、什麼是交叉驗證(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

結果爲:

相關文章
相關標籤/搜索