資料集介紹與劃分
資料集的劃分
機器學習一般的資料集會劃分為兩個部分:
- 訓練資料:用於訓練,構建模型
- 測試資料:在模型檢驗時使用,用於評估模型是否有效
劃分比例:
- 訓練集: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 分析
我們之前知道資料分為訓練集和測試集,但是為了讓從訓練得到模型結果更加準確。做以下處理
- 訓練集:訓練集+驗證集
- 測試集:測試集
問題:那麼這個只是對於引數得出更好的結果,那麼怎麼選擇或者調優引數呢?
3、超引數搜尋-網格搜尋(Grid Search)
通常情況下,有很多引數是需要手動指定的(如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
結果為: